在 vim 中匹配時,有單字、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 不支援語法高亮。