Ответ 1
Попробуйте эту функцию и привяжите к своему любимому ключу:
(defun toggle-comment-on-line ()
"comment or uncomment current line"
(interactive)
(comment-or-uncomment-region (line-beginning-position) (line-end-position)))
Я знаю, что на этот вопрос уже был вопрос Emacs, и что он был закрыт, но я считаю его весьма актуальным и важным.
В принципе, я хочу комментировать/раскомментировать текущую строку. Я ожидал, что это будет довольно легко с макросом, но я обнаружил, что это действительно не так.
Если текущая строка прокомментирована, раскомментируйте. Если он раскоментирован, прокомментируйте это. И я бы также прокомментировал всю строку, а не только позицию курсора.
Я попробовал макрос вроде этого:
C-a
'comment-dwim
Но это только попытка прокомментировать строку, а не раскомментировать ее, если она уже прокомментировала.
Я не уверен, насколько это просто, но если есть какой-то способ, мне это очень понравится.
Кроме того, причина, по которой мне очень нравится эта идея, заключается в том, что когда я использовал Geany, я просто использовал C-e, и это было прекрасно.
Попробуйте эту функцию и привяжите к своему любимому ключу:
(defun toggle-comment-on-line ()
"comment or uncomment current line"
(interactive)
(comment-or-uncomment-region (line-beginning-position) (line-end-position)))
Функция Trey работает отлично, но она не очень гибкая.
Попробуйте это вместо:
(defun comment-or-uncomment-region-or-line ()
"Comments or uncomments the region or the current line if there 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)))
Он комментирует/удаляет текущую строку или область, если она активна.
Если вы предпочитаете, вы можете изменить функцию, чтобы перейти к следующей строке после (un) комментирования текущей строки следующим образом:
(defun comment-or-uncomment-region-or-line ()
"Comments or uncomments the region or the current line if there 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)
Из документов 'comment-region'
Документация: комментарий или раскомментирование каждой строки в регионе. Только с C-u prefix arg, раскомментирует каждую строку в регионе. Числовой префикс arg ARG означает использование символов комментария ARG. Если ARG отрицательный, удалите многие вместо комментариев. Комментарии заканчиваются на каждой строке, даже для синтаксиса, в котором новая строка не заканчивает комментарий. Пустые строки делают не получать комментарии.
Я думаю, вы неправильно понимаете, как работают клавиатурные макросы. То, что @Trey предоставлено, является командой Emacs- Lisp. Вы могли бы сделать это для себя, не понимая Emacs- Lisp.
Сначала определите последовательность клавиш, которые делают то, что вы хотите, а затем запишите эту последовательность как макрос.
Вы предложили следующее: C-a M-; (M-; is comment-dwim
). Делает ли это то, что вы имели в виду? Если нет, то это не будет волшебным образом работать, когда вы воспроизводите его как макрос клавиатуры.
Этот ответ применим здесь. Он определяет команду comment-region-lines
, которая комментирует или раскомментирует текущую строку, или область, если она активна.
Он похож на comment-or-uncomment-region
, но он позволяет вам решить расторжение или комментарий. Это позволяет вам вставлять комментарии, а не автоматически раскомментировать регион, если он уже закомментирован.
При использовании числового префикса arg он использует много символов для запуска комментариев (например, ;
, ;;
, ;;;
,... in Lisp). При использовании обычного префикса C-u
arg uncomments. Я привязываю его к C-x C-;
.