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-;,

Другие вопросы по тегам