vimで一致すると、単語、WORD、ブロックなどがあります。コードを編集するときにブロックが役に立ち、単語もやや便利ですが、単語には一般的に左または右の角かっこ(または)が()
含まれているため、ほとんど役に立ちません。{}
[]
だから似合う言葉が欲しい
- 現在ブロック内の文字のみ、そうでない場合
- 完全な単語(必要な場合は1つ以上)と
- 完全なブロック(したがってバランスのとれないブラケットはありません)
たとえば、次のコード行を考えてみましょう。
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は構文強調をサポートしていません。