Ricarica di tmux config non sbloccare le chiavi (bind-key è cumulativa)


33

Ho sperimentato diverse impostazioni di associazione tasti tmux e ho notato quanto segue:

Se ricarico il mio tmux config (dall'interno di tmux) le combinazioni di tasti che una volta avevo caricato rimarranno caricate. L'unico modo (che conosco) di ripulire è chiudere tutte le sessioni di tmux e riavviare. Quindi sembra che tmux ricordi tutte le combinazioni di tasti precedentemente caricate e le rimuoverà solo a un nuovo inizio o separandole esplicitamente.

Per ricreare questo:

  • aprire un terminale (A)
  • avvia tmux
  • controlla se il keybinding mostra un orologio (premi PREFIX C-t)
  • premere PREFIX ?per visualizzare la combinazione di tasti nell'elenco
  • modificare ~/.tmux.conf
  • aggiungi un keybinding ( bind C-t display "Keybinding C-t")
  • ricaricare tmux config ( PREFIX : source-file ~/.tmux.conf)
  • controlla se il keybinding funziona (premi PREFIX C-t)
  • premere PREFIX ?per visualizzare il nuovo tasti nell'elenco nell'elenco
  • modifica di ~/.tmux.confnuovo
  • rimuovere l'associazione dei tasti (quindi rimuovere bind C-t display "Keybinding C-t")
  • ricaricare tmux config ( PREFIX : source-file ~/.tmux.conf)
  • controlla se il keybinding funziona (premi PREFIX C-t), visualizza ancora "Keybinding Ct"
  • premere PREFIX ?per vedere che il nuovo keybinding è ancora nell'elenco
  • esci da tmux
  • inserisci tmux
  • controlla se il keybinding originale funziona di nuovo (premi PREFIX C-t), ora dovrebbe visualizzare di nuovo un orologio
  • premere PREFIX ?per vedere che il nuovo keybinding è stato rimosso dall'elenco

La mia domanda: c'è un modo per istruire tmux a "dimenticare" tutte le configurazioni caricate e quindi caricare .tmux.conf?

Risposte:


19

Secondo la tmux(1)pagina man, unbind-key -aè quello che stai cercando.

Si noti che tmuxesegue un server che verrà chiuso solo quando tutte le sessioni saranno chiuse e le associazioni dei tasti saranno per server. Quindi, una volta creato un binding, sarà persistente su tutti i distacchi client.

Detto questo, metti unbind-key -ain cima al tuo file di configurazione e, al momento della configurazione, ricarica dovrebbe fare quello che vuoi: separa tutto e inizia a legare da zero. Oppure, se le modifiche sono più piccole, separa solo ciò che desideri modificare.


Sì, e l'ho già affermato nella mia domanda. Ma invece di "ripristinare" tutte le chiavi eventualmente associate manualmente, vorrei che tmux si riavviasse con una "lavagna pulita" e quindi ricarichi il file di configurazione.
Niels Bom,

@NielsBom controlla la risposta aggiornata per favore
peterph

Hai ragione, unbind-key -arimuove tutte le combinazioni di tasti. Contrassegnerò la tua risposta come corretta, ma per il bene di altri spettatori aggiungerò anche l '"hack" che ho applicato per risolvere un problema unbind-key -a.
Niels Bom,

Vedi la mia risposta per la mia soluzione.
Niels Bom,

16

La soluzione corretta (di Peter

Quindi @peterph ha dato la risposta corretta che è unbind-key -ala seguente: (man tmux)

Se è presente -a, tutte le associazioni di tasti vengono rimosse.

Una soluzione praticabile

Il problema (per me) è che "tutto" in realtà significa tutto. Incluse le combinazioni di tasti fornite da tmux . Se esegui il unbind-key -acomando tmux all'istante non ha più alcuna combinazione di tasti, quindi non puoi nemmeno entrare in modalità comando o fare praticamente nulla.

La mia (piuttosto brutta) soluzione per questo è la seguente:

  • crea un .tmux.reset.confche rimuove tutte le combinazioni di tasti e quindi ricollega tutte quelle che tmux ha di default
  • sorgente che si ripristina nella parte superiore del tuo .tmux.conf

Il mio .tmux.conf:

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

Il mio .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

Sembrava che questo avrebbe potuto funzionare con le tabelle chiave di tmux (per quanto ne so) ma non è possibile aggiungere nuove tabelle chiavi.


1
È probabile che tu possa generare rapidamente l'equivalente del tuo .tmux.reset.confeseguendolo tmux list-keysin una sessione "pulita".
jw013,

2
tmux -f /dev/null -L temp start-server \; list-keysgenererà effettivamente i valori predefiniti (sebbene sia necessario aggiungere una barra rovesciata prima del punto e virgola nel suo bind).
Chris Johnsen,

@ChrisJohnsen Potresti elaborare su start-server in una risposta separata?
Niels Bom il

7

Al momento non esiste un modo diretto per ripristinare il legame di una chiave al suo valore predefinito; l'inizializzazione dei binding predefiniti (in key_bindings_init()) viene eseguita una volta all'avvio del server tmux (in server_start()) e non esiste alcun meccanismo per reimpostare una singola chiave.

Per il vostro scenario desiderato in cui si desidera l'atto di approvvigionamento il file di configurazione di ristabilire un legame che è stato precedentemente ignorato da un legame che da allora è stato eliminato dal file di configurazione personalizzata di default, il metodo che si elaborata è ragionevole (anche se purtroppo verbose): unbind-key -a, quindi ristabilire tutti i bind "predefiniti", quindi stabilire i bind personalizzati (alcuni dei quali potrebbero sostituire un bind "predefinito").

I binding correnti di un server possono essere estratti con il list-keyscomando * ; questo può aiutare a generare / mantenere il .tmux.reset.conffile proposto , ma è necessario un modo per estrarre i binding predefiniti , non i binding correnti .

* Ci sono alcune situazioni in cui l'output di list-keysnon è attualmente direttamente utilizzabile: la rilegatura per punto e virgola necessita che il suo punto e virgola sia sfuggito a una barra rovesciata per impedire che venga interpretato come un separatore di comandi tmux e qualsiasi associazione che avesse argomenti che utilizzavano virgolette doppie all'interno di un singolo le virgolette (nessuna delle associazioni predefinite sono così) verranno visualizzate come doppie virgolette all'interno di doppie qoutes.

Per ottenere i bind predefiniti è necessario un server temporaneo con una configurazione minima (ovvero senza bind personalizzati) in modo da poterne catturare l' list-keysoutput. Non vi è alcun limite al numero di server tmux che è possibile eseguire, ma ognuno deve utilizzare un nome percorso socket diverso; le opzioni -Le -S tmux possono essere utilizzate per specificare un nome socket (in $TMPDIR/tmux-$UIDo nome percorso socket completo. Quindi, per parlare (o avviare) un nuovo server su un socket chiamato temp, si dovrebbe usare questo:

tmux -L temp …

Per assicurarti che non usi il tuo .tmux.conf, lo usi -fper dirgli di leggere /dev/null(un file speciale che è sempre vuoto):

tmux -f /dev/null -L temp …

Nota : questo non impedisce l'elaborazione di /etc/tmux.conf, se esiste un tale file; il percorso di questo "file di configurazione del sistema" è hardcoded e non esiste alcuna opzione per bypassarlo (a parte il patching del codice).

Normalmente, è necessario un new-sessioncomando per avviare effettivamente il server, ma non vogliamo alcuna sessione, ma solo un server inizializzato da interrogare. Il start-servercomando fa proprio questo: avvia un server senza creare alcuna sessione.

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

Ora, dobbiamo solo aggiungere il nostro comando "query" ( list-keysin questo caso):

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

Nota : il punto e virgola deve essere sottoposto a escape o quotato per impedire alla shell di trattarlo come un separatore di comandi di shell poiché vogliamo che sia un separatore di comandi tmux .

Poiché non ci sono sessioni da mantenere, il server verrà chiuso automaticamente al termine dell'esecuzione del list-keyscomando.

Quindi, puoi usare un comando come questo per generare la maggior parte dei tuoi .tmux.reset.confsenza doversi preoccupare di rimuovere temporaneamente il tuo .tmux.conffile (per farti vedere solo i bind predefiniti) e senza chiudere alcun server esistente.


Se il run-shellcomando era sincrono, è possibile incorporare una chiamata come questa nel file di configurazione (acquisizione in un file temporaneo con il quale si elaborerebbe quindi source-file) anziché disporre di un file statico (il proprio .tmux.reset.conf). Ciò ti consentirebbe di utilizzare sempre i collegamenti predefiniti della versione corrente di tmux (i collegamenti predefiniti cambiano di tanto in tanto). Purtroppo, il completamento del run-shellcomando è attualmente asincrono rispetto ai comandi successivi (i comandi che vengono dopo un run-shellcomando di solito verranno eseguiti prima che il processo generato da run-shellabbia avuto la possibilità di terminare).


6

Ecco un riepilogo di tutte le altre risposte in uno script bash che genererà automaticamente .tmux.reset.confdalle associazioni di tasti predefinite:

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

La sedriga di comando integrata si occupa di sfuggire a varie parti dell'output da list-keys. Questo potrebbe richiedere alcune modifiche per le specifiche del tuo sistema.

Nel tuo .tmux.conffile devi semplicemente separare tutte le chiavi e sorgente questo file prima di definire i tuoi collegamenti chiave:

unbind-key -a
source-file ~/.tmux.reset.conf

4

Si prega di fare riferimento anche alle altre risposte qui, poiché fanno un buon lavoro di spiegazione della situazione. Ho qui il mio tmux.reset.conf compatibile con tmux 1.8 , che ho dovuto apportare diverse modifiche dopo aver copiato l' tmux -f /dev/null -L temp start-server \; list-keysoutput. In particolare, è stato necessario citare diverse cose.

# 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

4

Ho chiesto a monte che non sembrano disposti a risolverlo (a meno che qualcuno non invii un PR).

Ecco il mio escape manuale tmux list-keys, ottenuto tramite una nuova istanza del server con

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

(grazie alle risposte precedenti)

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

Quanto sopra è su github quindi puoi fare:

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

NOTA: in qualche modo la risposta di Richard Cook ha ancora prodotto problemi di fuga.


Benvenuto in unix.SE! Siamo spesso diffidenti nei confronti dei link semplici, quindi l'ho incollato direttamente qui (ma ho mantenuto il link come riferimento). Questo è il modo preferito da queste parti. I collegamenti muoiono (lo so, è github! Ma a un certo punto potrebbe anche morire). Comunque è una buona risposta (+1). Forse potrebbe essere migliore se riuscissi a risolvere il problema con il codice sed di Richard. È vecchio di un anno e tmux ha la cattiva abitudine di non essere compatibile al 100% con le versioni precedenti.
grochmal

2

Ecco una versione ottimizzata della risposta di Richard Cook per risolvere i problemi di fuga su tmux 2.1

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

Aggiungi le seguenti righe all'inizio di .tmux.conf

unbind-key -a
source-file ~/.tmux.reset.conf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.