Как закомментировать текущую строку в paredit?
Я использую M-;
закомментировать текущую строку или закомментировать регион с наборами меток, прежде чем я встретлю режим paredit.
Но в режиме паредита кажется, что я не могу закомментировать текущую строку, пока я C-a
и вставить ;
вручную или пометить строку, прежде чем я M-;
так как в этом режиме использовать M-;
в начале строки вставим ;;;
над строкой и в середине или конце строки вставляется комментарий окончания строки.
Итак, мой вопрос, как закомментировать текущую строку более элегантным способом?
4 ответа
Я не думаю, что paredit предоставляет какую-либо команду для комментирования строки, поэтому я поделюсь советом, который работает независимо от того, использует ли paredit или нет.
Предположим, у вас есть этот код:
(defun my-hi ()
(dotimes (_ 2)
(print "hello")
(print (+ 1
2))
(print "world"))
(print "the end"))
Если вы хотите закомментировать третью строку, вы просто выбираете выражение и затем нажимаете M-;
, То есть вы перемещаете точку в любой пробел перед выражением (print "hello")
а затем нажмите C-M-SPC
чтобы выбрать выражение, а затем нажмите M-;
закомментировать выражение.
Что если вы хотите закомментировать две строки, например, что если вы хотите закомментировать выражение (print (+ 1 2))
который охватывает две строки? Это то же самое, вы перемещаете точку в любой пробел перед началом выражения, а затем нажимаете C-M-SPC M-;
,
А что если вы хотите закомментировать строку, содержащую выражение (print "world")
? Но это плохая идея. Вместо этого вы хотите закомментировать только выражение (print "world")
, Как это сделать? Опять то же самое.
Что если вы хотите закомментировать все операторы в цикле, кроме первого, то есть, что если вы хотите закомментировать (print (+ 1 2))
а также (print "hello")
? Переместите точку перед началом первого выражения, которое вы хотите закомментировать, а затем нажмите C-M-SPC
два раза, чтобы выбрать два выражения, а затем нажмите M-;
,
Выбор выражений (в отличие от выбора строк) не только безопаснее (в том смысле, что не вводится несовпадающий знак скобок), но и более удобен. Например, как бы вы прокомментировали форму dotimes? С помощью C-M-SPC
выбрать целую форму dotimes удобнее, чем выделять пять строк одну за другой.
Мораль этой истории похожа на следующую мораль Vim: "В Vim дело в том, что вы работаете с текстовыми объектами (словами, строками, предложениями, блоками кода и т. Д.), А не с буквами".
При редактировании на Лиспе дело в том, что вы работаете с выражениями (sexps), а не со строками или буквами.
Чтобы сделать это более удобным, вы можете захотеть определить команду, которая закомментирует первые N выражений после точки, в которой N определяется числом последовательных вызовов команды или префиксным аргументом. Или команда, которая закомментирует одно выражение после точки и перемещает точку в начало следующего выражения, если оно есть.
Если вы действительно хотите закомментировать текущую строку, введите Cq; в начале строки.
Проблема в том, что это почти никогда не то, что вы хотите.
Просто введите ;
закомментировать все, что можно прокомментировать в строке с самого начала. (Любые последующие закрывающие разделители будут перемещены на следующую строку.)
Если вы пытаетесь прокомментировать пустую строку или конец одного, просто используйте ;
с курсором, где ;
должно быть. При комментировании кода следует рассмотреть возможность комментирования s-выражения вместо строки. Таким образом, баланс скобок может быть сохранен. Паредит предоставляет полезный интерфейс для этого.
;
Клавиша может быть использована для форм более низкого уровня, и они будут автоматически сбалансированы с помощью paredit, хотя я нахожу это более уродливым: (курсор |
но нет #|
или же |#
)
(foo (bar | baz) quuz)
будет выглядеть так:
(foo (bar ; baz
) quuz)
Но
|(blah bla bl a)
выдает ошибку.
Если SLIME установлен, то slime-insert-balanced-comments
можно использовать, что с радостью вставит комментарий при сохранении сбалансированных скобок. Этот комментарий оказывается прочитанным макросом, использующим #|
а также |#
, Всегда можно C-q ;
но это сделает их неуравновешенными. Весь смысл паредита в том, чтобы держать их в равновесии.
(|defun (blah) blah) -> #|(defun (blah) blah)|#
Он комментирует форму самого низкого уровня:
(foo (bar | fuux) duux) -> (foo #|(bar | fuux)|# duux)
У меня есть это в моем .emacs.el
файл, потому что slime-insert-balanced-comments
по умолчанию не привязан к ключу.
(global-set-key (kbd "C-c ;") 'slime-insert-balanced-comments)