2012-06-16 1 views
10

Иногда я хочу, чтобы временные комментарии полностью оставались на оправке на линии (//) или блоке строк /* */. Тем не менее, CC Mode переопределяет это путем автоотложения при вводе второго ключа. В общем, мне нравится автоматический отступ для ключевых слов и т. Д., Но я бы предпочел, чтобы он был отключен для комментариев. (Обновление: т. Е я хочу, чтобы отключить способ комментарий отступы срабатывает по с- электро- ключевых привязок, но комментарии все равно должны отступа обычно othewise)В emacs, как отключить автоотступник комментариев в C/C++?

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

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

ответ

8

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

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

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

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

+0

Блестяще! Какое замечательное объяснение! .. и это тоже работает :) ... Спасибо ... и я, –

+0

Предложение: обновите это, чтобы использовать 'with-eval-after-load' –

+0

Для чего это стоит, я боролся с этой проблемой при создании основного режима, полученного из' c-mode'. добавив две строки 'define-key' в определение ключевой карты моего режима (и изменив' c-mode-base-map' на имя моей локальной карты), я смог устранить это поведение. Спасибо! – ohruunuruus

0

Я предлагаю посмотреть на c-indent-comment-alist & c-indent-comments-syntactically-p переменных. Смотрите дополнительную информацию в помощь для этой переменной (C-h v) и в разделах «Customizing Indentation» и «Style Variables» руководства CC-режим

+0

Я еще не прочитал все это (не говоря уже о том, чтобы сцепиться с новым жаргоном emacs), но у меня есть ощущение, что ваше предложение меняется *** как *** вещи отступают.Я не хочу изменять поведение отступов: я хочу, чтобы строки комментариев обычно отступали в большинстве ситуаций, но я не хочу * (c-electric-slash * и * (c-electric-star *, чтобы диктовать, что отступ происходит *** при нажатии *** '/' или '*'. Возможно, это так же просто, как повторное связывание ключей '/' и '*' от * электрических * функций с 'self-insert-command' , но только для * CC Mode * (это бит, который я не знаю, как это сделать). –