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 不支援語法高亮。

相關內容