Tmux config 'in yeniden yüklenmesi tuşları çözmüyor (bind-key kümülatif)


33

Farklı tmux klavye ayarları ile denemeler yaptım ve aşağıdakileri farkettim:

Eğer tmux config'imi yeniden yüklersem (tmux içinden) bir zamanlar yüklediğim anahtarlıklar yüklenmeye devam eder. Bunu temizlemenin (bildiğim) tek yolu tüm tmux oturumlarını bırakmak ve yeniden başlatmak. Bu yüzden tmux daha önce yüklenmiş olan bütün anahtar zincirlerini hatırlıyor ve sadece yeni bir başlangıçta veya açıkça açarak bunları kaldıracak gibi görünüyor.

Bunu yeniden oluşturmak için:

  • bir terminal açmak (A)
  • tmux'u başlat
  • klavyenin bir saat gösterip göstermediğini kontrol edin (basın PREFIX C-t)
  • PREFIX ?tuş takımını listede görmek için tuşuna basın .
  • Düzenle ~/.tmux.conf
  • bir anahtarlık ekle ( bind C-t display "Keybinding C-t")
  • tmux config ( PREFIX : source-file ~/.tmux.conf) öğesini yeniden yükle
  • tuş takımının çalışıp çalışmadığını kontrol edin (basın PREFIX C-t)
  • PREFIX ?Yeni tuş takımını listede görmek için tuşuna basın .
  • ~/.tmux.conftekrar düzenle
  • klavyeyi çıkarın (yani çıkarın bind C-t display "Keybinding C-t")
  • tmux config ( PREFIX : source-file ~/.tmux.conf) öğesini yeniden yükle
  • tuş takımının çalışıp çalışmadığını kontrol edin (düğmesine basın PREFIX C-t)
  • PREFIX ?Yeni tuş takımının hala listede olduğunu görmek için tuşuna basın .
  • tmux'dan çık
  • tmux'u girin
  • orijinal tuş takımının tekrar çalışıp çalışmadığını kontrol edin (basın PREFIX C-t), şimdi tekrar bir saat göstermelidir
  • PREFIX ?yeni tuş takımının listeden kaldırıldığını görmek için tuşuna basın .

Sorum şu: tmux'a tüm yüklü yapılandırmaları "unutup" yüklemeyi ve sonra yükleme yapmasını bildirmenin bir yolu var .tmux.confmı?

Yanıtlar:


19

tmux(1)Man sayfasına göre unbind-key -a, aradığın şey.

tmuxTüm oturumlar kapatıldıktan ve anahtar bağlantıları sunucu başına olduktan sonra çıkacak bir sunucu çalıştığını unutmayın . Bu nedenle, bir kez bağlayıcı oluşturduğunuzda, tüm müşteri bağlantılarında kalıcı olacaktır.

Bununla birlikte, unbind-key -ayapılandırma dosyanızın en üstüne koyun ve yeniden yapılandırmak istediğinizde yapmalı - herşeyin bağlantısını kaldırın ve sıfırdan ciltlemeye başlayın. Veya - değişiklikleriniz daha küçükse - yalnızca değiştirmek istediklerinizi kaldırın.


Evet ve sorumu zaten söyledim. Ancak tüm olası anahtarları manuel olarak "sıfırlamak" yerine, tmux'un "temiz bir sayfa" ile yeniden başlatılmasını ve ardından config dosyasını yeniden yüklemesini istiyorum.
Niels Bom

@NielsBom güncellenmiş cevabı kontrol edin lütfen
peterph

Haklısın, unbind-key -atüm anahtar bağlantıları kaldırır. Cevabınızı doğru olarak işaretleyeceğim, ancak diğer izleyiciler için bir sorunu çözmek için uyguladığım "hack" i de ekleyeceğim unbind-key -a.
Niels Bom

Çözümüm için cevabımı gör.
Niels Bom

16

Doğru çözüm (Peter tarafından

Böylece @peterph, aşağıdakileri yapan doğru cevabı verdi unbind-key -a: (man tmux)

-A varsa, tüm anahtar bağlantıları kaldırılır.

Uygulanabilir bir çözüm

Sorun (benim için) "hepsi" nin gerçekte hepsi anlamına gelmesidir. Tuş takımları dahil tmux ile birlikte geliyor . Eğer unbind-key -atmux komutunu anında çalıştırırsanız, artık hiçbir tuşa sahip olamaz, bu yüzden komut moduna bile giremezsiniz ya da temelde bir şey yapamazsınız.

Bunun için benim (oldukça çirkin) düzeltmem şudur:

  • Bir oluşturmak .tmux.reset.confsonra tüm tuş atamaları kaldırır ve varsayılan olarak bulunur tmux bütün olanları rebinds
  • üstündeki sıfırlanan kaynak .tmux.conf

Benim .tmux.conf:

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

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

Bu tür tmux anahtar tablolarıyla çalışmış gibi görünüyordu (söyleyebileceğim kadarıyla) ama yeni anahtar tabloları ekleyemezsiniz.


1
Bir "temiz" oturumda .tmux.reset.confçalıştırarak eşdeğerinizi hızlı bir şekilde oluşturabilirsiniz tmux list-keys.
jw013

2
tmux -f /dev/null -L temp start-server \; list-keysetkin bir şekilde varsayılanları oluşturacaktır (bağlayıcıda noktalı virgülden önce bir ters eğik çizgi eklemeniz gerekir).
Chris Johnsen

@ChrisJohnsen Ayrı bir cevapta lütfen başlangıç ​​sunucusunda ayrıntılı bilgi verebilir misiniz?
Niels Bom

7

Bir anahtarın bağlamasını varsayılan ayarlarına sıfırlamanın doğrudan bir yolu yoktur; tmux sunucusu ilk kez başlatıldığında (in ) varsayılan bağlamaların (in key_bindings_init()) başlatılması bir kez yapılır ve tek bir anahtarı sıfırlama mekanizması yoktur.server_start()

Daha önce beri yapılandırma dosyasından silindiğini bağlama özel bir tarafından geçersiz olduğunu bağlayıcı varsayılan yeniden kurmak için yapılandırma dosyasını kaynak eylemini istediğiniz istenen senaryo için, icat yöntemi (gerçi maalesef ayrıntılı) makul: unbind-key -a, sonra tüm “varsayılan” bağlantıları yeniden kurun, sonra özel ciltlerinizi oluşturun (bazıları “varsayılan” bir bağlayıcıyı geçersiz kılabilir).

Bir sunucunun mevcut bağlantıları *list-keys komutu ile çıkarılabilir ; bu, önerilen dosyanızı oluşturmanıza / korumanıza yardımcı olabilir , ancak geçerli bağlantıları değil, varsayılan bağlantıları çıkarmak için bir yola ihtiyacınız var ..tmux.reset.conf

* list-keysÇıktısının şu anda doğrudan kullanılamadığı bazı durumlar vardır : noktalı virgül için bağlayıcı, bir tmux komut ayırıcısı olarak yorumlanmasını önlemek için ters eğik çizgiyle kaçış noktalı virgülünü ve tekli içinde çift tırnak kullanan argümanları olan bağları kaldırmasını gerektirir. tırnak (varsayılan bağlamaların hiçbiri böyle değildir), çift tırnak içinde çift tırnak olarak çıkar.

Varsayılan ciltleri elde etmek için, minimum bir konfigürasyona sahip (yani özel ciltleme yok) geçici bir sunucuya ihtiyacınız vardır, böylece list-keysçıktısını alabilirsiniz. Çalıştırabileceğiniz tmux sunucularının sayısında bir sınır yoktur , ancak her birinin farklı bir soket yol adı kullanması gerekir; -Lve -S tmux seçenekleri de soket adını (belirtmek için kullanılabilir $TMPDIR/tmux-$UID. adında bir soket üzerinde yeni bir sunucu) konuş, ya da tam soket yol adını So (veya başlangıç temp, bunu kullanırsınız:

tmux -L temp …

Emin senin kullanmaz hale getirmek için .tmux.conf, kullandığınız -fokumak için söylemek /dev/null(her zaman boş olan özel bir dosyayı):

tmux -f /dev/null -L temp …

Not : Bu, /etc/tmux.confböyle bir dosyanın varlığının işlenmesini engellemez ; Bu “sistem konfigürasyon dosyası” nın yolu kodlanmış ve onu atlamak için bir seçenek yok (kodun eklenmesi).

Normalde, new-sessionsunucuyu gerçekten başlatmak için bir komut gerekir , ancak herhangi bir oturum istemiyoruz, yalnızca başlatılmış bir sunucuyu sorgulamak istiyoruz. start-serverHerhangi oturumları yaratmadan bir sunucu başlar: komut yok sadece.

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

Şimdi, sadece "query" komutumuzu eklememiz gerekiyor ( list-keysbu durumda):

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

Not : Kabuğun bir tmux komut ayırıcısı olmasını istediğimizden, kabuğun bir kabuk komut ayırıcı olarak işlem görmesini önlemek için noktalı virgülün kaçması veya alıntılanması gerekir .

Korunacak oturum olmadığından, list-keyskomutu çalıştırmayı bitirdikten sonra sunucu otomatik olarak kapanacaktır .

Böylece, dosyalarınızı .tmux.reset.confgeçici olarak kaldırma konusunda endişelenmenize gerek kalmadan .tmux.conf(yalnızca varsayılan bağlantıları görebilmeniz için) ve mevcut sunucuları kapatmadan endişelenmenize gerek kalmadan , bunun gibi bir komut kullanabilirsiniz .


run-shellKomut senkronize olsaydı, böyle bir çağrıyı source-file, statik bir dosyaya (sizin .tmux.reset.conf) koymak yerine, konfigürasyon dosyasına (sonradan işleyeceğiniz geçici bir dosyaya yakalayarak) gömebilirsiniz . Bu, her zaman geçerli tmux sürümünüzden varsayılan bağlayıcıları kullanmanıza izin verir (varsayılan bağlayıcılar zaman zaman değişir). Ne yazık ki, run-shellkomutun tamamlanması sonraki komutlarla ilgili olarak şu anda asenkrondir (bir run-shellkomuttan sonra gelen komutlar genellikle tarafından oluşturulan süreç run-shellbitirme şansına sahip olmadan önce çalışacaktır ).


6

Diğer tüm cevapların .tmux.reset.conf, varsayılan anahtar bağlantılarından otomatik olarak oluşturacak olan bir bash betiğine çevrilmesi :

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

Gömülü sedkomut satırı çıktının çeşitli kısımlarından kaçmayı önemser list-keys. Bu, sisteminizin özellikleri için biraz ince ayar yapılması gerekebilir.

Senin içinde .tmux.confkendi tuş bağları tanımlamadan önce tüm tuşları ve kaynağı bu dosyayı basitçe unbind dosyası:

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

4

Lütfen durumu açıklamada iyi bir iş çıkardıklarından, buradaki diğer cevaplara da bakınız. Burada çıktımı kopyaladıktan sonra birkaç değişiklik yapmak zorunda kaldığım tmux 1.8 uyumlu tmux.reset.conf var tmux -f /dev/null -L temp start-server \; list-keys. Özellikle, birkaç şeyin alıntılanması gerekiyordu.

# 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

Yukarıya doğru sormak istemiyorlardı (birisi PR göndermediği sürece).

İşte benim manuel olarak kaçtı tmux list-keys, ile yeni bir sunucu örneği ile elde edilir

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

(önceki cevaplar sayesinde)

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

Yukarıdakiler github'dadır, yani:

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

NOT: Bir şekilde Richard Cook'un cevabı hala kaçan sorunlar ortaya çıkardı.


Unix.SE'ye Hoşgeldiniz! Sık sık düz bağlantılar konusunda dikkatliyiz, bu yüzden doğrudan buraya yapıştırdım (ancak bağlantı için referansı tuttum). Buralarda tercih edilen yol budur. Bağlantılar ölür (Biliyorum, github! Ama yine de bir noktada ölebilir). Her neyse, iyi bir cevap (+1). Eğer sorunu Richard'ın koduyla düzeltmeyi başarabilirsen belki daha iyi olabilirdi. Bu bir yaşında ve tmux'un% 100 geriye dönük olmama alışkanlığı var.
grochmal

2

İşte tmux 2.1'deki kaçan sorunları gidermek için Richard Cook'un cevabının ince bir versiyonu

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

Başlangıcına aşağıdaki satırları ekle .tmux.conf

unbind-key -a
source-file ~/.tmux.reset.conf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.