Come commenta tutto o parte di un Lisp s-exp utilizzando Paredit?
Domanda
Quando si modifica il codice Lisp, di tanto in tanto è utile per commentare interamente in una definizione di livello superiore, in questo modo:
;(defun some-fn-which-is-broken (x)
; ...)
... o commentare solo una parte di una s-espressione, in questo modo:
(foo x
; y
z)
... e poi ricompilare il file e prova qualcosa nel REPL, ecc.
Con paredit-mode abilitato, questo non funziona. Ecco cosa succede, se il punto è giusto prima che i primi parentesi di seguito:
(defun some-fn (x)
...)
e si digita un punto e virgola, ciò che viene inserito un punto e virgola e un ritorno a capo:
;
(defun some-fn (x)
...)
Lo stesso con commentando parte della s-espressione:
(foo x
;
y
z)
Credo che se la definizione è tutto su una riga, questo funziona:
;(defparameter *foo* 10)
... ma per il resto non riesco a trovare il modo di fare questo. Paredit è grande, mi piace molto di continuare a utilizzarlo. Ci sono dei Lispers che conoscono un modo per aggirare questo, o Emacs-maghi che può improvvisare un po 'di Emacs Lisp di legarsi a qualcosa come paredit-comment-out-s-expr
?
Se c'è un altro Lispy o Emacsy modo di realizzare essenzialmente la stessa cosa, commentando le parti di origine per ricompilazione, per favore, non esitate a suggerire loro!
Soluzione
Posizionare il punto sul primo carattere di tutta la sexp, segnano l'intero sexp con C-M-spazio e di rilascio M -; per fare il commento. Se è necessario farlo, il codice sorgente sarà anche ri-formattato in modo che solo il sexp contrassegnato, e nulla di ciò che è stato anche sulla stessa linea, è in un commento.
Si può facilmente fare un semplice comando o anche una macro per fare questo:
(defun comment-sexp () "Comment out the sexp at point." (interactive) (save-excursion (mark-sexp) (paredit-comment-dwim)))
Altri suggerimenti
Solo una nota a margine:
Il #+
e lettore #-
macro sono abbastanza piacevole per commentare sexps. Essi permettono di mancato rispetto delle seguenti sexp, se il simbolo raffigurato non è / è trovato in *FEATURES*
. Basta scegliere un simbolo non in *FEATURES*
, e utilizzarlo con #+
in questo modo:
#+nil
(defun foo ()
...)
Ora, la definizione della funzione sarà ignorata (a meno che non sia in NIL
*FEATURES*
, che non è molto probabile).
Come rimedio provvisorio, è possibile utilizzare C-q (quoted-insert
) per inserire un carattere arbitrario senza attivare nessuna magia modalità relative. Ad esempio, in java-mode, digitando parentesi reindents la linea attuale, che non è sempre quello che voglio; in questi casi, io inserisco una parentesi con C-q per preservare il mio rientro. (O più spesso, io digito una parentesi, osservare il cambiamento indentazione, maledizione, undo, e rientrare con C-q .)
Per commentare in generale, sarebbe probabilmente più facile da usare M -;. (comment-dwim
), invece di digitare manualmente i punti e virgola
È possibile utilizzare C-M-SPC M-;
per segnare la S-espressione (C-M-SPC
per mark-sexp
) e poi commentarlo (M-;
per comment-dwim
).
In paredit 23, semplicemente digitando ;
non spingerà ogni cosa che non ha bisogno di fuori dalla linea. Così sarà fare la cosa giusta per il tuo secondo esempio. E se si voleva commentare z
invece di y
sarebbe solo spingere il delimitatore di chiusura a un'altra linea.