J'ai écrit la fonction (en fait une macro, mais peu importe) qui fonctionne de manière similaire à progn
. Comment puis-je dire à emacs que cette fonction devrait être indentée de la même manière que progn
?Comment puis-je dire à emacs comment les arguments de ma fonction elisp devraient être indentés?
Répondre
Cela devrait le faire
(put 'myfunc 'lisp-indent-function 0)
Documentation pour lisp-indent-function
(trouvé par Ch f Lisp fonction tiret RET):
lisp-indent-function is a compiled Lisp function in `lisp-mode.el'.
(lisp-indent-function indent-point state)
This function is the normal value of the variable
`lisp-indent-function`. It is used when indenting a line within
a function call, to see if the called function says anything
special about how to indent the line.
indent-point is the position where the user typed TAB, or
equivalent. Point is located at the point to indent under
(for default indentation); state is the `parse-partial-sexp`
state for that position.
If the current line is in a call to a Lisp function which has
a non-nil property `lisp-indent-function`, that specifies how
to do the indentation. The property value can be:
* `defun`, meaning indent `defun`-style;
* an integer N, meaning indent the first N arguments specially
like ordinary function arguments and then indent any further
arguments like a body;
* a function to call just as this function was called. If that
function returns nil, that means it doesn't specify
the indentation.
This function also returns nil meaning don't specify the
indentation.
Attention à élaborer, ou au moins un lien vers la documentation? –
En fait, cela ne semble pas faire quoi que ce soit. –
J'ai trouvé il y a quelque temps (et je ne me souviens plus où) une page décrivant comment corriger l'indentation d'emacs pour "if", "do" et quelques autres constructions de lisp courantes. A partir de cette page, j'ai décidé de mettre dans mes .emacs quelques-unes de ces suggestions (maintenant j'ai lisp-indent-function mis à zéro pour "if" et à 2 pour "do" et "do *"). Je suis d'accord avec vous que la documentation de la fonction indentation de liste n'est pas détaillée. – 6502
Comme il est "en fait une macro":
Chig(elisp) Indenting Macros
RET
Dans ce cas:
(defmacro my-macro (&rest body)
"Does things"
(declare (indent defun))
`(progn ,@body))
(my-macro
(message "foo")
(message "bar"))
Est-ce que cela fonctionne uniquement pour les macros, pas pour les fonctions? –
Expérimentalement (Emacs 24.3), la forme '(declare (indent x))' * does * fonctionne également avec les fonctions. Je n'avais jamais essayé ça avant. Le compilateur d'octets ne se plaint pas à ce sujet, donc je suppose que c'est bon à utiliser. Intéressant! – phils
Pouvez-vous élaborer un peu. Vous voulez ce genre d'indentation dans le 'emacs-lisp-mode'? –
Vous souhaitez mettre en retrait et mettre en surbrillance la syntaxe, n'est-ce pas? Cela devrait fonctionner quelle que soit la construction (toute expression-s devrait être correctement indentée). La mise en évidence de la syntaxe est contrôlée par 'font-lock-keywords'. Pouvez-vous poster une capture d'écran du "mauvais" comportement? –