Вопрос о режиме Emacs - PullRequest
8 голосов
/ 18 июня 2009

Я начинаю использовать объектив C, и режим C работает отлично. Тем не менее, ObjC использует файлы .h, так же, как C и C ++. Я должен быть в состоянии использовать все три. Кто-нибудь знает, как заставить emacs определить, должен ли он работать в режиме objC или C / C ++?

РЕДАКТИРОВАТЬ: Кажется, есть некоторая путаница в том, что я прошу. Проблема заключается в том, что у меня есть некоторые файлы .h, связанные с файлами .m, и некоторые файлы .h, связанные с файлами .c, а некоторые - с файлами .cpp. То, что я ХОЧУ - это то, что я могу вставить в мой c-mode-common-hook или где-нибудь, что проверит, является ли это объективным C .h файлом, а затем принудительно переведет его в целевой C-режим или что-то. Идея в том, что тогда я могу просто открыть .h файл, и он автоматически будет в правильном режиме.

Очевидно, что я могу вручную изменить режим, когда нахожусь в файле, но это больно, и я часто забываю, пока не нажму кнопку Tab и не случится что-то дурацкое. Это решение, которое я использую сейчас.

Я думаю, что комментарий заголовка, вероятно, является правильным способом сделать это, но для того, чтобы он был НАСТОЯЩИМ полезным, мне нужно выяснить, как заставить XCode разместить комментарий там, когда он создает файл для меня ...

EDIT2:

В настоящее время я использую решение для комментариев к заголовкам. Пока я не могу понять, как заставить 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")))))

Ответы [ 3 ]

15 голосов
/ 18 июня 2009

Вы можете поместить такой комментарий в первую строку файла:

/* -*- mode: objc -*- */

или

// -*- mode: c++ -*-

в зависимости от ситуации. Подробнее в Указание переменных файла в руководстве по Emacs.

5 голосов
/ 19 июня 2009

Хорошо, а как насчет решения, которое не требует добавления специального комментария в файл?

Проверьте это:

;; 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 в комментариях не требуется.

1 голос
/ 18 июня 2009

Я бы использовал eproject , чтобы помочь мне справиться с этим. Предполагая, что я не смешиваю и не сопоставляю языки внутри данного проекта, я могу просто создать файл .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; если у вас есть эвристика для обнаружения проектов c, eproject также может получить переменную таким же образом.)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...