2010-11-26 14 views
13

Lors de l'édition du code Lisp, parfois il est utile de commenter entièrement une définition de haut niveau, comme celui-ci:Comment commentez-vous tout ou partie d'un Lisp s-exp en utilisant Paredit?

;(defun some-fn-which-is-broken (x) 
; ...) 

... ou commenter seulement une partie d'un texte, comme l'expression suivante:

(foo x 
; y 
    z) 

... puis recompiler le fichier et quelque chose test dans le REPL, etc.

Avec paredit-mode activé, cela ne fonctionne pas. Voici ce qui arrive, si le point est juste avant la première paren ci-dessous:

(defun some-fn (x) 
    ...) 

et que vous tapez un point-virgule, ce qui est entré est un point-virgule et une nouvelle ligne:

; 
(defun some-fn (x) 
    ...) 

Même avec en commentant une partie s de l'expression:

(foo x 
;  
    y 
    z) 

Je pense que si la définition est sur une seule ligne, cela fonctionne:

;(defparameter *foo* 10) 

... mais sinon je ne sais pas comment faire. Paredit est génial, j'aimerais vraiment continuer à l'utiliser. Y a-t-il des Lispers qui connaissent un moyen de contourner ce problème, ou des sorciers Emacs qui peuvent utiliser un peu Emacs Lisp pour se lier à quelque chose comme paredit-comment-out-s-expr?

S'il y a une manière plus Lispy ou Emacsy de faire essentiellement la même chose, en commentant des parties de source à recompiler, n'hésitez pas à les suggérer!

Répondre

29

Positionnez le point sur le premier caractère de l'ensemble du sexp, marquez le sexp entier avec C-M-space, et publiez M-; pour faire des commentaires. S'il est nécessaire de le faire, votre code source sera également reformaté de sorte que seul le sexp que vous avez marqué, et rien qui soit également sur la même ligne, soit dans un commentaire.

Vous pouvez très facilement faire une simple commande ou même une macro pour le faire:

 
(defun comment-sexp() 
    "Comment out the sexp at point." 
    (interactive) 
    (save-excursion 
    (mark-sexp) 
    (paredit-comment-dwim))) 
+0

Magnifique! Juste ce que je voulais. Merci! – spacemanaki

+0

@spacemanaki En outre, en appuyant plusieurs fois sur C-M-SPC, sélectionnez plusieurs expressions s et appuyez sur C-M-u plusieurs fois pour atteindre la position souhaitée avant d'appuyer sur C-M-SPC –

+0

Remarque: cela ne fonctionne pas. – Ven

3

En tant que mesure de diaphragme, vous pouvez utiliser C-q (quoted-insert) pour insérer un caractère arbitraire sans déclencher de magie liée au mode. Par exemple, en mode java, la saisie de parenthèses réindente la ligne courante, ce qui n'est pas toujours ce que je veux; dans de tels cas, je vais insérer une parenthèse avec C-q pour préserver mon indentation. (Ou plus souvent, je vais taper une parenthèse, observer le changement d'indentation, malédiction, annuler et ré-entrer avec Cq.)

Pour commenter en général, il serait probablement plus facile à utiliser M- ; (comment-dwim) plutôt que de taper manuellement les points-virgules.

+0

Ceci est vraiment utile aussi, merci. – spacemanaki

8

Juste une remarque:

Les #+ et #- macros lecteur sont assez bien pour en commentaire sexps.Ils permettent d'ignorer le sexp suivant, si le symbole donné n'est pas/est trouvé dans *FEATURES*. Il suffit de choisir un symbole pas *FEATURES*, et l'utiliser avec #+ comme ceci:

#+nil 
(defun foo() 
    ...) 

Maintenant, la définition de la fonction sera ignorée (sauf si NIL est dans *FEATURES*, ce qui est peu probable).

+0

Bon à savoir! Merci! – spacemanaki

+1

Si vous voulez être très sûr, vous pouvez utiliser (OR) au lieu de NIL. –

1

Vous pouvez utiliser C-M-SPC M-; pour marquer le S-expression (C-M-SPC pour mark-sexp), puis la commenter (M-; pour comment-dwim).

Dans paredit 23, en tapant simplement ; ne poussera rien qu'il ne doit pas hors de la ligne. Donc, il fera la bonne chose pour votre deuxième exemple. Et si vous vouliez commenter z au lieu de y il pousserait seulement le délimiteur fermant à une autre ligne.