2016/10/18 21:09:24

ターミナルマルチプレクサscreenでキーバインドを連続的に操作する

目次(クリックするとジャンプします)
  • 1:キーバインドでscreenコマンドを連続的に操作できるように構築
  • 1.1:クラスを用いたキーバインド
  • 1.2:連続操作をできるようにするキーバインド
  • 2:後記

キーバインドで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コマンドは複数のコマンドをそれぞれ実行するコマンドで、シングルコーティーションで囲まれているのが一つのコマンドという認識になります。

例えばキーバインドの場合はfocus downが動作したあとに、evalで指定されたコマンドのcommand -c windowが動作します。

つまりctrl+a wwindouクラスを有効にし、を押したあともwindouクラスが有効のままになるということです。

他のキーバインドも同じでクラスを有効にし続けますので、必然的に連続してwindowの移動やサイズ変更が可能になります。

今回の例ではクラス有効状態から抜けたい場合は、ESCキーを押します。

もしくは何かのキーにクラスを指定しないcommandをキーバインドする手もあります。 例ではqに空のcommandをバインドしています。

bind q command

これでqが押されるとクラスがデフォルトに戻るので結果的にクラス有効状態から抜けることができます。

@MINOはキーを潰したくなかったので、ESCを使っていますが、好みかと思います。

後記

連続的に操作が行えるのってなかなか便利ですね。