putty 的行為真是莫名其妙啊!

用 ssh + screen 來當作平時的工作環境已經蠻久了,但從去年起開始不只用 windows 當作工作平台後,情況似乎變得有些複雜,Linux 下我用的是 gnome-terminal,Windows 下則是用由 putty 修改而成的 pietty。在 Windows 下,連回主機只要開一層 screen 就夠,但在 Linux 下,自己的機器上要一層,連回去主機又要一層,變成雙層的 screen。(如下圖)

gnome-terminal_double_screen

兩層 screen 的問題在於,一些原先設定好的快速鍵會重複,而之前一直是以「Ctrl + 左右鍵」來更換主機上的視窗,現在只好讓自己機器的改為「Ctrl + 上下鍵」。這一切看來美好,但其實兩種 terminal 對於 Ctrl + 方向鍵 的處理方式是不同的。(如下表)

Key putty/pietty gnome-terminal
Ctrl + left-arrow ^[OD ^[[1;5D
Ctrl + right-arrow ^[OC ^[[1;5C

所以,理論上我只要設定好兩套 bindkey,理論上就能正常運作:

# putty
bindkey "^[OC" next
bindkey "^[OD" prev

# gnome-terminal
bindkey "^[[1;5C" next
bindkey "^[[1;5D" prev

而實際上這樣也可以運作,不過新的問題是,連我只單純按 left-arrow 或 right-arrow 鍵時,視窗也跟著切換了。

本來以為會不會是 termcap 的問題,查了很久,也亂改一通,當然是沒效;查了系統裡 terminfo,screen 好像有自己的 termcap,但怪的是明明原先的 $TERM 是 xterm,也不是 screen。

原本都打算放棄了,不死心的想在 Linux 上也裝個 putty 來試試,鍵的送出值似乎是沒辦法簡單由設定來修改,但試了幾個後,忽然發現進入 screen 前後,值居然會不同?!(如下表)(gnome-terminal 不會)

Key before screen after screen
Ctrl + left-arrow ^[OD ^[[D
Ctrl + right-arrow ^[OC ^[[C

哎呀~既然值不同了,設定成之前的當然會有問題,所以就把設定改成這樣,就 ok 了:

# putty
bindkey "^[[C" next
bindkey "^[[D" prev

# gnome-terminal
bindkey "^[[1;5C" next
bindkey "^[[1;5D" prev

只能說 putty 搭配 screen 後,迸出了奇怪的火花啊!真是莫名其妙!