Tera Term では、制御シーケンスを使用する事によってホスト側から Tera Term の動作を変更したりする事が出来ます。 ここでは vim からこれらの制御シーケンスを活用する為の設定例を紹介します。
Tera Term では、以下のカーソル表示状態変更制御シーケンスに対応しています。
略称 | シーケンス | 機能 |
---|---|---|
DECTCEM | ESC [ ? 25 h | カーソルを表示状態にする |
ESC [ ? 25 l | カーソルを非表示状態にする | |
DECSCUSR | ESC SP 0 q | カーソル形状を箱型で点滅状態にする |
ESC SP 1 q | カーソル形状を箱型で点滅状態にする | |
ESC SP 2 q | カーソル形状を箱型で点灯(非点滅)状態にする | |
ESC SP 3 q | カーソル形状を下線で点滅状態にする | |
ESC SP 4 q | カーソル形状を下線で点灯(非点滅)状態にする | |
ESC SP 5 q | カーソル形状を縦線で点滅状態にする | |
ESC SP 6 q | カーソル形状を縦線で点灯(非点滅)状態にする | |
WYSTCURM | ESC [ 33 h | カーソルを点灯(非点滅)状態にする |
ESC [ 33 l | カーソルを点滅状態にする | |
WYULCURM | ESC [ 34 h | カーソル形状を下線にする |
ESC [ 34 l | カーソル形状を箱型にする | |
(AT&T 610) | ESC [ ? 12 l | カーソルを点灯(非点滅)状態にする |
ESC [ ? 12 h | カーソルを点滅状態にする |
これらの制御シーケンスを挿入モードに入る時 (t_SI 設定) および挿入モードから出る時 (t_EI 設定) に出力する事で、挿入モードでのカーソル形状を変更できます。
例えば .vimrc に以下の設定を追加すると、挿入モードに入った時にカーソル形状が下線で点滅に、挿入モードから出た時に箱型で点滅に変わるようになります。
let t_SI .= "\e[3 q" let t_EI .= "\e[1 q"
注: DECTCEM 以外の制御シーケンスを使うには、Additional Settings ダイアログの Control sequence タブに有る Cursor control sequence を on にする必要があります。(デフォルトは off)
通常、ホスト側のアプリケーション (vim 等) からは、ユーザのキー入力とクリップボードからの貼り付けを区別できません。 しかし xterm の拡張機能である Bracketed Paste Mode を利用するとこれらを区別出来るようになるため、クリップボードからの貼り付け時は動作を変える事ができます。
.vimrc に以下の設定を追加すると、クリップボードからの貼り付け時に自動で set paste を実行して、自動インデントや補完等が無効になります。
if &term == "xterm" let &t_ti .= "\e[?2004h" let &t_te .= "\e[?2004l" let &pastetoggle = "\e[201~" function XTermPasteBegin(ret) set paste return a:ret endfunction map <special> <expr> <Esc>[200~ XTermPasteBegin("0i") imap <special> <expr> <Esc>[200~ XTermPasteBegin("") cmap <special> <Esc>[200~ <nop> cmap <special> <Esc>[201~ <nop> endif
この機能は xterm 拡張で、有効になっていると、クリップボードからの貼り付け時に文字列の前後に特別なシーケンスを付加するというものです。
具体的には、DECSET の 2004(<CSI>?2004h) で有効になり、貼り付け時に文字列の前に <ESC>200~, 後ろに <ESC>201~ が付くようになります。
Tera Term では IME の状態を制御する為の独自の制御シーケンスをサポートしています。 この制御シーケンスを利用すれば、モードにより IME の有効/無効を切り替えるといった事が出来るようになります。
.vimrc に以下の設定を追加すると、挿入モードから抜けた時に IME をオフにし、再度挿入モードに入った時に IME の状態を元に戻すようになります。
let &t_SI .= "\e[<r" let &t_EI .= "\e[<s\e[<0t" let &t_te .= "\e[<0t\e[<s" set timeoutlen=100
timeoutlen の設定は、挿入モードで ESC キーを押してから実際に挿入モードを抜ける(IME がオフになる)までの時間を調整しています。
この値を短くすれば ESC キーを押してから IME がオフになるまでの時間が短くなりますが、 遅い回線を使っている時などにカーソルキーやファンクションキーが正しく働かないというトラブルが起きる事があります。
また ESC キーを押した後の遅れを減らすには"挿入モードでの ESC キーを押した後の待ちを無くす"の設定を利用する方法もあります。
Tera Term や xterm 等の端末エミュレータでは、ESC キーが押された時に ESC (0x1b) を送信します。また、カーソルキーやファンクションキー等が押された時に ESC で始まる文字列を送信します。
この為、ホスト側のアプリケーションでは ESC を受信しても、それだけでは ESC キーが押されたのか、それともカーソルキーやファンクションキーが押されたのか区別する事が出来ません。
そこで vim では ESC を受信した時は 1 秒ほど待ち、他の文字が送られてこないか、送られてきた場合はカーソルキー等を表す文字列になるかどうかで、ESC キーが押されたのか、それともカーソルキー等が押されたのかを判別します。
この為、挿入モードで ESC キーを押されてから実際に挿入モードを抜けるのが 1 秒程遅れます。
これにより、モードによりカーソル形状を変える設定や IME を制御する設定を行っても、状態が反映されるのが遅れます。
この問題は Application Wheel Mode を使う事で回避できます。 .vimrc に以下の設定を追加すると、挿入モードで ESC キーを押した時に待たずにすぐに挿入モードを抜けるようになります。
let &t_SI .= "\e[?7727h" let &t_EI .= "\e[?7727l" inoremap <special> <Esc>O[ <Esc>