Ctrl+左右キーでscreenのウィンドウ切り替えをする

GNU screenでウィンドウを切り替えるときに、本来なら C-a p や C-a n を入力するのですが、キーの位置が直感的でなく、2回キーを押さなければならなかったりと、なかなか馴染めませんでした。
そこで、調べてみたところ、この機能を割と簡単に Ctrl + 左右キーや、Alt + 左右キーに割り当てられることが分かりました。

まず Ctrl + 左右キーに割り当てる方法です。
.screenrc に次のように書きます。^[ は普通に ^ と [ を入力すれば大丈夫です。

bindkey "^[[C" next # Ctrl + Right
bindkey "^[[D" prev # Ctrl + Left

この ^[[C という文字列がどうして分かったかというと、ググって出てきた文字列をそのまま採用したわけですが(汗)、tail コマンド実行中など、カーソルキーを受け付けないモードの時にカーソルキーを押すと、これと同じような文字列を確認することができます。
例えば右キーだと、

^[[C

Ctrl + 右キーだと

^[OC

Alt + 右キーだと

^[^[[C

Ctrl + Alt + 右キーだと

^[^[OC

となります。

なんとなく規則性が見えますね。
ただ、.screenrc の bindkey で設定する値と、Ctrlキーの押す押さないが逆なのが気になります。

さて、これがどこで定義されているのかというと、infocmp というコマンドで確認することができます。

$ infocmp | grep kcu
kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,

たくさん出て来るので grep して省略してありますが、この4つが上下左右のキーを押したときの値を決めています。
これを見ると、右キーである kcuf1 の値は \EOC つまり ^[OC なので、先ほどの tail コマンドで確認したときと逆。つまり .screenrc の bindkey で設定する値の逆の逆で、同じことになりますね。

tail コマンドで確認したときになぜ逆になるのかは分かりませんが、なんとなく見えてきました。
これを応用して、Altキーを使ってウィンドウを切り替えたい場合は、次のようにすればいいと分かります。

bindkey "^[^[OC" next # Alt + Right
bindkey "^[^[OD" prev # Alt + Left

ところで、この方法について検索すると、次のような命令を .screenrc に書くように指示している記事もあります。

termcapinfo xterm* "ks=\E[?1l\E:ku=\E[A:kd=\E[B:kl=\E[D:kr=\E[C"

これを書くと、先ほど tail で試したときのように、screen に対してCtrlキーの効きが逆になります。(確認できたのは screen に対してであって、tail で試しても逆にはなりませんでした。)
なので、^[[C を指定してしまうと、右キーを押しただけでウィンドウが切り替わってしまいます。
こうなると、.screenrcを編集し直すのも大変ですが、vim なら hキーと lキーでカーソルを移動できます。あるいは、Ctrlキーを押しながらカーソルキーを押しても大丈夫なようです。それでなんとか編集し直して下さい。

さて、この謎の指定ですが、termcapinfoというのは、先ほど確認した infocmp で見られる情報を変更する命令です。
ku、kd、kl、krがそれぞれ、上、下、左、右のキーを表しています。
ここのページを見ると、ksはキーパット送信モードにするという意味らしいのですが、それと Ctrlキーとの関係や、どう効果があるのかは分かりませんでした。

ひとまず今日調べて分かったのはここまで。
次は vim でも同じようにして、修飾キー + カーソルキーでタブやバッファを切り替えられるようにしたいのですが、こっちはだいぶ難しそうです。

2 thoughts on “Ctrl+左右キーでscreenのウィンドウ切り替えをする

  1. yuuAn 投稿作成者

    Alt + Right を入力した時に ^[^[OC を送るのは PuTTY を使った場合の仕様で、Xterm では ^[[1;3C を送るらしいです。
    PuTTY でも Xterm と同じように ^[[1;3C を送るようにするための設定方法が、iceiv+putty のサイトに載っていました。

  2. ピンバック: PuTTY+tmux 環境で Ctrl+矢印 が効かなかった原因が解ったかも | yuuAn's Note

コメントを残す