Какие строки следует добавить в файл _emacs (в Windows), чтобы он открывал файлы .h в режиме С++? По умолчанию используется режим C.
Как сказать emacs открыть файл .h в режиме С++?
Ответ 1
Попробуйте следующее:
(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))
Всякий раз, когда вы открываете файлы .h, будет использоваться режим С++.
Ответ 2
Другой подход для использования как режима c-mode, так и С++ - это использовать локальные переменные каталога для установки режима.
Переменные каталога оцениваются после того, как был установлен режим 1 поэтому вы можете написать файл .dir-locals.el
для вашего проекта на С++, содержащий это:
((c-mode . ((mode . c++))))
И Emacs изменит режим на c++-mode
, когда он изначально установил его в c-mode
.
Если вы работаете с сочетанием проектов на C и С++, это создает довольно тривиальное решение для каждого проекта.
Конечно, если большинство ваших проектов - С++, вы можете установить С++-режим как стандартный 2 и затем вы можете использовать этот подход в обратном порядке, чтобы переключиться в c-mode, где это необходимо.
1normal-mode
вызывает (set-auto-mode)
и (hack-local-variables)
в этом порядке. См. Также: Как получить доступ к локальным переменным каталога в моих основных режимах?
2 Для этого добавьте
(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))
в ваш .emacs
файл, который по умолчанию открывает файлы .h
в режиме С++.
Ответ 3
Если вы не хотите, чтобы это применимо к каждому .h файлу, вы можете добавить нижеследующие файлы заголовков С++.
// Local Variables:
// mode: c++
// End:
Это будет работать для любых переменных Emacs, которые вы хотите установить для каждого файла. Emacs игнорирует ведущие символы, поэтому используйте любые символы комментариев для типа файла.
Ответ 4
По-видимому, вы также можете поместить это в начало файла:
// -*-c++-*-
чтобы сообщить Emacs это файл С++.
Я использую это, так как я довольно часто оказываюсь на ванильном Emacs, и он работает без какой-либо настройки Emacs.
Ответ 5
Поскольку я регулярно использую C и С++, я написал эту функцию, чтобы попытаться "угадать", должен ли файл .h быть C или С++
;; function decides whether .h file is C or C++ header, sets C++ by
;; default because there more chance of there being a .h without a
;; .cc than a .h without a .c (ie. for C++ template files)
(defun c-c++-header ()
"sets either c-mode or c++-mode, whichever is appropriate for
header"
(interactive)
(let ((c-file (concat (substring (buffer-file-name) 0 -1) "c")))
(if (file-exists-p c-file)
(c-mode)
(c++-mode))))
(add-to-list 'auto-mode-alist '("\\.h\\'" . c-c++-header))
И если это не работает, я устанавливаю ключ для переключения между режимами C и С++.
;; and if that doesn't work, a function to toggle between c-mode and
;; c++-mode
(defun c-c++-toggle ()
"toggles between c-mode and c++-mode"
(interactive)
(cond ((string= major-mode "c-mode")
(c++-mode))
((string= major-mode "c++-mode")
(c-mode))))
Это не идеально, может быть лучшая эвристика для решения, является ли заголовок C или С++, но он работает для меня.
Ответ 6
Я мог бы поклясться, что увидел, что этот вопрос уже ответил правильно? Weird.
Вы хотите:
(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode))