Recarregar as chaves não desassociadas do tmux config (a bind-key é cumulativa)

30

Eu tenho experimentado com diferentes configurações de atalhos de teclado do tmux e notei o seguinte:

Se eu recarregar minha configuração do tmux (de dentro do tmux), as combinações de teclas que eu já carreguei permanecerão carregadas. A única maneira (eu sei) de limpar isso é fechar todas as sessões do tmux e reiniciar. Portanto, parece que o tmux lembra todas as atalhos de teclado carregadas anteriormente e só as remove em uma nova inicialização ou explicitamente as desvincula.

Para recriar isso:

  • abre um terminal (A)
  • inicie o tmux
  • verifique se a associação de teclas mostra um relógio (pressione PREFIX C-t )
  • pressione PREFIX ? para ver a combinação de teclas na lista
  • editar ~/.tmux.conf
  • adicione uma associação de teclas ( bind C-t display "Keybinding C-t" )
  • recarregar a configuração do tmux ( PREFIX : source-file ~/.tmux.conf )
  • verifique se o atalho de teclado funciona (pressione PREFIX C-t )
  • pressione PREFIX ? para ver o novo atalho de teclado na lista
  • edite ~/.tmux.conf novamente
  • remova a associação de teclas (remova bind C-t display "Keybinding C-t" )
  • recarregar a configuração do tmux ( PREFIX : source-file ~/.tmux.conf )
  • verifique se o atalho de teclado funciona (pressione PREFIX C-t ), ele ainda exibe "Keybinding C-t"
  • pressione PREFIX ? para ver que a nova atalhos de teclado ainda está na lista
  • sair do tmux
  • digite tmux
  • verifique se o atalho de teclado original funciona novamente (pressione PREFIX C-t ), agora ele deve exibir um relógio novamente
  • pressione PREFIX ? para ver que a nova atalhos de teclado foi removida da lista

Minha pergunta: existe uma maneira de instruir o tmux a "esquecer" todas as configurações carregadas e, em seguida, carregar .tmux.conf ?

    
por Niels Bom 05.12.2012 / 13:37

7 respostas

18

De acordo com a página tmux(1) man, unbind-key -a é o que você está procurando.

Observe que tmux executa um servidor que só será encerrado quando todas as sessões forem fechadas e as ligações de teclas forem por servidor. Portanto, uma vez que você crie uma ligação, ela será persistente em todos os clientes que se desconectarem.

Dito isto, coloque unbind-key -a no topo do seu arquivo de configuração, e na configuração recarregar ele deve fazer o que você quer - desvincular tudo e começar a ligação do zero. Ou - se suas modificações forem menores - desvincule apenas o que você deseja alterar.

    
por 05.12.2012 / 15:00
15

A solução correta (por Peter

Então @peterph deu a resposta correta que é unbind-key -a , que faz o seguinte: (man tmux)

If -a is present, all key bindings are removed.

Uma solução viável

O problema (para mim) é que "tudo" significa realmente tudo. Incluindo os atalhos de teclado, o tmux vem com . Se você executar o comando unbind-key -a , o tmux instantaneamente não terá mais nenhuma associação de teclas, então você não pode nem entrar no modo de comando ou fazer qualquer coisa basicamente.

Minha correção (bastante feia) para isso é a seguinte:

  • crie um .tmux.reset.conf que remova todas as combinações de teclas e depois religue todas as que o tmux possui por padrão
  • fonte redefinida na parte superior de seu .tmux.conf

Meu .tmux.conf :

# always load the reset file first
source-file ~/.tmux.reset.conf

Meu .tmux.reset.conf :

# First remove *all* keybindings
unbind-key -a
# Now reinsert all the regular tmux keys
bind-key C-b send-prefix
bind-key C-o rotate-window
bind-key C-z suspend-client
bind-key Space next-layout
bind-key ! break-pane
bind-key " split-window
bind-key # list-buffers
bind-key $ command-prompt -I #S "rename-session '%%'"
bind-key % split-window -h
bind-key & confirm-before -p "kill-window #W? (y/n)" kill-window
bind-key ' command-prompt -p index "select-window -t ':%%'"
bind-key ( switch-client -p
bind-key ) switch-client -n
bind-key , command-prompt -I #W "rename-window '%%'"
bind-key - delete-buffer
bind-key . command-prompt "move-window -t '%%'"
bind-key 0 select-window -t :0
bind-key 1 select-window -t :1
bind-key 2 select-window -t :2
bind-key 3 select-window -t :3
bind-key 4 select-window -t :4
bind-key 5 select-window -t :5
bind-key 6 select-window -t :6
bind-key 7 select-window -t :7
bind-key 8 select-window -t :8
bind-key 9 select-window -t :9
bind-key : command-prompt
bind-key ; last-pane
bind-key = choose-buffer
bind-key ? list-keys
bind-key D choose-client
bind-key L switch-client -l
bind-key [ copy-mode
bind-key ] paste-buffer
bind-key c new-window
bind-key d detach-client
bind-key f command-prompt "find-window '%%'"
bind-key i display-message
bind-key l last-window
bind-key n next-window
bind-key o select-pane -t :.+
bind-key p previous-window
bind-key q display-panes
bind-key r refresh-client
bind-key s choose-session
bind-key t clock-mode
bind-key w choose-window
bind-key x confirm-before -p "kill-pane #P? (y/n)" kill-pane
bind-key { swap-pane -U
bind-key } swap-pane -D
bind-key ~ show-messages
bind-key PPage copy-mode -u
bind-key -r Up select-pane -U
bind-key -r Down select-pane -D
bind-key -r Left select-pane -L
bind-key -r Right select-pane -R
bind-key -r M-1 select-layout even-horizontal
bind-key -r M-2 select-layout even-vertical
bind-key -r M-3 select-layout main-horizontal
bind-key -r M-4 select-layout main-vertical
bind-key -r M-5 select-layout tiled
bind-key -r M-n next-window -a
bind-key -r M-o rotate-window -D
bind-key -r M-p previous-window -a
bind-key -r M-Up resize-pane -U 5
bind-key -r M-Down resize-pane -D 5
bind-key -r M-Left resize-pane -L 5
bind-key -r M-Right resize-pane -R 5
bind-key -r C-Up resize-pane -U
bind-key -r C-Down resize-pane -D
bind-key -r C-Left resize-pane -L
bind-key -r C-Right resize-pane -R

Parece que isso poderia ter funcionado com as tabelas de chaves do tmux (até onde eu sei), mas você não pode adicionar novas tabelas de chaves.

    
por 05.12.2012 / 16:57
6

Atualmente, não há uma maneira direta de redefinir a vinculação de uma chave ao padrão. a inicialização das ligações padrão (em key_bindings_init() ) é feita uma vez quando o servidor tmux é iniciado pela primeira vez (em server_start() ) e não há mecanismo para redefinir uma única chave.

Para o cenário desejado em que você deseja acionar o arquivo de configuração para restabelecer uma ligação padrão que foi anteriormente substituída por uma ligação personalizada que foi excluída do arquivo de configuração, o método que você criou é razoável (embora infelizmente detalhado) ): unbind-key -a , em seguida, restabeleça todas as ligações "padrão" e, em seguida, estabeleça suas ligações personalizadas (algumas das quais podem substituir uma ligação "padrão").

As ligações atuais de um servidor podem ser extraídas com o comando list-keys * ; Isso pode ajudar a gerar / manter seu arquivo .tmux.reset.conf proposto, mas você precisa de uma maneira de extrair as ligações padrão , não as ligações atuais .

* Existem algumas situações em que a saída de list-keys não é atualmente utilizável diretamente: a ligação para ponto-e-vírgula precisa de seu ponto-e-vírgula escapado com uma barra invertida para evitar que ele seja interpretado como um separador de comando tmux e quaisquer ligações que tinha argumentos que usavam aspas duplas dentro de citações simples (nenhuma das ligações padrão são assim) aparecerão como aspas duplas dentro de qoutes duplos .

Para obter as ligações padrão, você precisa de um servidor temporário com uma configuração mínima (ou seja, sem ligações personalizadas) para poder capturar sua list-keys output. Não há limite para o número de servidores tmux que você pode executar, mas cada um deve usar um nome de caminho de soquete diferente; as opções -L e -S tmux podem ser usadas para especificar um nome de soquete (em $TMPDIR/tmux-$UID ou nome de caminho de soquete completo. Então, para conversar (ou iniciar) um novo servidor em um soquete chamado temp , você usaria isso:

tmux -L temp …

Para garantir que ele não use seu .tmux.conf , use -f para informar a leitura de /dev/null (um arquivo especial que está sempre vazio):

tmux -f /dev/null -L temp …

Nota : isso não impede o processamento de /etc/tmux.conf , se tal arquivo existir; o caminho para esse "arquivo de configuração do sistema" é codificado e não há opção para contorná-lo (a não ser que o código esteja sendo corrigido).

Normalmente, você precisa de um comando new-session para realmente iniciar o servidor, mas não queremos que nenhuma sessão, apenas um servidor inicializado, consulte. O comando start-server faz exatamente isso: inicia um servidor sem criar nenhuma sessão.

tmux -f /dev/null -L temp start-server …

Agora, precisamos apenas anexar nosso comando "query" ( list-keys neste caso):

tmux -f /dev/null -L temp start-server \; list-keys

Nota : o ponto e vírgula precisa ser escapado ou citado para evitar que o shell o trate como um separador de comandos shell, já que queremos que seja um separador de comandos tmux .

Como não há sessões para manter, o servidor sairá automaticamente após concluir a execução do comando list-keys .

Assim, você pode usar um comando como este para gerar a maior parte do seu .tmux.reset.conf sem ter que se preocupar em remover temporariamente o arquivo .tmux.conf (para que você veja apenas as ligações padrão) e sem ter que desligar servidores existentes.

Se o comando run-shell fosse síncrono, você poderia incorporar uma chamada assim em seu arquivo de configuração (capturando em um arquivo temporário que você processaria com source-file ) em vez de ter um arquivo estático (seu .tmux.reset.conf ) . Isso permitiria que você sempre usasse as ligações padrão de sua versão atual do tmux (as ligações padrão são alteradas ocasionalmente). Infelizmente, a conclusão do comando run-shell é atualmente assíncrona em relação aos comandos subseqüentes (os comandos que vêm depois de um comando run-shell geralmente são executados antes que o processo gerado por run-shell tenha a chance de ser concluído).

    
por 08.12.2012 / 07:22
5

Aqui está um conjunto de todas as outras respostas em um script bash que irá gerar automaticamente .tmux.reset.conf das ligações padrão:

#!/bin/bash
tmux -f /dev/null -L temp start-server \; list-keys | \
  sed -r \
  -e "s/bind-key(\s+)([\"#~\$])(\s+)/bind-key\'\'/g" \
  -e "s/bind-key(\s+)([\'])(\s+)/bind-key\"\"/g" \
  -e "s/bind-key(\s+)([;])(\s+)/bind-key\\/g" \
  -e "s/command-prompt -I #([SW])/command-prompt -I \"#\"/g" \
  > ~/.tmux.reset.conf

A linha de comando incorporada sed cuida de escapar várias partes da saída de list-keys . Isso pode precisar de alguns ajustes para as especificidades do seu sistema.

Em seu arquivo .tmux.conf , simplesmente desvincule todas as chaves e faça a fonte desse arquivo antes de definir suas próprias vinculações de teclas:

unbind-key -a
source-file ~/.tmux.reset.conf
    
por 14.01.2016 / 17:47
4

Por favor, consulte também as outras respostas aqui, pois elas explicam bem a situação. Eu tenho aqui meu tmux.reset.conf compatível com tmux 1.8 , que eu tive que fazer várias modificações depois de copiar a saída tmux -f /dev/null -L temp start-server \; list-keys . Em particular, várias coisas tinham que ser citadas.

# First remove *all* keybindings
unbind-key -a
# Now reinsert all the regular tmux keys
bind-key C-b send-prefix
bind-key C-o rotate-window
bind-key C-z suspend-client
bind-key Space next-layout
bind-key ! break-pane
bind-key '"' split-window
bind-key '#' list-buffers
bind-key '$' command-prompt -I "#S" "rename-session '%%'"
bind-key % split-window -h
bind-key & confirm-before -p "kill-window #W? (y/n)" kill-window
bind-key "'" command-prompt -p index "select-window -t ':%%'"
bind-key ( switch-client -p
bind-key ) switch-client -n
bind-key , command-prompt -I "#W" "rename-window '%%'"
bind-key - delete-buffer
bind-key . command-prompt "move-window -t '%%'"
bind-key 0 select-window -t :0
bind-key 1 select-window -t :1
bind-key 2 select-window -t :2
bind-key 3 select-window -t :3
bind-key 4 select-window -t :4
bind-key 5 select-window -t :5
bind-key 6 select-window -t :6
bind-key 7 select-window -t :7
bind-key 8 select-window -t :8
bind-key 9 select-window -t :9
bind-key : command-prompt
bind-key \; last-pane
bind-key = choose-buffer
bind-key ? list-keys
bind-key D choose-client
bind-key L switch-client -l
bind-key [ copy-mode
bind-key ] paste-buffer
bind-key c new-window
bind-key d detach-client
bind-key f command-prompt "find-window '%%'"
bind-key i display-message
bind-key l last-window
bind-key n next-window
bind-key o select-pane -t :.+
bind-key p previous-window
bind-key q display-panes
bind-key r refresh-client
bind-key s choose-tree
bind-key t clock-mode
bind-key w choose-window
bind-key x confirm-before -p "kill-pane #P? (y/n)" kill-pane
bind-key z resize-pane -Z
bind-key { swap-pane -U
bind-key } swap-pane -D
bind-key '~' show-messages
bind-key PPage copy-mode -u
bind-key -r Up select-pane -U
bind-key -r Down select-pane -D
bind-key -r Left select-pane -L
bind-key -r Right select-pane -R
bind-key M-1 select-layout even-horizontal
bind-key M-2 select-layout even-vertical
bind-key M-3 select-layout main-horizontal
bind-key M-4 select-layout main-vertical
bind-key M-5 select-layout tiled
bind-key M-n next-window -a
bind-key M-o rotate-window -D
bind-key M-p previous-window -a
bind-key -r M-Up resize-pane -U 5
bind-key -r M-Down resize-pane -D 5
bind-key -r M-Left resize-pane -L 5
bind-key -r M-Right resize-pane -R 5
bind-key -r C-Up resize-pane -U
bind-key -r C-Down resize-pane -D
bind-key -r C-Left resize-pane -L
bind-key -r C-Right resize-pane -R
    
por 10.06.2013 / 22:17
4

Eu perguntei ao upstream que eles não parecem dispostos a corrigi-lo (a menos que alguém envie um PR).

Aqui está meu escape tmux list-keys obtido manualmente por meio de uma nova instância do servidor com

tmux -f /dev/null -L temp start-server \; list-keys

(graças a respostas anteriores)

## See https://github.com/tmux/tmux/issues/729: How to reset key bindings to default? #729

bind-key    -T prefix C-b              send-prefix
bind-key    -T prefix C-o              rotate-window
bind-key    -T prefix C-z              suspend-client
bind-key    -T prefix Space            next-layout
bind-key    -T prefix !                break-pane
bind-key    -T prefix '"'                split-window
bind-key    -T prefix '#'                list-buffers
bind-key    -T prefix '$'                command-prompt -I '#'S "rename-session '%%'"
bind-key    -T prefix %                split-window -h
bind-key    -T prefix &                confirm-before -p "kill-window #W? (y/n)" kill-window
bind-key    -T prefix "'"                command-prompt -p index "select-window -t ':%%'"
bind-key    -T prefix (                switch-client -p
bind-key    -T prefix )                switch-client -n
bind-key    -T prefix ,                command-prompt -I '#W' "rename-window '%%'"
bind-key    -T prefix -                delete-buffer
bind-key    -T prefix .                command-prompt "move-window -t '%%'"
bind-key    -T prefix 0                select-window -t :=0
bind-key    -T prefix 1                select-window -t :=1
bind-key    -T prefix 2                select-window -t :=2
bind-key    -T prefix 3                select-window -t :=3
bind-key    -T prefix 4                select-window -t :=4
bind-key    -T prefix 5                select-window -t :=5
bind-key    -T prefix 6                select-window -t :=6
bind-key    -T prefix 7                select-window -t :=7
bind-key    -T prefix 8                select-window -t :=8
bind-key    -T prefix 9                select-window -t :=9
bind-key    -T prefix ':'                command-prompt
bind-key    -T prefix \;                last-pane
bind-key    -T prefix =                choose-buffer
bind-key    -T prefix ?                list-keys
bind-key    -T prefix D                choose-client
bind-key    -T prefix L                switch-client -l
bind-key    -T prefix M                select-pane -M
bind-key    -T prefix [                copy-mode
bind-key    -T prefix ]                paste-buffer
bind-key    -T prefix c                new-window
bind-key    -T prefix d                detach-client
bind-key    -T prefix f                command-prompt "find-window '%%'"
bind-key    -T prefix i                display-message
bind-key    -T prefix l                last-window
bind-key    -T prefix m                select-pane -m
bind-key    -T prefix n                next-window
bind-key    -T prefix o                select-pane -t :.+
bind-key    -T prefix p                previous-window
bind-key    -T prefix q                display-panes
bind-key    -T prefix r                refresh-client
bind-key    -T prefix s                choose-tree
bind-key    -T prefix t                clock-mode
bind-key    -T prefix w                choose-window
bind-key    -T prefix x                confirm-before -p "kill-pane #P? (y/n)" kill-pane
bind-key    -T prefix z                resize-pane -Z
bind-key    -T prefix {                swap-pane -U
bind-key    -T prefix }                swap-pane -D
bind-key    -T prefix '~'                show-messages
bind-key    -T prefix PPage            copy-mode -u
bind-key -r -T prefix Up               select-pane -U
bind-key -r -T prefix Down             select-pane -D
bind-key -r -T prefix Left             select-pane -L
bind-key -r -T prefix Right            select-pane -R
bind-key    -T prefix M-1              select-layout even-horizontal
bind-key    -T prefix M-2              select-layout even-vertical
bind-key    -T prefix M-3              select-layout main-horizontal
bind-key    -T prefix M-4              select-layout main-vertical
bind-key    -T prefix M-5              select-layout tiled
bind-key    -T prefix M-n              next-window -a
bind-key    -T prefix M-o              rotate-window -D
bind-key    -T prefix M-p              previous-window -a
bind-key -r -T prefix M-Up             resize-pane -U 5
bind-key -r -T prefix M-Down           resize-pane -D 5
bind-key -r -T prefix M-Left           resize-pane -L 5
bind-key -r -T prefix M-Right          resize-pane -R 5
bind-key -r -T prefix C-Up             resize-pane -U
bind-key -r -T prefix C-Down           resize-pane -D
bind-key -r -T prefix C-Left           resize-pane -L
bind-key -r -T prefix C-Right          resize-pane -R
bind-key    -T root   MouseDown1Pane   select-pane -t = \; send-keys -M
bind-key    -T root   MouseDown1Status select-window -t =
bind-key    -T root   MouseDown3Pane   if-shell -F -t = '#{mouse_any_flag}' "select-pane -t=; send-keys -M" "select-pane -mt="
# Someone also was wondering how to fix here: http://tmux-users.narkive.com/dTFVvLMh/is-it-possible-to-have-a-binding-that-brings-back-mouse-behavior
bind-key    -T root   MouseDrag1Pane   if-shell -F -t = '#{mouse_any_flag}' "if -Ft= '#{pane_in_mode}' 'copy-mode -M' 'send-keys -M' " "copy-mode -M"

bind-key    -T root   MouseDrag1Border resize-pane -M
bind-key    -T root   WheelUpPane      if-shell -F -t = '#{mouse_any_flag}' "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -et=' "
bind-key    -T root   WheelUpStatus    previous-window
bind-key    -T root   WheelDownStatus  next-window

O está no github acima para que você possa fazer:

curl -L https://raw.githubusercontent.com/timotheecour/dinocode/master/tmux_list_keys_escaped.txt > ~/.tmux.reset.conf
unbind-key -a
source-file ~/.tmux.reset.conf

OBSERVAÇÃO: De alguma forma, a resposta de Richard Cook ainda gerou problemas que escapam.

    
por 20.01.2017 / 21:33
1

Aqui está uma versão ajustada da resposta de Richard Cook para corrigir problemas de escape no tmux 2.1

#!/bin/bash
tmux -f /dev/null -L temp start-server \; list-keys | \
    sed -r \
    -e "s/(bind-key.*\s+)([\"#~\$])(\s+)/\'\'/g" \
    -e "s/(bind-key.*\s+)([\'])(\s+)/\"\"/g" \
    -e "s/(bind-key.*\s+)([;])(\s+)/\\/g" \
    -e "s/(command-prompt -I )#([SW])/\"#\"/g" \
    -e "s/(if-shell -F -t = )#([^ ]+)/\"#\"/g" \
    > ~/.tmux.reset.conf                              

Adicione as seguintes linhas ao início de .tmux.conf

unbind-key -a
source-file ~/.tmux.reset.conf
    
por 12.03.2017 / 04:15