Frage

Ich fange Ziel C zu verwenden, und Objective-C Modus arbeitet völlig in Ordnung. Allerdings verwendet ObjC .h-Dateien, wie C und C ++. Ich muss in der Lage, alle drei zu verwenden. Wer weiß, wie emacs kennen zu sagen, ob es in ObjC Modus oder C / C ++ Modus sein sollte?

EDIT: Es scheint einige Verwirrung zu sein, was ich um. Das Problem ist, dass ich einige .h-Dateien, die mit .m-Dateien zugeordnet sind, und einige H-Dateien, die mit .c-Dateien und einigen zugeordnet sind, die mit CPP-Dateien zugeordnet sind. Was I WILL ist etwas, das ich in meinem c-mode-Common-Haken-Stick oder irgendwo, das prüft, um zu sehen, ob es eine objektive C H-Datei ist, und es dann zwingen, objektiver C-Modus , oder so. Die Idee ist, dass dann kann ich nur eine .h-Datei öffnen und es wird automatisch im richtigen Modus sein.

Natürlich kann ich manuell Modus ändern, wenn ich in der Datei bin, aber das ist ein Schmerz, und ich oft vergessen, bis ich Reiter treffen und etwas verrückt passiert. Dies ist die Lösung, die ich jetzt bin mit.

Ich denke, dass der Header-Kommentar wahrscheinlich der richtige Weg, dies zu tun, sondern damit ihm wirklich nützlich sein, ich brauche, um herauszufinden, wie XCode zu bekommen um den Kommentar zu setzen dort, wenn es um die Datei für mich zu schaffen ...

EDIT2:

Ich bin derzeit mit der Header-Kommentar Lösung. Bis ich herausfinden, wie XCode automatisch den Kommentar hinzufügen zu machen, ich bin mit der folgenden elisp Funktion:

(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")))))
War es hilfreich?

Lösung

Sie können, wie dies in der ersten Zeile der Datei einen Kommentar setzen:

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

oder

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

als angemessen. Weitere Details in Festlegen von Dateivariablen in dem Emacs-Handbuch.

Andere Tipps

Ok, wie wäre es eine Lösung, die benötigt keinen speziellen Kommentar in der Datei setzen?

Check this out:

;; 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)

Dies nutzt Emacs' in Paket gebaut, um die entsprechenden .h / .cc-Dateien zu finden. Also, wenn die Header-Datei, die Sie gerade entsprechen eine Datei in c geöffnet ++ -. Modus die .h-Datei in diesem Modus versetzt wird, wenn die Quelle eine objc-Modus-Datei ist, wird der Header in diesem Modus setzt

Keine besonderen Emacs-Variablen in den Kommentaren erforderlich.

Ich würde verwenden eProject mir zu helfen, damit umgehen. Unter der Annahme, dass ich nicht Mix-and-Match-Sprachen innerhalb eines bestimmten Projekts, konnte ich erstellen Sie einfach eine .eproject Datei im Projektstamm, der den Text enthält:

:cc-header-type :objc

Dann würde ich eine Art Standardmodus für H-Dateien festgelegt:

(add-to-list 'auto-mode-alist '("[.]h$" . c-mode))

Dann fügen Sie einen Haken für diesen Modus:

(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))))))

Nun wird der Modus automatisch geändert wird nach der Einstellung in der .eproject Datei. (Beachten Sie, dass die .eproject Datei nicht der einzige Weg ist Variablen für eProject einzustellen;., Wenn Sie ein heuristisches haben objektive c Projekte zu erfassen, eProject die Variable auch auf diese Weise erhalten kann)

Wie auch immer, wenn dies für Sie, lassen Sie mich wissen, damit ich es das eProject Wiki hinzufügen .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top