Tere Termの設定の話。

vim からの制御シーケンスの使用例Screenを使用していると使えなくなってしまう。どうやら```vim 4から吐き出された制御シーケンスをScreenが喰ってしまい、Tere Termまで届けてくれないらしい。

ScreenのマニュアルのControl Sequencesを見てみると

[text] ESC \ (A) String Terminator ESC P (A) Device Control String Outputs a string directly to the host terminal without interpretation. [/text]

という記述がある。つまりESC PとESC \で制御シーケンスを囲めば、直接Tere Termに制御シーケンスを送れるということだ。

挿入モードに入った時にカーソル形状を変える

例えば、

[vim] let &t_SI .= “\e[3 q” let &t_EI .= “\e[1 q”


は(※元々のコードは&を忘れているので加えた)

```vim

if &term == "xterm-256color"
let &t_SI .= "\eP\e[3 q\e\\"
let &t_EI .= "\eP\e[1 q\e\\"
elseif &term == "xterm"
let &t_SI .= "\e[3 q"
let &t_EI .= "\e[1 q"
endif

とすればいい。ただし” .screenrcでterm xterm-256colorとしていて、Screenを使ってないとき、$TERMがxtermだとする。

ちなみに挿入モードのとき、下線ではなく、縦線(\e[5 q)にしたかったがこれはVimに問題があってできないっぽい。Vimに問題があるといっているのは試しにzshでecho “\e[5 q”としたときは縦線になるからだ。VimがDECSCUSRに対応していない?terminfoをいじくるとなんとかなる?ScreenはDECSCUSRでなくWYULCURM/WYSTCURM?(Ticket #15850: 制御シーケンスでのカーソル形状の変更 – Tera Term – SourceForge.JP

いわもと こういち様のコメント参照。縦線に出来ました。

&t_SIは挿入モードに入るとき呼び出される変数で、&t_EIは挿入モードからノーマルモードに行く時に呼び出される変数。

クリップボードからの貼り付け時に自動インデントを無効にする

こちらは以下のように.vimrcに書けばよい。


if &term =~ "xterm"
"for screen
" .screenrcでterm xterm-256colorとしている場合
if &term == "xterm-256color"
let &t\_SI = &t\_SI . "\eP\e[?2004h\e\\"
let &t\_EI = "\eP\e[?2004l\e\\" . &t\_EI
let &pastetoggle = "\e[201~"
elseif &term == "xterm"
let &t\_SI .= &t\_SI . "\e[?2004h"
let &t\_EI .= "\e[?2004l" . &t\_EI
let &pastetoggle = "\e[201~"
endif

function XTermPasteBegin(ret)
set paste
return a:ret
endfunction

imap <special> <expr> <Esc>[200~ XTermPasteBegin("")
endif

先ほどと同じように、Screenに対しては\ePと\e\で囲んでいる。挿入モードになるときに Bracketed Paste Modeを有効にする信号をTera Termに送っている。ノーマルモードになるときに無効にしている。

&pastetoggle = “\e[201~”はpastetoggleを行ったときに呼び出される変数?と解釈するとなんか変。むしろ\e[201~(貼付け終了のお知らせ)がVimに送られたらpastetoggleする(貼付けモードの終了)と解釈。こちらは\ePと\e\で囲っていない。Tera TermからVimに送られるので囲まなくて良い。

最後の部分は\e[200~が送られたら貼り付けモードにする設定。こちらはTera TermからVimに送られているので\ePと\e\で囲む必要はない。

もともとの設定ではVim起動時に呼び出される変数&t_tiと終了時に呼び出される変数&t_teにたいして設定されているが、この設定だとスクリーンのどこかでVimを起動すると、他のところでのペーストで制御シーケンス付きついてしまうので変更した。

ちなみにこれらの設定をしたからだろうか。Screenなしの状態でVimをファイル名を指定しないで起動すると32;100;2cという文字が画面上に現れる。特に問題はないが、なぜだろう。[4101] パラメータの評価の順番が他とは違っていて見づらいので IO-8256 関連を書き直した。 (Ttssh2-commit) – Tera Term (テラターム) – SourceForge.JPに32;100;2cの文字列があるのだが、よくわからない。

いわもと こういち様のコメント参照。

リンク

[8]: http://www.xfree86.org/current/ctlseqs.html#Bracketed Paste Mode