Emacs комментарий / раскомментировать текущую строку
Я знаю, что по этому вопросу уже есть вопрос Emacs, и что он был закрыт, но я считаю его весьма актуальным и важным.
В основном, я хочу комментировать / раскомментировать текущую строку. Я ожидал, что это будет довольно легко с макросом, но я обнаружил, что это действительно не так.
Если текущая строка закомментирована, раскомментируйте. Если это не комментируется, прокомментируйте это. И я бы также закомментировал всю строку, а не только из позиции курсора.
Я попробовал макрос, как это:
Калифорния
'comment-dwim
Но это работает только для того, чтобы прокомментировать строку, а не раскомментировать ее, если она уже прокомментирована.
Я не уверен, насколько это легко, но если есть какой-то способ, мне бы очень понравилось.
Кроме того, причина, по которой я так люблю эту идею, заключается в том, что когда я использовал Geany, я просто использовал Ce, и это было прекрасно.
6 ответов
Попробуйте эту функцию и привяжите к своей любимой клавише:
(defun toggle-comment-on-line ()
"comment or uncomment current line"
(interactive)
(comment-or-uncomment-region (line-beginning-position) (line-end-position)))
Функция Трея работает отлично, но она не очень гибкая.
Попробуйте это вместо этого:
(defun comment-or-uncomment-region-or-line ()
"Comments or uncomments the region or the current line if there's no active region."
(interactive)
(let (beg end)
(if (region-active-p)
(setq beg (region-beginning) end (region-end))
(setq beg (line-beginning-position) end (line-end-position)))
(comment-or-uncomment-region beg end)))
Он комментирует / раскомментирует текущую строку или регион, если он активен.
Если вы предпочитаете, вы можете изменить функцию, чтобы перейти к следующей строке после (не) комментирования текущей строки следующим образом:
(defun comment-or-uncomment-region-or-line ()
"Comments or uncomments the region or the current line if there's no active region."
(interactive)
(let (beg end)
(if (region-active-p)
(setq beg (region-beginning) end (region-end))
(setq beg (line-beginning-position) end (line-end-position)))
(comment-or-uncomment-region beg end)
(next-line)))
Обратите внимание, что единственное, что изменилось, это добавлено next-line
команда в конце функции.
Я взял ответ Трея и уточнил его, чтобы он также работал, когда регион активен, но затем работает над этим регионом:
(defun comment-or-uncomment-line-or-region ()
"Comments or uncomments the current line or region."
(interactive)
(if (region-active-p)
(comment-or-uncomment-region (region-beginning) (region-end))
(comment-or-uncomment-region (line-beginning-position) (line-end-position))
)
)
(define-key c-mode-base-map (kbd "C-/") 'comment-or-uncomment-line-or-region)
Я удивлен comment-region
рутина не была упомянута. (Хотя я допускаю, что это может указывать на то, что я что-то пропустил.) У меня была следующая строка в моем файле.emacs большую часть 20 лет. Он хорошо работает в большинстве основных режимов программирования, которые меня интересуют.
(global-set-key "\C-c\C-c" 'comment-region)
Из документов "коммент-регион"
Документация: Комментируйте или раскомментируйте каждую строку в регионе. Используя только префикс Cu arg, раскомментируйте каждую строку в регионе. Числовой префикс arg ARG означает использование символов комментария ARG. Если ARG отрицательно, вместо этого удалите столько символов комментария. Комментарии заканчиваются в каждой строке, даже для синтаксиса, в котором символ новой строки не заканчивает комментарий. Пустые строки не получают комментарии.
Я думаю, вы неправильно понимаете, как работают клавиатурные макросы. @Trey предоставил команду Emacs-Lisp. Вы могли бы сделать это для себя, не понимая Emacs-Lisp.
Сначала выясните последовательность клавиш, которая делает то, что вы хотите, а затем запишите эту последовательность в качестве макроса.
Вы предложили это: Ca M-; (М- это comment-dwim
). Это делает то, что вы имели в виду? Если нет, то он не будет волшебным образом работать, когда вы воспроизводите его как макрос клавиатуры.
Этот ответ применяется здесь. Определяет команду comment-region-lines
комментирует или раскомментирует текущую строку или регион, если он активен.
Это похоже на comment-or-uncomment-region
, но он позволяет вам решить, раскомментировать или комментировать. Это позволяет вам вкладывать комментарии, вместо того, чтобы автоматически раскомментировать регион, если он уже закомментирован.
С числовым префиксом arg он использует столько начальных символов комментария (например, ;
, ;;
, ;;;
... в Лиспе). С равниной C-u
префикс аргументируется. Я связываю это с C-x C-;
,