Вопрос

Я начинаю использовать 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 также может получить переменную таким образом.)

В любом случае, если это работает для вас, дайте мне знать, чтобы я мог добавить это в епроект вики.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top