Ich habe die strukturelle Bearbeitung von Cursive (ein paredit-ähnlicher Modus für Intellij und Cursive) verwendet und dort einen netten Befehl gefunden, der sich Form aufwärts (und abwärts) nennt.
Formular nach oben verschieben bewirkt Folgendes (das |
ist der Punkt):
(+ 1 |(+ 2 3) 4) => (+ (+ 2 3) 1 4)
und Form nach unten verschieben ist analog:
(+ 1 |(+ 2 3) 4) => (+ 1 4 (+ 2 3))
Ist es möglich, dies im Emacs Paredit-Modus zu tun? Ich denke, es ist nicht in der Grundausstattung enthalten (zumindest ist es auf diesem Spickzettel nicht beschrieben)
C-M-t
ungefähr dasselbe. Aber ich denke, Sie meinen, dass dieselbe Form weiterhin verschoben wird, anstatt den Fortschritt auf das nächste Paar Sexps auszutauschen.Antworten:
Wie @Drew vorgeschlagen hat,
C-M-t
macht was Sie wollen. Die Regel ist wie folgt:C-M-t
(was läufttranspose-sexp
).Oder Sie können einfach denken, dass dies nicht transponierend ist, sondern dass Sie, um sich vorwärts zu bewegen, einen Punkt hinter dem Sexp platzieren müssen, den Sie bewegen möchten.
Es gibt jedoch einen Vorteil: Wenn Sie das linke Geschlecht rückwärts transponieren möchten, verwenden Sie dasselbe
C-M-t
Argument , das jedoch mit einem negativen Präfix versehen ist. Dies ist unpraktisch. Ein weiteres Problem ist, dass der Punkt nicht dem rückwärts transponierten linken Geschlecht folgt . Um dieses Problem zu lösen, erstellen wir eine umgekehrte Version vontranspose-sexps
:Binden Sie es dann an den,
C-M-y
der sich nebenC-M-t
Emacs befindet und in der Standardeinstellung frei ist.Hier ist eine Demo; Sie werden feststellen, dass
(MY-SEXP1)
sich die ganze Zeit über links befindet, um vorwärts / rückwärts bewegt zu werden:quelle
Es ist möglich, dies mit Lispy zu tun , was eine fortgeschrittene Form von Lispy ist
paredit-mode
.Für Ihren Anwendungsfall:
Das Einzige ist, dass der Cursor auf paren stehen muss, wie es in Ihrem Beispiel der Fall ist:
Sie können auch mehrere Sexps gleichzeitig mit wund verschieben s, wenn Sie sie mit einer Region markieren. Weitere Informationen finden Sie in der Dokumentation .
quelle
Hier ist ein weiterer Befehl (aus der Bibliothek
misc-cmds.el
), der ziemlich genau das tut, was Sie verlangen. Binden Sie es einfach an einen einzelnen Schlüssel (C-M-t
oder was auch immer). Verwenden Sie diese Option, um ein Sexp wiederholt vorwärts und rückwärts zu bewegen.Ein negatives Präfix arg transponiert rückwärts,
transpose-sexp
aber es lässt point auch bereit, eine weitere Rückwärtstransposition durchzuführen. Und beim Wiederholen kehrt ein negatives Präfix arg nur die Richtung um.Wenn Sie also den Befehl beispielsweise an binden,
C-o
wird das Sexp, das sich links vom Punkt befindet, dreimal nach rechts, dann zweimal nach links und dann einmal nach rechts verschoben.C-o C-o C-o
C--
C-o C-o
C--
C-o
Ein numerisches Präfix arg wirkt sich nur beim ersten Gebrauch aus, dh nicht bei Wiederholungen - bei Wiederholungen ist die Bewegung immer ein Geschlecht auf einmal.
(Hinweis: Das Verhalten von
transpose-sexps
in 24.4 geändert, daher hier der Versions-Test. Vor 24.4 endete der Punkt an der richtigen Stelle, um fortzufahren (z. B. Wiederholen). Ab 24.4 ist der Punkt dafür an der falschen Stelle Eine Regression oder das Hinzufügen einer nützlichen Funktion oder das Beheben eines anderen Fehlers liegt vermutlich im Auge des Betrachters. ;-) Ich habe Emacs- Fehler # 20698 dafür eingereicht , gerade eben.)quelle