web-dev-qa-db-fra.com

Recharge de TMUX CONFIG NON ​​TOUCHES NEFFINDATION (KID-KEY est cumulative)

J'essaie d'expérimenter différents paramètres de clavier TMUX et j'ai remarqué ce qui suit:

Si je rechargez ma configuration TMUX (à partir de TMUX), les bornes de clés que je serais chargées une fois restent chargées. Le seul moyen (je sais) de nettoyer ce problème est de quitter toutes les sessions TMUX et de redémarrer. Il semble donc que TMUX se souvient de tous les clés chargés auparavant chargé et ne les supprimera que sur un nouveau départ ou en les détenant explicitement.

Pour recréer ceci:

  • ouvrir un terminal (a)
  • commencer tmux
  • vérifiez si le clavier montre une horloge (appuyez sur PREFIX C-t)
  • presse PREFIX ? Pour voir le clavier dans la liste
  • éditer ~/.tmux.conf
  • ajouter un clavier (bind C-t display "Keybinding C-t")
  • recharger TMUX CONFIG (PREFIX : source-file ~/.tmux.conf)
  • vérifiez si les travaux de clavier (appuyez sur PREFIX C-t)
  • presse PREFIX ? Pour voir le nouveau Keybinding dans la liste
  • éditer ~/.tmux.conf de nouveau
  • retirez le clavier (alors supprimez bind C-t display "Keybinding C-t")
  • recharger TMUX CONFIG (PREFIX : source-file ~/.tmux.conf)
  • vérifiez si les travaux de clavier (appuyez sur PREFIX C-t), il affiche toujours "KeyBinding C-T"
  • presse PREFIX ? Pour voir que le nouveau Keybinding est toujours dans la liste
  • quitter tmux
  • entrez tmux
  • vérifiez si le clavier d'origine fonctionne à nouveau (appuyez sur PREFIX C-t), il devrait maintenant afficher une horloge à nouveau
  • presse PREFIX ? Pour voir que le nouveau KeyBinding a été supprimé de la liste

Ma question: Existe-t-il un moyen d'instruire TMUX d'oublier "toutes les configures chargées, puis de charger .tmux.conf?

35
Niels Bom

Selon la page tmux(1) Man, unbind-key -a est ce que vous recherchez.

Notez que tmux exécute un serveur qui ne quitte qu'une fois que toutes les sessions sont fermées et que les fixations de clé sont par serveur. Par conséquent, une fois que vous avez créé une contraignante, il sera persistant sur tous les détachoirs du client.

Cela dit, mis unbind-key -a Au début de votre fichier de configuration, et sur CONFIG RELOAD, il devrait faire ce que vous voulez - tout le refroidissement et commencer la liaison à partir de zéro. Ou - si vos modifications sont plus petites - innove que ce que vous voulez changer.

21
peterph

la solution correcte (par Peter

Donc, @peterph a donné la bonne réponse qui est unbind-key -a qui fait ce qui suit: (homme tmux)

Si -a est présent, toutes les liaisons clés sont supprimées.

ne solution réalisable

Le problème (pour moi) est que "tous" signifie réellement tout. y compris les keybindings tmux est livré avec. Si vous exécutez le unbind-key -a COMMANDER TMUX n'a ​​instantanément aucun clavier à tout moment, vous ne pouvez même pas entrer en mode de commande ni ne rien faire fondamentalement.

Mon correctif (plutôt laid) pour cela est ce qui suit:

  • créer un .tmux.reset.conf qui supprime tous les clés de clés, puis rebinets tous ceux TMUX ont par défaut
  • source qui réinitialisée en haut de votre .tmux.conf

Mon .tmux.conf:

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

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

Cela semblait un peu que cela aurait pu avoir travaillé avec TMUX Key-Tables (autant que je puisse le dire), mais vous ne pouvez pas ajouter de nouvelles tables clés.

16
Niels Bom

Il n'y a actuellement aucun moyen direct de réinitialiser la liaison d'une clé à sa valeur par défaut; L'initialisation des liaisons par défaut (dans key_bindings_init()) est effectuée une fois lorsque le fichier tmux Server commence d'abord (en server_start()), et il n'y a pas de mécanisme pour réinitialiser une seule touche.

Pour votre scénario souhaité où vous souhaitez que l'acte d'approvisionnement de votre fichier de configuration rétablit une liaison par défaut qui a été précédemment remplacée par une liaison personnalisée qui a depuis été supprimée depuis votre fichier de configuration, la méthode que vous avez élaborée est raisonnable (malheureusement verbeuse): unbind-key -a, puis rétablissez toutes les liaisons "par défaut", puis établissez vos liaisons personnalisées (dont certaines pourraient remplacer une liaison "par défaut").

Les liaisons actuelles d'un serveur peuvent être extraites avec le list-keys commande*; Cela peut aider à générer/à conserver votre proposition .tmux.reset.conf Fichier, mais vous avez besoin d'un moyen d'extraire les fixations par défaut, pas les fixations courant.

* Il y a des situations où la sortie de list-keys N'est pas actuellement directement utilisable: la liaison pour le point-virgule a besoin de son point-virgule s'est échappé avec une barre oblique inverse pour empêcher son interprétation comme un TMUX Séparateur de commande et toute fixation qui avait des arguments utilisant des citations doubles utilisées Intérieur Single Citations (aucune des liaisons par défaut ne sont comme ceci) sortira comme des citations doubles à l'intérieur double qoutes.

Pour obtenir les liaisons par défaut, vous avez besoin d'un serveur temporaire avec une configuration minimale (c'est-à-dire aucune liaison personnalisée) afin que vous puissiez capturer son list-keys sortir. Il n'y a pas de limite au nombre de tmux Serveurs que vous pouvez exécuter, mais chacun doit utiliser un nom de piste de prise différent; les -L et -S tmux Les options peuvent être utilisées pour spécifier un nom de prise (dans $TMPDIR/tmux-$UID ou piste de socket complet. Donc, parler (ou démarrer) un nouveau serveur sur un socket nommé temp, vous utiliseriez ceci:

tmux -L temp …

Pour vous assurer qu'il n'utilise pas votre .tmux.conf, tu utilises -f Pour le dire de lire /dev/null (un fichier spécial qui est toujours vide):

tmux -f /dev/null -L temp …

NOTE: Cela n'empêche pas le traitement de /etc/tmux.conf, si un tel fichier existe; Le chemin de ce "fichier de configuration du système" est codé dur et il n'ya aucune option pour le contourner (à compter de la correction du code).

Normalement, vous avez besoin d'un new-session Commande de démarrer réellement le serveur, mais nous ne voulons pas de sessions, juste un serveur initialisé à interroger. Les start-server La commande ne fait que: Démarre un serveur sans créer de sessions.

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

Maintenant, nous devons juste ajouter notre commande "Query" (list-keys dans ce cas):

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

Remarque: le point-virgule doit être échappé ou cité pour empêcher la coque de le traiter comme un séparateur de commande shell puisque nous voulons que ce soit un tmux Séparateur de commande .

Comme il n'y a pas de sessions à maintenir, le serveur quitte automatiquement après avoir fini d'exécuter le list-keys commande.

Donc, vous pouvez utiliser une commande comme celle-ci pour générer la majeure partie de votre .tmux.reset.conf sans avoir à vous soucier de retirer temporairement votre .tmux.conf Fichier (pour vous permettre de voir simplement les liaisons par défaut) et sans avoir à éteindre les serveurs existants.


Si la run-Shell La commande était synchrone, vous pouvez intégrer un appel comme celui-ci dans votre fichier de configuration (capturer à un fichier temporaire que vous traiteriez alors avec source-file) au lieu d'avoir un fichier statique (votre .tmux.reset.conf). Cela vous permettrait toujours d'utiliser les liaisons par défaut de votre version actuelle de tmux (les liaisons par défaut changent occasionnellement). Hélas, l'achèvement de la run-Shell La commande est actuellement asynchrone en ce qui concerne les commandes ultérieures (commandes qui viennent après un run-Shell la commande fonctionnera habituellement avant le processus engagé par run-Shell a eu une chance de finir).

7
Chris Johnsen

J'ai demandé en amont Ils ne semblent pas voulus de le réparer (à moins que quelqu'un soumet un PR).

Voici mon échappé manuellement tmux list-keys, obtenu via une nouvelle instance de serveur avec

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

(Merci aux réponses précédentes)

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

Le ci-dessus est sur github afin que vous puissiez faire:

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

Remarque: en quelque sorte Richard Cook's Réponse encore produit des problèmes d'échappement.

4
timotheecour

Veuillez également vous référer aux autres réponses ici, car elles font un bon travail d'explication de la situation. J'ai ici mon tmux 1.8 compatible tmux.reset.conf, que j'ai dû faire plusieurs modifications après avoir copié le tmux -f /dev/null -L temp start-server \; list-keys sortir. En particulier, plusieurs choses devaient être citées.

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