Подтвердить что ты не робот

Emacs комментирует/раскомментирует текущую строку

Я знаю, что на этот вопрос уже был вопрос Emacs, и что он был закрыт, но я считаю его весьма актуальным и важным.

В принципе, я хочу комментировать/раскомментировать текущую строку. Я ожидал, что это будет довольно легко с макросом, но я обнаружил, что это действительно не так.

Если текущая строка прокомментирована, раскомментируйте. Если он раскоментирован, прокомментируйте это. И я бы также прокомментировал всю строку, а не только позицию курсора.

Я попробовал макрос вроде этого:

C-a

'comment-dwim

Но это только попытка прокомментировать строку, а не раскомментировать ее, если она уже прокомментировала.

Я не уверен, насколько это просто, но если есть какой-то способ, мне это очень понравится.

Кроме того, причина, по которой мне очень нравится эта идея, заключается в том, что когда я использовал Geany, я просто использовал C-e, и это было прекрасно.

4b9b3361

Ответ 1

Попробуйте эту функцию и привяжите к своему любимому ключу:

(defun toggle-comment-on-line ()
  "comment or uncomment current line"
  (interactive)
  (comment-or-uncomment-region (line-beginning-position) (line-end-position)))

Ответ 2

Функция 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 в конце функции.

Ответ 3

Я отвел Трей и уточнил его, чтобы он также работал, когда область активна, но затем работает в этом регионе:

(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)

Ответ 4

Я удивлен, что процедура comment-region не упоминалась. (Хотя я признаю, что это может означать, что я что-то пропустил.) Я получил следующую строку в файле .emacs в течение большей части 20 лет. Он хорошо работает в большинстве основных режимов программирования, о которых я забочусь.

(global-set-key "\C-c\C-c" 'comment-region)

Из документов 'comment-region'

Документация: комментарий или раскомментирование каждой строки в регионе. Только с C-u prefix arg, раскомментирует каждую строку в регионе. Числовой префикс arg ARG означает использование символов комментария ARG. Если ARG отрицательный, удалите многие вместо комментариев. Комментарии заканчиваются на каждой строке, даже для синтаксиса, в котором новая строка не заканчивает комментарий. Пустые строки делают не получать комментарии.

Ответ 5

Я думаю, вы неправильно понимаете, как работают клавиатурные макросы. То, что @Trey предоставлено, является командой Emacs- Lisp. Вы могли бы сделать это для себя, не понимая Emacs- Lisp.

Сначала определите последовательность клавиш, которые делают то, что вы хотите, а затем запишите эту последовательность как макрос.

Вы предложили следующее: C-a M-; (M-; is comment-dwim). Делает ли это то, что вы имели в виду? Если нет, то это не будет волшебным образом работать, когда вы воспроизводите его как макрос клавиатуры.

Ответ 6

Этот ответ применим здесь. Он определяет команду comment-region-lines, которая комментирует или раскомментирует текущую строку, или область, если она активна.

Он похож на comment-or-uncomment-region, но он позволяет вам решить расторжение или комментарий. Это позволяет вам вставлять комментарии, а не автоматически раскомментировать регион, если он уже закомментирован.

При использовании числового префикса arg он использует много символов для запуска комментариев (например, ;, ;;, ;;;,... in Lisp). При использовании обычного префикса C-u arg uncomments. Я привязываю его к C-x C-;.