Aus meiner Forschung dazu müssen Sie mindestens zwei benutzerdefinierte Bewegungen definieren. Der erste dient nur zum Bewegen des Cursors und der zweite zum Verwenden in Operatoren. Für ein voll funktionsfähiges Setup ist es viel komplizierter, und ich würde empfehlen, den Code in CamelCaseMotion von Ingo Karkat zu betrachten, der deutlich mehr Überlegungen dazu enthält, dies richtig zu machen als unten. Der größte Teil meiner Antwort basiert auf schnellen Informationen in der Vim-Hilfe und im Experimentieren.
In den folgenden Beispielen werde ich die )
und (
Bewegungen neu zuordnen , um jedes Ende eines Satzes zu machen. Sie können andere Zeichen verwenden, indem Sie das Beispiel ändern. Ich gehe auch auf Ihr Beispiel vis<ESC>
als die robustere Option (im Vergleich zu )T.
). Wenn Sie sich dabei bereits am Ende eines Satzes befinden, bleiben Sie am Ende, anstatt aufgrund der Funktionsweise zum Ende zu gelangen is
. Sie können versuchen, es durch as
zu ersetzen, um unterschiedliche Ergebnisse zu erzielen. Dies sollte tatsächlich funktionieren, um beide Seiten eines Textobjekts in eine Bewegung umzuwandeln.
Erstens die Bewegung im normalen Modus
Hinweis Dies funktioniert nicht im visuellen Modus oder im anhängigen Bedienermodus
function! MoveToEnd(type, ...)
exe "normal `]"
endfunction
map <silent> \) :set opfunc=MoveToEnd<CR>g@
nmap ) \)is
Zuerst definieren wir eine neue Funktion namens, MoveToEnd
deren einzige Aufgabe darin besteht, den Cursor auf das "letzte Zeichen des zuvor geänderten oder gezogenen Textes" zu setzen, das die ]
Markierung ist (siehe :help ']
).
Als nächstes erstellen wir einen benutzerdefinierten Operator \)
, der unsere MoveToEnd
Funktion für jede Bewegung aufruft , die ihm gegeben wird. Auf diese Weise wird die ]
Marke zum Ende der Auswahl, die unserem neuen Bediener gegeben wird. (siehe :help map-operator
)
Schließlich ordnen wir )
unseren benutzerdefinierten Operator mit der is
Mehrheit zu, wodurch effektiv das Äquivalent von angegeben wird, vis<ESC>
ohne die letzte visuelle Auswahl zu ändern und ohne die Modi zu ändern.
Das Gegenteil ist ähnlich, nur mit den anderen Richtungen:
function! MoveToBeginning(type, ...)
exe "normal `["
endfunction
map <silent> \( :set opfunc=MoveToBeginning<CR>g@
:nmap ( \(is
Zweitens die Bedienerbewegung
Dieser ist schwieriger. Unsere Bewegung oben zerstört die Startposition, sodass Bediener wie 'd' gegen nichts arbeiten. Was wir brauchen, ist in der Lage zu sein, unsere Startposition zu speichern und die Endposition hinzuzufügen. :help omap-info
(Operator Pending Mapping) gibt einen Tipp dazu, nämlich den visuellen Modus zu verwenden.
Dann speichern wir unsere Position an einem Ende des visuellen Auswahlregisters, verwenden unsere Bewegung im normalen Modus von oben, stellen das andere visuelle Auswahlregister ein und aktivieren dann den visuellen Modus:
function! SelectToEnd()
normal m< "Set start point of visual selection
normal ) "Move to end of sentance (relies on mapping from earlier)
normal m> "Set end point of visual selection
normal gv " 'Go Visual' activate visual mode using selection marks
endfunction
omap ) :call SelectToEnd()<CR>
Und für unsere Rückenbewegung:
function! SelectToBeginning()
normal m> "Set end point to current position (since we are moving backwards)
normal ( "Move to beginning of sentence (relies on mapping from earlier)
normal m< "Set start point
normal gv "Activate visual mode based on our new marks
endfunction
omap ( :call SelectToBeginning()
Mit dieser Option können Sie d)
bis zum Ende des Satzes löschen (anstelle des Originals bis zum Anfang des nächsten Satzes). Alle anderen Bediener sollten ebenfalls funktionieren.
<esc>
? Du brauchst nur einen.