Wahrscheinlich beeinflusst von Clojure, verwende ich häufiger Eigenschaftslisten als Datenstrukturen. Emacs zieht sie die meiste Zeit so ein,
`(:token ,token
:token-quality ,quality) ,
während das ist was ich bevorzugen würde
`(:token ,token
:token-quality ,quality) .
Also, ich frage mich, ob jemand dies bereits in Angriff genommen hat?
Fuco1/lisp-indent-function
und tun(add-hook 'emacs-lisp-mode-hook (lambda () (setq-local lisp-indent-function #'Fuco1/lisp-indent-function)))
Antworten:
Dies kann erreicht werden, indem der
lisp-indent-function
for emacs-lisp-Modus geändert wird:Aus der
lisp-mode.el
Emacs-Quelle,Alternative
Wie @wasamasa in einem Kommentar zu der Frage erwähnte, hat @ Fuco1 (auf github.com) den Standard geändert
lisp-indent-function
, um die Einrückung von Schlüsselwörtern zu korrigieren (beginnend mit:
).Emacs hat
lisp-indent-function
dem Benutzer die Variable zur Verfügung gestellt, mit der er auswählen kann, welche Funktion für Einrückungen in Lisp-Modi verwendet werden soll.Anstatt die ursprüngliche Funktionsdefinition zu überschreiben, können wir unsere eigene Funktion erstellen und die obige Variable diesem Funktionsnamen zuweisen.
In diesem Beispiel
Fuco1/lisp-indent-function
in Ihrem Emacs-Setupemacs-lisp-mode
:Referenz
Die modifizierte Funktion wird unten eingefügt, falls die auf github bezogene Quelle verloren geht.
quelle
lisp-indent-function
.(setq lisp-backquote-indentation nil)
Listen mit Anführungszeichen (wie in der ursprünglichen Frage).Intro zum Berechnen von Einrückungen
Eine bessere Lösung besteht darin, die Funktion zu überschreiben
calculate-lisp-indent
. Kurz gesagt,calculate-lisp-indent
ist eine Funktion, die die Spalte zurückgibt, in die eine Linie am Punkt eingerückt werden soll. Diese Funktion gibt an,lisp-indent-function
wie stark die einzelnen Zeilen eingerückt werden sollen. (Siehe auch meinen Beitrag auf reddit für weitere Informationen).Vergleich zu anderen Antworten
Der Vorteil, den diese Antwort gegenüber der Verwendung der modifizierten Funktion von Fuco1 hat, ist, dass (1) die Wurzel des Problems behoben wird, die darin besteht, dass nicht
calculate-lisp-indent
nur nach dem voncalculate-lisp-indent
(2) zurückgegebenen falschen Einzug auf Listen mit Anführungszeichen und Listen mit Anführungszeichen (und) aufgeräumt wird funktioniert unabhängig davon, ob sie explizit in Anführungszeichen oder in Anführungszeichen gesetzt sind oder mit den'
Zeichen und `). Es funktioniert auch mit beliebig verschachtelten Anführungszeichen und Backquotes.Der Vorteil, den diese Antwort gegenüber dem Ersetzen
lisp-indent-function
durchcommon-lisp-indent-function
Funktion hat, ist, dass sie nicht den Nebeneffekt hat, dass andere Einrückungen durcheinander gebracht werden. Elisp und Common-Lisp werden unterschiedlich eingerückt.Wie es funktioniert
Diese Bedingung (in
calculate-lisp-indent
) entscheidet, ob ein Sexp wie eine Funktion eingerückt wird oder nicht. Was in die else-Klausel fällt, wird wie eine Funktion eingerückt. Was in die if-Klausel fällt, wird normal eingerückt (unter dem aktuellen Element). Damit Listen in Anführungszeichen nicht als Funktionen, sondern als Daten eingerückt werden, müssen wir weitere Prüfungen für Fälle hinzufügen, in denen die Liste im bedingten Prädikat in Anführungszeichen steht.Dieser Code überprüft die offenen Klammern des eingerückten Sexp. Wenn es sich um Sexp mit mehreren Sexp handelt, werden alle überprüft. Es gibt t zurück, wenn es Sexps mit oder ohne Anführungszeichen findet.
Bonus
Wenn Sie möchten, dass eine Liste, die mit einem Schlüsselwort beginnt, als Daten eingerückt wird, auch wenn sie nicht in Anführungszeichen gesetzt ist, fügen Sie dies dem bedingten Prädikat als weitere Prüfung hinzu. Dies kann für Makros nützlich sein, in denen der Einfachheit halber keine Plists angegeben sind, wie in Defhydra .
Beispiele
Das vollständige Code-Snippet, das ich unten gepostet habe, funktioniert mit dem Fall, den Sie erwähnt haben, und mehr. Bitte probieren Sie es aus!
Eine ausführlichere Erklärung dazu finden Sie in meinem Beitrag zu reddit .
Vollständiges Code-Snippet
Hier ist das vollständige Code-Snippet.
Schlussbemerkungen
Es ist erwähnenswert, dass diese Frage besser verallgemeinert werden sollte , um zu verhindern, dass Emacs Listen mit und ohne Anführungszeichen als Funktionen einrücken .
quelle
Für eine viel hackigere Alternative zu Kaushalmodis Antwort könnten Sie das überschreiben
lisp-indent-function
, was Mark H. Weaver getan hat, um diescheme-indent-function
Ausrichtung von Schlüsselwörtern im Guile-Schema zu korrigieren .Ich habe gerade den Code von http://netris.org/~mhw/scheme-indent-function.el kopiert . Die einzige Änderung besteht darin, eine neue
cond
Klausel hinzuzufügen . Möglicherweise möchten Sie den aktuellen Code von übernehmen,lisp-indent-function
anstatt diese Funktion so wie sie ist zu verwenden.(Es ist schade, dass die Einrückungsfunktionen keine weiteren Hooks verfügbar machen, um kleinere Änderungen wie diese zu vereinfachen.)
quelle
lisp-indent-function
? Auch scheint es keine Funktion zu gebenemacs-lisp-indent-function
.lisp-indent-function
enthält standardmäßig die Einrückungsfunktion. Die Zuweisung dieser Variablen entspricht dem Überschreiben der Standardeinrückungsfunktion für den Emacs-Lisp-Modus. (Sie haben Recht, es gibt keine besonderenemacs-lisp-indent-function
, es ist nurlisp-indent-function
.)lisp-indent-function
Mit meinem Paket el-patch können Sie zukunftssicher übersteuern :Dies behebt das Problem für mich; sehe es im Kontext .
quelle