vim:用平衡括号匹配当前块中的单词

vim:用平衡括号匹配当前块中的单词

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

相关内容