Probablement influencé par Clojure, j'utilise plus souvent des listes de propriétés comme structures de données. Emacs la plupart du temps les indente comme ça,
`(:token ,token
:token-quality ,quality) ,
alors c'est ce que je préférerais
`(:token ,token
:token-quality ,quality) .
Alors, je me demande si quelqu'un a déjà abordé cela?
Fuco1/lisp-indent-function
et faire(add-hook 'emacs-lisp-mode-hook (lambda () (setq-local lisp-indent-function #'Fuco1/lisp-indent-function)))
Réponses:
Cela peut être réalisé en changeant le mode
lisp-indent-function
pour emacs-lisp:De la
lisp-mode.el
source emacs,Alternative
Comme @wasamasa l'a mentionné dans un commentaire à la question, @ Fuco1 (sur github.com) a modifié la valeur par défaut
lisp-indent-function
pour corriger l'indentation des mots clés (en commençant par:
).Emacs a fourni la variable
lisp-indent-function
permettant à l'utilisateur de choisir la fonction à utiliser pour l'indentation dans les modes lisp.Au lieu de remplacer la définition de fonction d'origine, nous pouvons créer notre propre fonction et affecter la variable ci-dessus à ce nom de fonction.
Dans cet exemple,
Fuco1/lisp-indent-function
dans votre configuration emacsemacs-lisp-mode
:Référence
La fonction modded est collée ci-dessous en cas de perte de la source référencée à github.
la source
lisp-indent-function
.(setq lisp-backquote-indentation nil)
de listes entre guillemets (comme dans la question d'origine).Introduction au calcul-lisp-indent
Une meilleure solution consiste à remplacer la fonction
calculate-lisp-indent
. En bref,calculate-lisp-indent
est une fonction qui renvoie la colonne à laquelle une ligne au point doit être mise en retrait. Cette fonction indique celisp-indent-function
que chaque ligne doit être indentée. (voir aussi mon post sur reddit pour plus d'informations).Comparaison avec d'autres réponses
L'avantage de cette réponse sur l'utilisation de la fonction modifiée de Fuco1 est que (1) elle corrige la racine du problème qui réside au
calculate-lisp-indent
lieu de simplement nettoyer après la mauvaise indentation renvoyée parcalculate-lisp-indent
(2) elle généralise aux listes entre guillemets et entre guillemets (et elle fonctionne qu'ils soient explicitement cités / rétrogradés ou avec'
et `). Il fonctionne également avec des guillemets et des guillemets arbitrairement imbriqués.L'avantage de cette réponse sur le remplacement
lisp-indent-function
par lacommon-lisp-indent-function
fonction est qu'elle n'a pas pour effet secondaire de gâcher d'autres indentations elisp. Elisp et common-lisp sont mis en retrait différemment.Comment ça fonctionne
Ce conditionnel (in
calculate-lisp-indent
) est ce qui décide si un sexp est indenté comme une fonction ou non. Ce qui tombe dans sa clause else est en retrait comme une fonction. Ce qui tombe dans sa clause if, est mis en retrait normalement (sous l'élément courant). Pour le mettre en retrait des listes entre guillemets en tant que données plutôt qu'en tant que fonctions, nous devons ajouter davantage de vérification pour les cas où la liste est citée dans le prédicat conditionnel.Ce code vérifie les parenthèses ouvertes du sexp en retrait. Si c'est sexp avec plusieurs sexp, il les vérifie tous. Il retourne t s'il trouve des sexps cités ou rétrogradés.
Prime
Si vous souhaitez qu'une liste commençant par un mot-clé soit mise en retrait en tant que données même si elle n'est pas citée, ajoutez-la comme autre vérification au prédicat conditionnel. Cela peut être utile pour les macros dans lesquelles les plists ne sont pas cités pour des raisons de commodité, comme dans defhydra .
Exemples
L'extrait de code complet que j'ai publié ci-dessous fonctionne avec le cas que vous avez mentionné et plus encore. Veuillez l'essayer!
Pour une explication plus approfondie de la façon dont cela fonctionne, consultez mon article sur reddit .
Extrait de code complet
Voici l'extrait de code complet.
Notes finales
Il convient de noter que cette question serait mieux généralisée quant à la façon d'empêcher emacs d'indenter des listes entre guillemets et non entre guillemets en tant que fonctions .
la source
Pour une alternative beaucoup plus piratée à la réponse de kaushalmodi, vous pouvez remplacer la
lisp-indent-function
même chose que ce que Mark H. Weaver a fait pourscheme-indent-function
corriger l'alignement des mots clés dans Guile Scheme.Je viens de copier le code de http://netris.org/~mhw/scheme-indent-function.el ; la seule modification consiste à ajouter une nouvelle
cond
clause. Vous souhaiterez peut-être prendre le code actuel delisp-indent-function
au lieu d'utiliser cette fonction telle quelle.(Il est dommage que les fonctions de retrait n'exposent pas plus de crochets pour simplifier des changements mineurs comme celui-ci.)
la source
lisp-indent-function
? De plus, il ne semble pas y avoir de fonctionemacs-lisp-indent-function
.lisp-indent-function
contient la fonction d'indentation par défaut. L'affectation à cette variable est identique à l'écrasement de la fonction d'indentation par défaut pour le mode emacs-lisp. (Vous avez raison, il n'y a pas de spécialemacs-lisp-indent-function
, c'est justelisp-indent-function
.)Vous pouvez remplacer
lisp-indent-function
de manière pérenne en utilisant mon package el-patch :Cela résout le problème pour moi; le voir dans son contexte .
la source