vim: 現在のブロック内のバランスのとれた括弧で WORD を一致させる

vim: 現在のブロック内のバランスのとれた括弧で WORD を一致させる

vim でマッチングを行う際には、単語、WORD、ブロックなどがあります。コード編集では、ブロックは便利で、単語も多少は便利ですが、WORD はほとんど役に立ちません。なぜなら、WORD には、 、 、 などの開き括弧や閉じ括弧が含まれることが多い()から{}です[]

だから私は単語を一致させたいのです

  • 現在のブロック内の文字のみ、それ以外は
  • 完全な単語(必要な場合は複数)と
  • 完全なブロック(不均衡な括弧はありません)。

たとえば、次のコード行を考えてみましょう。

if (array42[idx + offset] == value) {

カーソルを に置きます4。すると と一致するはずですarray42[idx + offset]。WORD は当然 と一致するので(array42[idx、役に立ちません。

答え1

viW通常モードでキーの組み合わせを通じて一致するものを視覚的に選択する機能を作成しました。

私が見逃したケースがあれば、遠慮なく指摘してください。また、vimscript についてはあまり詳しくないので、他にも改善の余地があるかもしれません。

"visually select current programming WORD
function! SelectSensibleWORD()
    "go to beginning of block
    normal! ?^\|[[:space:]({[]
    let l:char = matchstr(getline('.'), '\%' . col('.') . 'c.')
    if -1 != match(l:char, '[[:space:]({\[]')
        normal! l
    endif
    "enter visual mode
    normal! v
    "find brackets or end of the WORD
    normal! /$\|[[:space:]({[\]})]
    while 1
        let l:char = matchstr(getline('.'), '\%' . col('.') . 'c.')
        if -1 != match(l:char, '[({[]')
            "keep brackets balanced
            normal! %
        else
            "don't select more than necessary
            normal! h
            return
        endif
        normal! n
    endwhile
endfunction

nnoremap viW :call SelectSensibleWORD()<CR>

他のコマンドはこれに基づいて構築できます。

nmap ciW viWc
nmap diW viWd
nmap yiW mwviWy`w

残念ですが、vimscript は構文ハイライトではサポートされていません。

関連情報