dodaの日記: Bracketed Paste Mode 1
Tera Term を Bracketed Paste Mode に対応させてみた。 snapshot-20100509
この機能は xterm での拡張で、有効になっていると、クリップボードからの貼り付け時に文字列の前後に特別なシーケンスを付加するというもの。
具体的には、DECSET の 2004(<CSI>?2004h) で有効になり、貼り付け時に文字列の前に <ESC>200~, 後ろに <ESC>201~ が付くようになる。
# 詳細は ctlseqs.html の DECSET/DECRST および Bracketed Paste Mode を参照
通常、ホスト側のアプリケーション(vi等)はキー入力と貼り付けの区別を付けられないが、Bracketed Paste Mode に端末およびホスト側の双方が対応していれば区別できるようになる。
たとえば、vim の場合は .vimrc に
if &term == "xterm"
let &t_ti = &t_ti . "\e[?2004h"
let &t_te = "\e[?2004l" . &t_te
let &pastetoggle = "\e[201~"
function XTermPasteBegin(ret)
set paste
return a:ret
endfunction
map <special> <expr> <Esc>[200~ XTermPasteBegin("i")
imap <special> <expr> <Esc>[200~ XTermPasteBegin("")
cmap <special> <Esc>[200~ <nop>
cmap <special> <Esc>[201~ <nop>
endif
というような設定を追加すると、貼り付け時は自動インデント等が無効になる。(参考)
また、コマンドモードでも貼り付けを行うと入力モードに切り替わる。この動作が都合悪い場合は、上記設定の map 行を削除すればよい。 追記3参照
この機能は xterm 独自のものだったが、昨年末に vte が対応し、mintty も次の 0.7 から対応するようだ。
上記の vim の設定は対応していない端末でも悪影響は出ないはずなので、対応していない端末エミュレータを使っている場合もとりあえず設定しておくといいかもしれない。
追記:
コマンドラインモードの場合の時に悪影響を与えないように cmap を追加。
追記2:
set compatible していても問題ないように修正。
追記3:
入力モードのみで使う場合は、以下のようにする。
if &term == "xterm"
let &t_SI = &t_SI . "\e[?2004h"
let &t_EI = "\e[?2004l" . &t_EI
let &pastetoggle = "\e[201~"
function XTermPasteBegin(ret)
set paste
return a:ret
endfunction
imap <special> <expr> <Esc>[200~ XTermPasteBegin("")
endif
要点は2点
- Bracketed paste mode の on/off を、起動/終了時ではなく入力モードへの移行/コマンドモードへの復帰時に行うため、t_SI/t_EI を設定する。
- map, cmap は必要なし。(有っても悪影響は無いはず)
コマンドライン (スコア:0)