48 votes

Lier une clé tmux à plusieurs commandes

Je lance une fenêtre tmux à plusieurs volets pour surveiller plusieurs paramètres du serveur. Avec Ctrl-S, je peux ouvrir une nouvelle fenêtre avec une autre commande de surveillance.

Maintenant, je veux lier Ctrl-Q pour ouvrir un autre multipane fenêtre avec plusieurs moniteurs. Comment lier une touche à plusieurs commandes ? J'ai essayé de les enchaîner avec ; et \ ; - rien n'y fait. Merci de m'indiquer ce que je devrais utiliser à la place de ... ci-dessous.

Est-il possible, lorsque j'ouvre une nouvelle fenêtre, de suspendre les commandes d'arrière-plan qui se superposent à celle-ci ?

    tmux new-session "monitor1" \;\
            split-window -v "monitor2" \;\
            select-pane -U \;\
            split-window -v -h -p 60 "monitor3" \;\
            bind-key -n C-s new-window "monitor4" \;\
            bind-key -n C-q "..."

53voto

Nathan Long Points 30303

Todd Freed a raison, la manière "correcte" de procéder est d'utiliser \; . En quelque sorte. Mais il y a un hic.

Vous voyez, vous joignez une séquence de commandes tmux en donnant à tmux la conjonction ; . Ainsi, dans un fichier généré par tmux, vous pourriez dire

new-session "monitor1" ; split-window -v "monitor2"

si, pour une raison ou pour une autre, vous vouliez tout cela sur une seule ligne. Maintenant, vous pouvez donner cette déclaration composée d'une seule ligne à l'élément tmux à partir d'un Shell également mais les ; doit être échappé pour que le Shell l'interprète comme un autre argument de la fonction tmux . L'équivalent de ce qui précède dans le Shell est donc le suivant

$ tmux new-session "monitor1" \; split-window -v "monitor2"

De même, la fonction tmux bind-key prend une série d'arguments qui sont la commande tmux et les arguments à exécuter lorsque la touche est pressée. Si vous voulez lier C-q à la séquence ci-dessus à partir d'un fichier généré par tmux, vous diriez

bind-key -n C-q new-session "monitor1" \; split-window -v "monitor2"

Ici, nous avons échappé à la ; à partir de tmux afin que tmux ne l'interprète pas comme la fin de la chaîne de caractères. bind-key mais en tant qu'argument supplémentaire à la commande bind-key en lui demandant de former une commande composée en tant que valeur liée de l'élément C-q clé.

Que se passe-t-il lorsque nous voulons que tmux fasse cela à partir du Shell ? Un grand nombre d'échappements.

$ tmux bind-key -n C-q new-session "monitor1" \\\; split-window -v "monitor2"

Tout d'abord, nous devons échapper à la \ et les ; chacun de la Shell Le Shell transmet alors les deux caractères suivants \; comme argument à tmux . Ce dernier échappe alors à la ; de tmux, ce qui a pour effet d'assigner l'ensemble de l'instruction composée en tant que liaison de C-q .


Cela dit, si vous utilisez régulièrement une configuration tmux complexe comme celle-ci, je vous suggère de créer un fichier tmux pour la conserver :

# In split-windows.tmux:
new-session "monitor1"
split-window -v "monitor2"
bind-key -n C-s new-window "monitor4"
# ...etc...

Et puis.. :

$ tmux source split-windows.tmux  # (or even make an alias for this)

Il sera ainsi beaucoup plus facile à maintenir.

18voto

user319660 Points 111

La vraie réponse est donc : vous enchaînez les commandes avec une barre oblique inverse suivie d'un point-virgule.

bind-key C send-keys foo \; send-keys bar

Vous devriez mettre cela dans votre tmux.conf, ou le lancer à partir de l'invite " :" de tmux.

2voto

Wade Points 349

Vous pouvez le faire avec une petite solution de contournement. Tout comme la réponse suggérant l'exécution d'un script (qui traite bien votre cas), il est possible de le faire plus généralement en utilisant "run-script" et en appelant tmux lui-même en tant que commande script.

bind-key z run-shell "tmux send-keys "xyz" ; tmux clear-history; clear" 

qui enverra les clés 'xyz', la commande 'clear-history' de tmux, puis appellera le builtin Shell 'clear'.

La chaîne entière n'est qu'une séquence de commandes multiples Shell.

2voto

daniel Points 26

Tout ce qui est montré ici ne fonctionnera pas, car cette

bind q send-keys "command1" \; send-keys "command2"

exécutera immédiatement la commande2 et q ne sera lié qu'aux clés d'envoi "command1"

Voici la solution :

bind R source-file "$HOME/.tmux/reload.tmux"

Dans le fichier ~/.tmux/reload.tmux mettez plusieurs commandes comme :

source-file "$HOME/.tmux.conf" 
display-message "Configuration reloaded."

1voto

paradroid Points 22121

Vous pouvez ajouter quelque chose comme ceci aux liaisons de touches de votre .tmux.conf fichier :

bind q send-keys "/home/jackhab/bin/tmux-new-session.sh" \; send-keys "Enter"

Et en tmux-new-session.sh vous pouvez avoir :

#! /usr/bin/env bash
tmux new-session "monitor1"
tmux split-window -v "monitor2"
tmux select-pane -U
tmux split-window -v -h -p 60 "monitor3"
...
exit

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X