パスワードを忘れた? アカウント作成
218273 journal

dodaの日記: Bracketed Paste Mode 1

日記 by doda

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 は必要なし。(有っても悪影響は無いはず)
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2010年05月12日 20時03分 (#1762823)
    コマンドラインモードで、通常のペーストをしたいのですが、 どう設定すればよいですか? Yutaka Hirata
typodupeerror

UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている -- あるソフトウェアエンジニア

読み込み中...