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 は構文ハイライトではサポートされていません。