在 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 不支持语法高亮。