Подтвердить что ты не робот

Как сказать emacs открыть файл .h в режиме С++?

Какие строки следует добавить в файл _emacs (в Windows), чтобы он открывал файлы .h в режиме С++? По умолчанию используется режим C.

4b9b3361

Ответ 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))