vim のコマンドライン上で substitute コマンドを入力するとき、よく使う\(と\)。
置換対象 {pat} の文字列を\(\)でくくった順に、置換後 {sub} に\1\2\3...として参照できる。
たとえば文字列foo-hoge-barをs/\(foo\)-hoge-\(bar\)/\1=\2/で置換するとfoo=barを得られる。
いちいちカッコをエスケープするのが面倒なので、ワンキーで、エスケープされた開き/閉じカッコを入力することにした。
具体的には、現在のコマンドラインに入力されている\(と\)の数を比べて、等しいなら\(そうでないなら\)を返す関数を作り、関数の戻り値を挿入するmap <expr>を利用してマッピングする。
cnoremap <expr> <C-o> EscapedEnclose()
function! EscapedEnclose() let cmdline = getcmdline() let str = '\\(' for n in range(2) let i = 0 while match (cmdline, str, 0, i + 1) != -1 let i += 1 endwhile if n == 0 let str = '\\)' let j = i else if i == j return '\(' else return '\)' endif endif endfor endfunction
この例だと Ctrl-o にマッピングしている。Ctrl-o ひとつで、\( と \) を入力できる。