6 ответов:
попробуйте это:
(add-to-list 'auto-mode-alist '("\.h\'" . c++-mode))всякий раз, когда вы открываете .H файлы, C++ - режим будет использоваться.
другой подход для использования как c-mode, так и C++-mode при необходимости заключается в использовании каталог локальных переменных для установки режима.
переменные каталога вычисляются после установки режима1, так что вы действительно можете написать
.dir-locals.elфайл для вашего проекта C++, содержащий это:((c-mode . ((mode . c++))))и Emacs изменит режим на
c++-modeвсякий раз, когда он изначально установил его вc-mode.если вы работаете со смесью C и проекты C++, это делает для довольно тривиального решения на основе каждого проекта.
конечно, если большинство ваших проектов являются C++, вы можете установить c++-mode по умолчанию2, и вы можете использовать этот подход в обратном порядке, чтобы переключиться в режим c, где это необходимо.
1
normal-modeзвонки(set-auto-mode)и(hack-local-variables)в таком порядке. Смотрите также:как я могу получить доступ к каталогу-локальные переменные в моем основном режиме крючки?2 добавляем
(add-to-list 'auto-mode-alist '("\.h\'" . c++-mode))на открытые
.hфайлы в режиме C++ по умолчанию.
Если вы не хотите, чтобы это применить к каждому .H-файл, вы можете добавить следующее в нижнюю часть ваших файлов заголовков C++.
// Local Variables: // mode: c++ // End:Это будет работать для любых переменных Emacs, которые вы хотите установить на основе каждого файла. Emacs игнорирует ведущие символы, поэтому используйте любые символы комментариев, соответствующие типу файла.
видимо, вы также можете поместить это в верхней части файла:
// -*-c++-*-чтобы сообщить Emacs, что это файл C++.
Я использую это, так как я довольно часто оказываюсь на ванильном Emacs, и он работает без настройки Emacs в любом случае.
;; function decides whether .h file is C or C++ header, sets C++ by ;; default because there's 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 и 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 или C++, но он работает для меня.
Я мог бы поклясться, что видел, что этот вопрос уже ответил соответствующим образом? Странный.
вы хотите этого:
(add-to-list 'auto-mode-alist '("\.h\'" . c++-mode))
Comments