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
viW
Ich 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.