В emacs, как отключить автоотступник комментария в C/С++?

Иногда я хочу, чтобы временные комментарии полностью оставались оправданными в строке (//) или блоке строк /* */. Тем не менее, CC Mode переопределяет это путем автоматической отступов при вводе второго ключа. В общем, мне нравится автоматический отступ для ключевых слов и т.д., Но я бы предпочел, чтобы он был отключен для комментариев. (обновление: т.е. я хочу отключить способ отступов комментариев, вызванный привязками c-electric-key, но комментарии должны по-прежнему отступать)

Я попытался поместить эти строки в .emacs, но это не мешает поведению.

(c-electric-slash nil)
(c-electric-star nil)

Ответ 1

Короткий ответ:

(eval-after-load 'cc-mode
  '(progn
     (define-key c-mode-base-map "/" 'self-insert-command)
     (define-key c-mode-base-map "*" 'self-insert-command)))

Вот как я об этом говорю:

Определите функцию, связанную с /: C-h k /

В нем говорится: "/запускает команду c-electric-slash, которая является интерактивным скомпилированным Lisp функции в 'cc-cmds.el' ".

(Если вы не видите ссылку на cc-cmds.el, то у вас не установлены источники elisp. Предполагая, что вы не в Windows, вы можете использовать диспетчер системных пакетов для установки пакета emacs-el и попробовать снова).

Следуйте этой ссылке, чтобы открыть cc-cmds.el. Поиск c-electric-slash не находит ничего, кроме определения функции, поэтому ключи не связаны в этом файле. Поиск в cc-mode.el из этого каталога показывает:

(define-key c-mode-base-map "/" 'c-electric-slash)

Теперь мы знаем имя "клавиатуры", в которой можно переопределить привязку /.

Если вы добавите что-то подобное в ваш файл инициализации, вы, вероятно, получите сообщение об ошибке при запуске:

(define-key c-mode-base-map "/" 'self-insert-command)

... потому что ваш файл инициализации загружен до cc-mode.el, а c-mode-base-map - undefined. Поэтому мы используем eval-after-load (как в начале моего ответа). Первый аргумент 'cc-mode должен соответствовать оператору provide в самом конце cc-mode.el. Если вы не знаете, что означает progn, выполните C-h f progn.

Если вам нравится этот стиль обучения/обнаружения Emacs, вы можете рассмотреть возможность чтения "Как узнать Emacs" .

Ответ 2

Я предлагаю посмотреть переменные c-indent-comment-alist и c-indent-comments-syntactically-p. Подробнее об этой переменной см. В разделе "C-h v) и в разделах" Настройка отступов" и " Переменные стиля" в руководстве по режиму CC