Liaison d'une clé tmux à plusieurs commandes

37

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

Maintenant, je veux lier Ctrl-Q pour ouvrir une autre fenêtre multi - volets avec plusieurs moniteurs. Comment lier une clé à plusieurs commandes? J'ai essayé de les enchaîner avec; et \; - rien n'y fait. S'il vous plaît, conseillez ce que je devrais utiliser au lieu de ... ci-dessous.

Est-il possible, lorsque j'ouvre une nouvelle fenêtre, de suspendre les commandes d'arrière-plan superposées?

    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 "..."
jackhab
la source

Réponses:

37

Todd Freed a raison, la méthode "correcte" consiste à utiliser cette méthode \;. Sorte de. Mais il y a un problème.

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

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

si, pour une raison quelconque, vous vouliez tout cela sur une seule ligne. Maintenant, vous pouvez donner cette instruction composée d' une ligne à la tmuxcommande à partir d' une coquille aussi , mais le ;doit être échappé pour que les interprète shell comme un autre argument en faveur tmux. Ainsi, l’équivalent de ce qui précède de la coque est

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

De même, la bind-keycommande tmux prend une série d'arguments qui sont la commande tmux et les arguments à exécuter lorsque la touche est enfoncée. Si vous souhaitez lier C-qla séquence ci-dessus à partir d'un fichier créé par tmux, vous pouvez dire

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

Ici, nous avons échappé à ; from tmux , de sorte que tmux ne l'interprète pas comme la fin de la bind-keycommande, mais comme un argument supplémentaire pour lui demander bind-keyde former une commande composée comme la valeur liée de la C-qclé.

Alors que se passe-t-il lorsque nous voulons que tmux le fasse depuis le shell? Beaucoup d'échapper.

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

Premièrement, nous devons échapper le \ et le ;chacun du shell , le shell transmettant les deux caractères \;comme argument tmux. Cela échappe ensuite à ;tmux, ce qui lui permet d’affecter la totalité de la déclaration composée à la liaison de C-q.


Maintenant, tout ceci étant dit, si vous utilisez une configuration complexe de tmux comme celle-ci à plusieurs reprises, je vous conseillerais de créer un fichier tmux pour le conserver:

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

Et alors:

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

Ce sera beaucoup plus facile à maintenir de cette façon.

Peeja
la source
3
Pour rendre les touches de liaison à plusieurs commandes de la ligne de commande moins horribles à regarder, vous pouvez également échapper la chaîne \;:$ tmux bind-key -n C-q new-session "monitor1" '\;' split-window -v "monitor2"
Tim Heap
12

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 pouvez mettre cela dans votre tmux.conf ou exécuter depuis l'invite tmux ":"

Todd Freed
la source
c'était génial et fonctionnait pour utiliser une session tmux imbriquée et naviguer à travers les fenêtres imbriquées tmux.
Paul
1
Cela ne fonctionne pas à partir de la ligne de commande shell. C'est-à-dire `tmux bind-key C send-keys foo \; send-keys bar "a pour effet de lier" foo "à" C "mais
affiche
Oui, vous exécuteriez cela à partir de tmux. Mis à jour pour clarifier.
Todd Freed
Agréable! Cela fonctionne totalement ... muchas gracias!
Brad Parks
Pas de thé ; entre guillemets simples n'a pas besoin de s'échapper
elig
2

Vous pouvez le faire avec une petite solution de contournement. Semblable à la réponse suggérant un script à exécuter (qui gère bien votre cas), cela peut généralement être fait en utilisant "run-shell" et en appelant tmux lui-même en tant que commande shell.

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 shell intégré 'clear'.

La chaîne entière est simplement une séquence de commandes shell multiples.

Patauger
la source
1

Vous pouvez ajouter quelque chose comme ceci aux raccourcis clavier de votre .tmux.conffichier:

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

Et en tmux-new-session.shvous 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
paradroque
la source
1

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

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

exécutera la commande2 immédiatement et q ne sera lié qu'à send-keys "command1"

Voici la solution:

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

Dans le fichier ~ / .tmux / reload.tmux, entrez plusieurs commandes telles que:

source-file "$HOME/.tmux.conf" 
display-message "Configuration reloaded."
lzap
la source
1
Oh, attends, utilise ce que dit Peeja (\\\
;;