牢獄機械文書群 目次 » 計算機 » 現在地
メタキャラクタ \(\) をワンキーで入力
2012-05-13 02:54

vim のコマンドライン上で substitute コマンドを入力するとき、よく使う\(\)

置換対象 {pat} の文字列を\(\)でくくった順に、置換後 {sub} に\1\2\3...として参照できる。

たとえば文字列foo-hoge-bars/\(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 ひとつで、\( と \) を入力できる。

« もどる
inserted by FC2 system