Вопрос
Я начинаю использовать Object C, и режим Object C работает отлично.Однако ObjC использует файлы .h, как и C и C++.Мне нужно иметь возможность использовать все три.Кто-нибудь знает, как заставить emacs сообщать, должен ли он находиться в режиме objC или в режиме C/C++?
РЕДАКТИРОВАТЬ:Кажется, возникла некоторая путаница в том, о чем я прошу.Проблема в том, что у меня есть некоторые файлы .h, связанные с файлами .m, некоторые файлы .h, связанные с файлами .c, и некоторые, связанные с файлами .cpp.Что я ХОТЕТЬ это то, что я могу вставить в свой c-mode-common-hook или куда-нибудь еще, чтобы проверить, является ли это объективным файлом C .h, а затем принудительно перевести его в объективный C-режим или что-то в этом роде.Идея состоит в том, что тогда я могу просто открыть файл .h, и он автоматически перейдет в правильный режим.
Очевидно, я могу вручную изменить режим, когда нахожусь в файле, но это муторно, и я часто забываю об этом, пока не нажимаю вкладку и не происходит что-то странное.Это решение, которое я использую сейчас.
Я думаю, что комментарий к заголовку, вероятно, является правильным способом сделать это, но для того, чтобы он был ДЕЙСТВИТЕЛЬНО полезным, мне нужно выяснить, как заставить XCode поместить туда комментарий, когда он создает для меня файл...
РЕДАКТИРОВАТЬ2:
В настоящее время я использую решение для комментариев к заголовку.Пока я не смогу выяснить, как заставить XCode автоматически добавлять комментарий, я использую следующую функцию elisp:
(defun bp-add-objC-comment ()
"Adds the /* -*- mode: objc -*- */ line at the top of the file"
(interactive)
(objc-mode)
(let((p (point)))
(goto-char 0)
(insert "/* -*- mode: objc -*- */\n")
(goto-char (+ p (length "/* -*- mode: objc -*- */\n")))))
Решение
Вы можете поместить такой комментарий в первую строку файла:
/* -*- mode: objc -*- */
или
// -*- mode: c++ -*-
по мере необходимости.Более подробная информация в Указание переменных файла в руководстве Emacs.
Другие советы
Хорошо, а как насчет решения, которое не требует помещения специального комментария в файл?
Проверь это:
;; need find-file to do this
(require 'find-file)
;; find-file doesn't grok objc files for some reason, add that
(push ".m" (cadr (assoc "\\.h\\'" cc-other-file-alist)))
(defun my-find-proper-mode ()
(interactive)
;; only run on .h files
(when (string-match "\\.h\\'" (buffer-file-name))
(save-window-excursion
(save-excursion
(let* ((alist (append auto-mode-alist nil)) ;; use whatever auto-mode-alist has
(ff-ignore-include t) ;; operate on buffer name only
(src (ff-other-file-name)) ;; find the src file corresponding to .h
re mode)
;; go through the association list
;; and find the mode associated with the source file
;; that is the mode we want to use for the .h file
(while (and alist
(setq mode (cdar alist))
(setq re (caar alist))
(not (string-match re src)))
(setq alist (cdr alist)))
(when mode (funcall mode)))))))
(add-hook 'find-file-hook 'my-find-proper-mode)
При этом используется встроенный пакет Emacs для поиска соответствующих файлов .h/.cc.Таким образом, если файл заголовка, который вы только что открыли, соответствует файлу в режиме C++, файл .h помещается в этот режим, если источником является файл в режиме objc, заголовок помещается в этот режим.
Никаких специальных переменных Emacs в комментариях не требуется.
я хотел бы использовать епроект чтобы помочь мне справиться с этим.Предполагая, что я не смешиваю и сопоставляю языки внутри одного проекта, я мог бы просто создать .eproject
файл в корне проекта, содержащий текст:
:cc-header-type :objc
Затем я бы установил какой-то режим по умолчанию для файлов .h:
(add-to-list 'auto-mode-alist '("[.]h$" . c-mode))
Затем добавьте хук для этого режима:
(add-hook 'c-mode-hook (lambda ()
(let ((header-style (eproject-attribute :cc-header-type)))
(when (and header-style
(string-match "[.]h$" (buffer-file-name)))
(case header-style
(:objc (objc-mode))
(:c++ (c++-mode))
(:c (c-mode))))))
Теперь режим будет меняться автоматически в соответствии с настройками, сделанными вами в .eproject
файл.(Обратите внимание, что .eproject
файл — не единственный способ установить переменные для eproject;если у вас есть эвристика для обнаружения проектов Objective C, eproject также может получить переменную таким образом.)
В любом случае, если это работает для вас, дайте мне знать, чтобы я мог добавить это в епроект вики.