Ligando uma chave tmux a vários comandos

30

Eu inicio a janela do 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 eu quero ligar o Ctrl-Q para abrir outra janela multipane com vários monitores. Como faço para ligar uma chave para vários comandos? Eu tentei acorrentá-los; e \; - Nada ajuda. Por favor, informe o que devo usar em vez de ... abaixo.

É possível abrir 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 "..."
    
por jackhab 30.10.2011 / 14:25

5 respostas

31

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

Você vê, você junta uma sequência de comandos tmux dando a 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 em uma linha. Agora, você pode dar essa instrução composta de uma linha para o comando tmux de um shell também mas o ; deve ser escapado para que o shell interprete como outro argumento para tmux . Assim, o equivalente do acima da casca é

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

Da mesma forma, o comando tmux bind-key usa uma série de argumentos que são o comando e os argumentos do tmux para serem executados quando a tecla é pressionada. Se você quisesse vincular C-q à sequência acima de dentro de um arquivo originado pelo tmux, você diria

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

Aqui escapamos do ; do tmux , para que o tmux não o interprete como o fim do comando bind-key , mas como outro argumento para bind-key contando isso para formar um comando composto como o valor vinculado da chave C-q .

Então o que acontece quando queremos fazer o tmux fazer isso a partir do shell? Um monte de fugir.

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

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

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

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

E então:

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

Vai ser muito mais fácil manter isso.

    
por 19.01.2013 / 19:56
6

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

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

Você poderia colocar isso no seu tmux.conf ou executar a partir do prompt ":" do tmux

    
por 04.11.2011 / 23:39
2

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

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

que enviará as chaves 'xyz', o comando tmux 'clear-history' e depois chamará o shell 'clear' embutido.

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

    
por 14.11.2011 / 20:22
1

Você pode adicionar algo assim às combinações de teclas do seu arquivo .tmux.conf :

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

E em tmux-new-session.sh você 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
    
por 30.10.2011 / 17:12
1

Tudo mostrado aqui não funcionará, porque isso

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

executará o comando2 imediatamente e q será ligado 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."
    
por 03.04.2013 / 13:03

Tags