Как вы закомментируете весь или часть Lisp s-exp, используя Paredit? - PullRequest
14 голосов
/ 26 ноября 2010

При редактировании кода на Лиспе иногда полезно полностью закомментировать определение верхнего уровня, например:

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

... или закомментировать только часть s-выражения, например так:

(foo x
;    y
     z)

... и затем перекомпилировать файл и протестировать что-либо в REPL и т. Д.

При включенном режиме paredit это не работает.Вот что происходит, если точка находится перед первой парой ниже:

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

и вы вводите точку с запятой, вводите точку с запятой и новую строку:

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

То жес закомментированием части s-выражения:

(foo x
;    
     y
     z)

Я думаю, что если все определение находится в одной строке, это работает:

;(defparameter *foo* 10)

... но в противном случае я могуне узнать, как это сделать.Паредит великолепен, я бы очень хотел его использовать.Есть ли Лисперы, которые знают способ обойти это, или Emacs-волшебники, которые могут поднять немного Emacs Lisp для привязки к чему-то вроде paredit-comment-out-s-expr?

Если есть более лиспийский или Emacsy способ выполненияпо сути то же самое, комментируя части исходного кода для перекомпиляции, пожалуйста, не стесняйтесь их предлагать!

Ответы [ 4 ]

31 голосов
/ 27 ноября 2010

Поместите точку на первый символ всего пола, пометьте весь пол C-M-пробел и введите M -; , чтобы сделать комментарий Если это необходимо, ваш исходный код также будет переформатирован, чтобы в комментарии содержался только отмеченный вами пол и ничего из того, что было в той же строке.

Вы можете очень легко сделать простую команду или даже макрос для этого:

(defun comment-sexp ()
  "Comment out the sexp at point."
  (interactive)
  (save-excursion
    (mark-sexp)
    (paredit-comment-dwim)))
9 голосов
/ 01 декабря 2010

Примечание:

Макросы читателей #+ и #- довольно хороши для комментирования sexps. Они позволяют игнорировать следующий пол, если данный символ не найден в *FEATURES*. Просто выберите символ, который отсутствует в *FEATURES*, и используйте его с #+ следующим образом:

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

Теперь определение функции будет игнорироваться (если NIL не в *FEATURES*, что маловероятно).

3 голосов
/ 26 ноября 2010

В качестве временной меры вы можете использовать C-q (quoted-insert), чтобы вставить произвольный символ, не вызывая магию, связанную с режимом. Например, в java-режиме ввод скобок переопределяет текущую строку, что не всегда то, что я хочу; в таких случаях я вставлю скобку с C-q , чтобы сохранить отступы. (Или чаще я буду набирать скобки, наблюдать за изменением отступа, проклинать, отменять и снова вводить с помощью C-q .)

Для общего комментирования, вероятно, было бы проще использовать M -; (comment-dwim), чем вводить точки с запятой вручную.

1 голос
/ 14 июня 2013

Вы можете использовать C-M-SPC M-;, чтобы отметить S-выражение (C-M-SPC для mark-sexp) и затем прокомментировать его (M-; для comment-dwim).

В paredit 23, просто набрав ;, вы ничего не вытолкнете из строя. Так что это будет правильно для вашего второго примера. И если вы хотите закомментировать z вместо y, это приведет только к закрывающему разделителю для другой строки.

...