Ich schreibe eine VimL Funktion , die, im Einfügemodus, ermöglicht einen <BS>
durch das Öffnungsteil eines Paares ( [
, {
usw.) , das Schließteil des Paares zu löschen , wenn er das nächste Zeichen nach dem Cursor (ähnlich ist Auto-Paare und vim-autoclose ). Diese Funktion ist anders, da der schließende Teil des Paares nicht gelöscht wird, wenn unsymmetrische Paare vorhanden sind.
Beispiele:
Im Format befindet sich <initial> => <result-after-backspace>
mein Cursor vor dem |
.
((|) => (|)
((|)) => (|)
(|) => |
(defn => (defn
(|) |)
Wie kann ich feststellen, ob die Paare unausgeglichen sind oder nicht, bevor ich das schließende Paar lösche?
Ich habe sowohl Auto-Paare als auch Vim-Autoclose getestet . Bei beiden Plugins wird der schließende Teil des Paares immer gelöscht.
vimscript
delimiter-matching
200_Erfolg
quelle
quelle
Antworten:
Wenn ich Ihre Frage richtig verstehe, müssen Sie feststellen, ob das Zeichen auf dem Cursor ein übereinstimmendes Trennzeichen ist.
Beachten Sie die Befehle für den normalen Modus
v%"zy
undv%%"zy
.@z
. Die zweite reißt eine Zeichenfolge mit einer Länge von genau 1 - wieder das Trennzeichen selbst - hinein@z
.@z
. Abbrechen.@z
. Abbrechen.@z
. Abbrechen.Somit haben wir folgendes Ergebnis:
Tipps für VimL:
:norm ...
undstrlen(@z)
helfen hier weiter.quelle
(|)
Drücken von<BS>
sollten beide gelöscht werden. Wenn das Formular der obersten Ebene jedoch wie folgt unausgeglichen ist: Durch(defn (|)
Drücken von<BS>
sollte nur das gelöscht werden, was normalerweise gelöscht wird. In diesem Fall bleibt uns das übrig(defn |)
.Ok, also habe ich paredit.vim durchgesehen und einige Funktionen herausgezogen, um dies zu erstellen: vim-pear . Es fügt Trennzeichen paarweise ein und löscht sie, während ein ausgeglichener Zustand beibehalten wird.
quelle