vim からの制御シーケンスの使用例

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

Bracketed Paste mode

この機能は xterm 拡張で、有効になっていると、クリップボードからの貼り付け時に文字列の前後に特別なシーケンスを付加するというものです。
具体的には、DECSET の 2004(<CSI>?2004h) で有効になり、貼り付け時に文字列の前に <ESC>200~, 後ろに <ESC>201~ が付くようになります。

IME を制御する

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"

注: この設定を行う場合、"挿入モードでの 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>