キーのバインドを解除しないtmux構成のリロード(バインドキーは累積的です)


33

さまざまなtmuxキーバインド設定を試してきましたが、次のことに気付きました。

(tmux内から)tmux構成を再ロードすると、一度ロードしたキーバインドはロードされたままになります。これをクリーンアップする唯一の方法(知っている)は、すべてのtmuxセッションを終了して再起動することです。そのため、tmuxは以前にロードされたすべてのキーバインドを記憶しており、新たに起動するか明示的にバインドを解除することでのみ削除します。

これを再作成するには:

  • ターミナルを開きます(A)
  • tmuxを開始します
  • キーバインドに時計が表示されているかどうかを確認します(を押しますPREFIX C-t
  • を押しPREFIX ?て、リストにキーバインドを表示します
  • 編集する ~/.tmux.conf
  • キーバインドを追加(bind C-t display "Keybinding C-t"
  • tmux構成の再読み込み(PREFIX : source-file ~/.tmux.conf
  • キーバインドが機能するかどうかを確認します(を押しますPREFIX C-t
  • を押しPREFIX ?て、リストに新しいキーバインドを表示します
  • ~/.tmux.confもう一度編集する
  • キーバインドを削除します(削除しますbind C-t display "Keybinding C-t"
  • tmux構成の再読み込み(PREFIX : source-file ~/.tmux.conf
  • キーバインディングが機能するかどうかを確認します(を押しますPREFIX C-t)。それでも「Keybinding Ct」が表示されます
  • を押しPREFIX ?て、新しいキーバインディングがまだリストにあることを確認します
  • tmuxを終了します
  • tmuxを入力します
  • 元のキーバインドが再び機能するかどうかを確認します(を押しますPREFIX C-t)。これで、時計が再び表示されるはずです。
  • を押しPREFIX ?て、新しいキーバインドがリストから削除されたことを確認します

私の質問:tmuxに、ロードされたすべての構成を「忘れ」てからロードするように指示する方法はあります.tmux.confか?

回答:


19

tmux(1)manページによると、unbind-key -aあなたが探しているものです。

tmuxすべてのセッションが閉じられたときにのみ終了するサーバーを実行し、キーバインディングがサーバーごとに実行されることに注意してください。したがって、バインディングを作成すると、すべてのクライアントのデタッチに対して永続的になります。

とは言っても、unbind-key -a設定ファイルの一番上に置くと、設定の再読み込み時に必要な処理が行われます。すべてのバインドを解除し、最初からバインドを開始します。または-変更が小さい場合は、変更したいものだけをバインド解除します。


はい、すでに質問の中で述べています。ただし、バインドされている可能性のあるすべてのキーを手動で「リセット」する代わりに、「クリーンな状態」でtmuxを再起動してから、構成ファイルをリロードしてください。
ニールズボン

@NielsBomチェックの回答を更新してください
ペテルフ

あなたは正しいです、unbind-key -aすべてのキーバインドを削除します。あなたの答えを正しいとマークしますが、他の視聴者のために、問題を修正するために適用した「ハック」も追加しunbind-key -aます。
ニールズボン

私の解決策に対する私の答えをご覧ください。
ニールズボン

16

正しい解決策(ピーターによる

したがって、@ peterphは次のことを行う正しい答えを出しましたunbind-key -a:(man tmux)

-aが存在する場合、すべてのキーバインディングが削除されます。

実行可能なソリューション

問題(私にとって)は、「すべて」が実際にはすべてを意味するということです。キーバインディングを含むtmuxにはが付属しています。unbind-key -atmuxコマンドをすぐに実行すると、キーバインドがまったくなくなるため、コマンドモードに入ることも基本的には何もできなくなります。

これに対する私の(ややい)修正は次のとおりです。

  • 作成し.tmux.reset.conf、すべてのキーバインドを削除し、それがデフォルトで持っているtmuxのすべてのものを再バインド
  • あなたの上部でリセットするソース .tmux.conf

私の.tmux.conf

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

私の.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

これは、tmuxキーテーブル(私が知る限り)で動作するように見えましたが、新しいキーテーブルを追加することはできません。


1
「クリーン」セッションで.tmux.reset.conf実行することにより、同等のものを迅速に生成できる可能性がありますtmux list-keys
jw013

2
tmux -f /dev/null -L temp start-server \; list-keysデフォルトを効果的に生成します(ただし、バインディングのセミコロンの前にバックスラッシュを追加する必要があります)。
クリスジョンセン

@ChrisJohnsen別の回答でstart-serverについて詳しく説明してもらえますか?
ニールズボン

7

現在、キーのバインディングをデフォルトにリセットする直接的な方法はありません。デフォルトのバインディング(in key_bindings_init())の初期化は、tmuxサーバーが最初に(in server_start())起動したときに1回行われ、単一のキーをリセットするメカニズムはありません。

以前以来、コンフィギュレーションファイルから削除されたことカスタムバインディングによって上書きされたことデフォルトのバインディングを再確立するために、あなたの設定ファイルをソースの行為をしたいご希望のシナリオでは、あなたが考案された方法は、(ただし、残念ながら冗長)合理的です:unbind-key -a、次に、すべての「デフォルト」バインディングを再確立し、カスタムバインディングを確立します(一部は「デフォルト」バインディングをオーバーライドする場合があります)。

サーバーの現在のバインディングは、list-keysコマンド*で抽出できます。これは提案された.tmux.reset.confファイルを生成/維持するのに役立ちますが、現在のバインディングではなくデフォルトのバインディングを抽出する方法が必要です

*の出力は、いくつかの状況があるlist-keysセミコロンのための結合はそのセミコロンとして解釈されることを防ぐためにバックスラッシュでエスケープ必要があります。現在は直接使用できないtmuxは、コマンドセパレータ、および内部の二重引用符を使用し、引数持っていたすべてのバインディングシングル引用符(デフォルトのバインディングはどれもこのようなものではありません)は、二重引用符内で重引用符として出力されます。

デフォルトのバインディングを取得するには、list-keys出力をキャプチャできるように、最小限の構成(つまり、カスタムバインディングなし)の一時サーバーが必要です。実行できるtmuxサーバーの数に制限はありませんが、それぞれが異なるソケットパス名を使用する必要があります。tmuxのオプションは、ソケット名を(指定するために使用することができますまたは完全なソケットパス名それでは、と話(または起動する)という名前のソケットに新しいサーバー。、あなたがこれを使用します。-L-S $TMPDIR/tmux-$UIDtemp

tmux -L temp …

を使用しないようにするには.tmux.conf、を使用-fして読み取りを指示します/dev/null(常に空の特別なファイル)。

tmux -f /dev/null -L temp …

:この/etc/tmux.confようなファイルが存在する場合、これはの処理を妨げません。この「システム構成ファイル」へのパスはハードコードされており、それをバイパスするオプションはありません(コードにパッチを適用する以外)。

通常、new-session実際にサーバーを起動するためのコマンドが必要ですが、セッションは必要ありません。初期化されたサーバーが照会するだけです。このstart-serverコマンドは、セッションを作成せずにサーバーを起動します。

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

ここで、「クエリ」コマンドを追加するだけです(list-keysこの場合)。

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

:セミコロンをエスケープまたは引用符で囲む必要があります。これは、シェルがtmuxコマンドセパレーターになりたいため、シェルがシェルコマンドセパレーターとして扱わないようにするためです。

維持するセッションがないため、サーバーはlist-keysコマンドの実行が終了すると自動的に終了します。

そのため、このようなコマンドを使用して.tmux.reset.conf.tmux.confファイルを一時的に削除することを心配することなく(デフォルトのバインディングのみを表示するため)、既存のサーバーをシャットダウンすることなく、大部分を生成できます。


場合はrun-shell、コマンドは同期だったあなたは(あなたが、その後で処理することを一時ファイルにキャプチャし、あなたの設定ファイルにこのような呼び出しを埋め込むことができsource-file)の代わりに、静的なファイル(あなたを持ちます.tmux.reset.conf)。これにより、tmuxの現在のバージョンのデフォルトバインディングを常に使用できます(デフォルトバインディングはときどき変更されます)。残念ながら、run-shellコマンドの完了は現在、後続のコマンドに対して非同期です(コマンドの後に来るrun-shellコマンドは、通常、生成されたプロセスrun-shellが終了する前に実行されます)。


6

以下.tmux.reset.confは、デフォルトのキーバインディングから自動的に生成されるbashスクリプトへの他のすべての回答のロールアップです。

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

埋め込みsedコマンドラインは、からの出力のさまざまな部分をエスケープしlist-keysます。これには、システムの詳細を調整する必要がある場合があります。

あなたには.tmux.conf、独自のキーバインディングを定義する前に、すべてのキーとソースこのファイルを単にアンバインドファイル:

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

4

また、状況を説明する上で良い仕事をしているので、他の回答も参照してください。ここにtmux 1.8互換のtmux.reset.confがあり、tmux -f /dev/null -L temp start-server \; list-keys出力をコピーした後にいくつかの変更を行う必要がありました。特に、いくつかのことを引用する必要がありました。

# 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

私はアップストリームに、彼らはそれを修正する気がないようだと尋ねた(誰かがPRを提出しない限り)。

これは、手動でエスケープされたtmux list-keysで、新しいサーバーインスタンスから取得します。

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

(以前の回答のおかげで)

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

上記はgithubにあるため、次のことができます。

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

注:どういうわけか、リチャードクックの答えは依然として逃亡の問題を生み出しました。


unix.SEへようこそ!私たちはしばしば単純なリンクを心配しているので、ここに直接貼り付けました(ただし、参照用にリンクを保持しました)。これがこの辺りの好ましい方法です。リンクは死にます(それはgithubです!しかし、それでもいつか死ぬかもしれません)。とにかくそれは良い答えです(+1)。Richardのsedコードを使用して問題を解決できた方が良いかもしれません。それは1年前であり、tmuxには100%後方互換性がないという悪い習慣があります。
grochmal

2

以下は、tmux 2.1でのエスケープの問題を修正するためのRichard Cookの回答の微調整バージョンです。

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

次の行を .tmux.conf

unbind-key -a
source-file ~/.tmux.reset.conf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.