Schließen Sie das schließende Paar automatisch, ohne unausgeglichene Paare zu verursachen

8

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.

200_Erfolg
quelle
Könnten Sie Ihr Vorwort klarstellen? Möchten Sie alle Plugins vermeiden oder nur solche, die den beiden genannten ähnlich sind? Wenn letzteres, was ist mit diesen beiden, die du nicht magst?
Tom
Ich möchte dafür keine Plugins verwenden. Ich habe das Vorwort aktualisiert.
1
Ich habe dafür gestimmt, diese Frage zu schließen. Ich denke , das grundlegende Thema als solches in Ordnung ist, aber Ihre Einschränkungen machen es zu einem jetzt -Frage „bitte einen Code für mich plz kthxbye schreiben“. Ich glaube nicht, dass wir diese Art von Fragen hier zulassen wollen ...
Martin Tournoij
1
@Carpetsmoker Über den Wortlaut dieser Frage hinaus gibt es ein Problem, das in keinem Plugin, das ich gesehen habe, gelöst werden muss. Mir scheint klar zu sein, dass jedes Plugin vom Typ Auto-Closing oder Auto-Pair-Typ von seiner Lösung profitieren kann, sobald diese Frage erfolgreich beantwortet wurde. Wie würden Sie vorschlagen, dass ich den Wortlaut ändere, um ihn akzeptabel zu machen?
2
@merb, das paredit-Plugin macht genau das, was Sie wollen. Wenn Sie diese Funktionalität wünschen, ohne das Plugin tatsächlich zu verwenden, empfehle ich Ihnen, die Quelle auf Github zu untersuchen. Ich denke, das wäre lehrreicher als der Versuch, hier eine Version davon zu reproduzieren. github.com/kovisoft/paredit
Quincy Bowers

Antworten:

1

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%"zyund v%%"zy.

  • Befindet sich der Cursor auf einem übereinstimmenden Trennzeichen, zieht der erste Befehl eine Zeichenfolge mit einer Länge von mindestens 2 - das Trennzeichen, sein Paar und einen beliebigen Text in der Mitte - hinein @z. Die zweite reißt eine Zeichenfolge mit einer Länge von genau 1 - wieder das Trennzeichen selbst - hinein @z.
  • Befindet sich der Cursor auf einem nicht übereinstimmenden Trennzeichen, zieht der erste Befehl eine Zeichenfolge der Länge 1 - das Trennzeichen selbst - hinein @z. Abbrechen.
  • Befindet sich der Cursor nicht auf einem Trennzeichen und befindet sich ein Trennzeichen in der Zeile, zieht der zweite Befehl eine Zeichenfolge mit einer Länge von mehr als 1 hinein @z. Abbrechen.
  • Wenn sich der Cursor nicht auf einem Trennzeichen befindet und sich kein anderes Trennzeichen in der Zeile befindet, zieht der erste Befehl eine Zeichenfolge mit einer Länge von genau 1 - das Zeichen selbst - hinein @z. Abbrechen.

Somit haben wir folgendes Ergebnis:

Der Cursor befindet sich genau dann auf einem übereinstimmenden Trennzeichen, wenn der Befehl v%"zyfür den normalen Modus eine Zeichenfolge mit einer Länge von mindestens 2 Zoll @zund der Befehl v%%"zyfür den normalen Modus eine Zeichenfolge mit einer Länge von genau 1 Zoll hineinzieht @z.

Tipps für VimL: :norm ...und strlen(@z)helfen hier weiter.

wchargin
quelle
Beantwortet dies Ihre Frage oder fehlt mir etwas?
wchargin
Es ist nicht genau der Schlüssel, festzustellen, ob das Zeichen auf dem Cursor übereinstimmt oder nicht. Der Schlüssel besteht darin, zu bestimmen, ob eine bestimmte Form ausgeglichen ist oder nicht. Wenn die Form ausgeglichen ist und wir uns in dieser Position befinden: Durch (|)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 |).
1

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
Cool :-) Wie benutze ich es? Kann ich es einfach installieren und es wird standardmäßig aktiviert? Ist es auch möglich, dies nur für bestimmte Dateitypen zu aktivieren / deaktivieren?
Martin Tournoij
Standardmäßig für alles aktiviert. Reichen Sie eine PR ein, wenn Sie so etwas wollen. Ich kann es irgendwann selbst tun.
Die Verbindung ist (derzeit) unterbrochen.
Rich