Vinculando uma Chave tmux a Vários Comandos


37

Inicio a janela multipane tmux para monitorar vários parâmetros do servidor. Com o Ctrl-S, posso abrir uma nova janela com outro comando do monitor.

Agora, quero ligar o Ctrl-Q para abrir outra janela de painel múltiplo com vários monitores. Como vincular uma chave a vários comandos? Eu tentei acorrentá-los; e \; - Nada ajuda. Por favor, informe o que devo usar em vez de ... abaixo.

É possível quando abro uma nova janela para suspender os comandos em segundo plano sobrepostos por ela?

    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 "..."

Respostas:


37

Todd Freed está certo, a maneira "correta" de fazer isso é usando \;. Tipo de. Mas há um problema.

Veja bem, você junta uma sequência de comandos tmux, dando ao tmux a conjunção ;. Assim, em um arquivo originado pelo tmux, você pode dizer

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

se, por algum motivo, você quisesse tudo isso em uma linha. Agora, você pode dar de que uma linha instrução composta para o tmuxcomando de um shell também , mas o ;deve ser escapado para que os interpreta shell como um outro argumento para tmux. Assim, o equivalente ao anterior da casca é

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

Da mesma forma, o bind-keycomando tmux utiliza uma série de argumentos, que são o comando tmux e os argumentos a serem executados quando a tecla é pressionada. Se você deseja vincular C-qa sequência acima a partir de um arquivo originado pelo tmux, diria

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

Aqui escapamos ; do tmux , para que o tmux não o interprete como o final do bind-keycomando, mas como outro argumento para bind-keydizer a ele para formar um comando composto como o valor vinculado da C-qchave.

Então, o que acontece quando queremos que o tmux faça isso a partir do shell? Um monte de fuga.

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

Primeiro, temos que escapar do shell \ e de; cada um deles , fazendo com que o shell passe os dois caracteres como argumento para . Isso então escapa do from tmux, fazendo com que ele atribua toda a instrução composta como a ligação de .\;tmux;C-q


Agora, tudo o que foi dito, se você usar uma configuração complexa do tmux como esta repetidamente, sugiro que você crie um arquivo tmux para mantê-lo:

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

E depois:

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

Vai ser muito mais fácil manter isso.


3
Para fazer chaves para vários comandos de ligação da linha de comando menos horrível de se ver, você também pode corda escapar do \;:$ tmux bind-key -n C-q new-session "monitor1" '\;' split-window -v "monitor2"
Tim Heap

12

Portanto, a resposta real é: você encadeia comandos com uma barra invertida seguida por um ponto e vírgula.

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

Você colocaria isso no seu tmux.conf ou executaria a partir do prompt tmux ":"


isso foi ótimo e funcionou para usar a sessão tmux aninhada e navegar pelas janelas tmux aninhadas.
Paul

1
Isso não funciona na linha de comando do shell. Ou seja, tmux chave de ligação C enviar chaves foo \; barra de envio de chaves "tem o efeito de vincular" foo "a" C ", mas imprime" barra "imediatamente.
Lqueryvg 3/16/16

Sim, você executaria isso no tmux. Atualizado para esclarecer.
Todd Freed

Agradável! Isso funciona totalmente ... muchas gracias!
Brad Parks

Nota: a; dentro de aspas simples não precisa ser escapado
elegível em

2

Você é capaz de fazer isso com uma pequena solução alternativa. Semelhante à resposta que sugere um script para ser executado (que lida bem com seu caso), geralmente pode ser feito usando "run-shell" e chamando o próprio tmux como o comando do shell.

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

que envia chaves 'xyz', comando tmux 'clear-history' e depois chama o shell 'clear' embutido.

A sequência inteira é apenas uma sequência de comandos com vários shell.


1

Você pode adicionar algo parecido com isto às combinações de teclas do seu .tmux.confarquivo:

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

E em tmux-new-session.shvocê pode ter:

#! /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

1

Tudo mostrado aqui não funcionará, porque isso

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

executará o comando2 imediatamente eq será vinculado apenas às chaves de envio "command1"

Aqui está a solução:

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

No arquivo ~ / .tmux / reload.tmux, coloque vários comandos como:

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

1
Oh, espere, uso o que Peeja disse (\\\;) :-)
lzap
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.