キーバインドでscreenコマンドを連続的に操作できるように構築
クラスを用いたキーバインド
例えば以下のようにするとウインドウ間移動をキーバインドすることができます。
bind w command -c window
bind -c window j focus down
bind -c window k focus up
bind -c window h focus left
bind -c window l focus right
bindはキーバインドをするコマンドですが、その次の-c window
はクラスというものデス。
このクラスというのは、「クラスが有効な場合はクラスに割り当てられたキーバインドが優先される」という機能です。
つまりクラスを切り分けることで、同じキーを使いまわすことが可能です。 以下のような例が可能になります。
bind w command -c window
bind -c window j focus down
bind -c window k focus up
bind -c window h focus left
bind -c window l focus right
bind x command -c sizectrl
bind -c sizectrl j resize -v +1
bind -c sizectrl k resize -v -1
bind -c sizectrl h resize -h +1
bind -c sizectrl l resize -h -1
この例ではwindowというクラスとsizectrlというクラスが登場しています。
ctrl+a w
を押すことでwindouクラスが有効になり、ctrl+a x
を押すことでsizectrlクラスが有効になります。
重複しているキーバインドhjkl
はそれぞれのクラスで割与えた役割を果たすようになります。
この状態でもキーバインドとして有効ですが、一回キーを押すと再度クラスを有効にしないといけないです。
windowの移動やサイズ変更などは連続的に操作出来たほうが楽な場合が多いかと思います。
そのため連続的にクラスを有効にし続けるととても便利になります。
連続操作をできるようにするキーバインド
そこで連続操作を実現するためにeval
コマンドを使用します。
bind w command -c window
bind -c window j eval 'focus down' 'command -c window'
bind -c window k eval 'focus up' 'command -c window'
bind -c window h eval 'focus left' 'command -c window'
bind -c window l eval 'focus right' 'command -c window'
ctrl+a w
でクラスを有効にするのは変わっていませんが、その後が変化していますです。
evalコマンドは複数のコマンドをそれぞれ実行するコマンドで、シングルコーティーションで囲まれているのが一つのコマンドという認識になります。
例えばキーバインドj
の場合はfocus down
が動作したあとに、eval
で指定されたコマンドのcommand -c window
が動作します。
つまりctrl+a w
でwindou
クラスを有効にし、j
を押したあともwindou
クラスが有効のままになるということです。
他のキーバインドも同じでクラスを有効にし続けますので、必然的に連続してwindowの移動やサイズ変更が可能になります。
今回の例ではクラス有効状態から抜けたい場合は、ESCキーを押します。
もしくは何かのキーにクラスを指定しないcommand
をキーバインドする手もあります。 例ではq
に空のcommand
をバインドしています。
bind q command
これでqが押されるとクラスがデフォルトに戻るので結果的にクラス有効状態から抜けることができます。
@MINOはキーを潰したくなかったので、ESCを使っていますが、好みかと思います。
後記
連続的に操作が行えるのってなかなか便利ですね。