過去に設定して設定ファイルから消したキーバインドをちゃんと消す方法【tmux】


はじめに
--------

最近tmux使い始めて、キーバインドの設定とかいろいろ試してみています。

一発で現在の設定内容をリロードする方法として有名なのは

```
<Prefix> + r => reload config file
bind-key r source-file ~/.tmux.conf \; display "Reloaded!"
```

として`~/.tmux.conf`に書いておく方法です。便利ですね。

さて、本題ですが、そうやって設定ファイルで何度もキーバインドを変更していると、過去に設定して今は削除したキーバインドが生きたままになっていることに気づくかと思います。これは大変困ります。キーバインドを設定ファイルから消すたびにunbind-keyを増やしていたのでは、面倒くさくてかないません。そこで調べてみたのですが、

* [keyboard shortcuts - Reload of tmux config not unbinding keys (bind-key is cumulative) - Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/57641/reload-of-tmux-config-not-unbinding-keys-bind-key-is-cumulative)

というのを見つけたので、共有しておきます。


どうするか
----------

`~/.tmux.conf`に

```
unbind-key -a
```

と書いておくと、**すべての**キーバインドが無効になります(see `man tmux`)。ここで注意する必要があるのが、本当にすべてのキーバインドを無効にするので、自分でキーバインドを設定していないのにこれを書いてしまうと『詰む』ということです。なので、これと合わせてtmuxのデフォルトの設定をすべてコピペしておきましょう。この時点で絶対使いたくないキーバインドがあればコメントアウトしてしまえばいいです。

tmuxのデフォルトのキーバインドを以下に載せておきます(エスケープが必要なものは調整済み)。以下を`~/.tmux/conf`の他のキーを設定する前の行(できるだけ上)にコピペしておけば、あとはこれらの行をコメントアウトしたり、自分のキーバインドを下に追加したりしていけば、設定ファイルに書かれていないキーバインドは全部無効になってくれます。少し設定ファイルは長くなりますが、自分が何をやっているのかがちゃんと分かるようになるので、その点ではむしろ良いことだと思います。

```
# unbind *all* keybindings
unbind-key -a

# 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が予期しない動きをするたびに`unbind-key`を追加する苦行から開放された。とってもいい感じ。