vim: Wort im aktuellen Block mit ausgeglichenen Klammern abgleichen

vim: Wort im aktuellen Block mit ausgeglichenen Klammern abgleichen

Beim Matching in vim gibt es unter anderem Wörter, WÖRTER und Blöcke. Zum Bearbeiten von Code sind Blöcke nützlich, Wörter sind einigermaßen nützlich, aber WÖRTER sind meist nutzlos, da sie oft öffnende oder schließende Klammern enthalten, sei es (), {}oder [].

Ich möchte also, dass die WÖRTER übereinstimmen

  • nur Zeichen innerhalb des aktuellen Blocks, aber ansonsten
  • ganze WÖRTER (ggf. auch mehrere) und
  • vollständige Blöcke (also keine unsymmetrischen Klammern).

Betrachten Sie beispielsweise diese Codezeile:

if (array42[idx + offset] == value) {

mit dem Cursor auf 4. Dann sollte es übereinstimmen array42[idx + offset]. WORD würde natürlich übereinstimmen (array42[idx, was nicht sinnvoll ist.

Antwort1

viWIch habe eine Funktion erstellt, die im Normalmodus durch eine Tastenkombination optisch die Übereinstimmung auswählt .

Bitte weisen Sie mich auf Fälle hin, die ich übersehen habe. Außerdem gibt es wahrscheinlich noch Raum für Verbesserungen, da ich nicht viel über Vimscript weiß.

"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>

Darauf können dann weitere Befehle aufbauen:

nmap ciW viWc
nmap diW viWd
nmap yiW mwviWy`w

Schade, Vimscript wird vom Syntax-Highlighter nicht unterstützt.

verwandte Informationen