質問
私は客観的Cを使い始めましたが、客観的Cモードは完璧に機能します。ただし、ObjCはCやC ++と同様に.hファイルを使用します。 3つすべてを使用できる必要があります。 emacsを使用してobjCモードにするかC / C ++モードにするかを知る方法を知っていますか?
編集:私が何を求めているのか混乱しているようです。問題は、.mファイルに関連付けられている.hファイルと、.cファイルに関連付けられている.hファイルと、.cppファイルに関連付けられている.hファイルがあることです。私が欲しいとは、c-mode-common-hook、または目的のC .hファイルであるかどうかを確認し、目的のC-modeに強制する場所に固執できるものです。 、 か何か。その考えは、その後.hファイルを開くだけで、自動的に正しいモードになるということです。
明らかに、ファイル内にいるときに手動でモードを変更できますが、それは苦痛であり、タブを押すと何か変なことが起こるまで忘れることがよくあります。これは私が現在使用しているソリューションです。
ヘッダーのコメントはおそらくこれを行う正しい方法だと思いますが、本当に役立つようにするには、ファイルを作成するときに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")))))
解決
ファイルの最初の行に次のようなコメントを入力できます。
/* -*- mode: objc -*- */
または
// -*- mode: c++ -*-
必要に応じて。詳細については、ファイル変数の指定をご覧ください。 Emacsマニュアルの
他のヒント
OK、ファイルに特別なコメントを入れる必要のない解決策はどうですか?
チェックアウト:
;; 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)
これは、対応する.h / .ccファイルを見つけるためにEmacsの組み込みパッケージを使用します。したがって、開いたヘッダーファイルがc ++モードのファイルに対応する場合、.hファイルはそのモードになり、ソースがobjcモードファイルの場合、ヘッダーはそのモードになります。
コメントには特別なEmacs変数は必要ありません。
eproject を使用して、これを処理します。特定のプロジェクト内で言語を混在させないと仮定すると、次のテキストを含むプロジェクトルートに .eproject
ファイルを作成できます。
:cc-header-type :objc
次に、.hファイルに何らかのデフォルトモードを設定します:
(add-to-list 'auto-mode-alist '("[.]h(add-hook 'c-mode-hook (lambda ()
(let ((header-style (eproject-attribute :cc-header-type)))
(when (and header-style
(string-match "[.]h<*>quot; (buffer-file-name)))
(case header-style
(:objc (objc-mode))
(:c++ (c++-mode))
(:c (c-mode))))))
quot; . c-mode))
次に、そのモードのフックを追加します:
<*> .eproject
ファイルで行った設定に従って、モードが自動的に変更されます。 (ecodeの変数を設定する唯一の方法は .eproject
ファイルではないことに注意してください。客観的なcプロジェクトを検出するためのヒューリスティックがある場合、eprojectはそのように変数を取得できます。)
とにかく、これがあなたのために働くならば、私にそれを eproject wikiに追加できるように私に知らせてください。