Question

Je commence à utiliser l’objectif C et le mode objectif C fonctionne parfaitement. Cependant, ObjC utilise des fichiers .h, tout comme C et C ++. Je dois pouvoir utiliser les trois. Est-ce que quelqu'un sait comment faire dire à emacs s'il doit être en mode objC ou en mode C / C ++?

EDIT: Il semble y avoir une certaine confusion sur ce que je demande. Le problème est que j'ai des fichiers .h associés à des fichiers .m et des fichiers .h associés à des fichiers .c et d'autres associés à des fichiers .cpp. Ce que je VEUX , c’est quelque chose que je peux coller dans mon hook c-mode-common-hook ou quelque part qui va vérifier si c’est un fichier C .h objectif, puis le forcer à l’objectif C-mode , ou quelque chose. L'idée étant qu'alors je peux ouvrir un fichier .h et qu'il se trouvera automatiquement dans le mode correct.

Évidemment, je peux changer de mode manuellement lorsque je suis dans le fichier, mais c'est pénible et j'oublie souvent jusqu'à ce que je tape sur l'onglet et que quelque chose de bizarre se produise. C'est la solution que j'utilise maintenant.

Je pense que le commentaire d'en-tête est probablement le bon moyen de le faire, mais pour qu'il soit vraiment utile, je dois trouver comment obtenir que XCode place le commentaire là-bas lorsqu'il crée le fichier pour moi. ...

EDIT2:

J'utilise actuellement la solution header-comment. Jusqu'à ce que je sache comment faire en sorte que XCode ajoute automatiquement le commentaire, j'utilise la fonction elisp suivante:

(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")))))
Était-ce utile?

La solution

Vous pouvez mettre un commentaire comme celui-ci dans la première ligne du fichier:

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

ou

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

comme approprié. Plus de détails dans Spécification des variables de fichier dans le manuel Emacs.

Autres conseils

Ok, pourquoi pas une solution qui ne nécessite pas de commentaire spécial dans le fichier?

Découvrez ceci:

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

Ceci utilise le paquet intégré d'Emacs pour trouver les fichiers .h / .cc correspondants. Ainsi, si le fichier d’en-tête que vous venez d’ouvrir correspond à un fichier en mode c ++, le fichier .h est placé dans ce mode. Si la source est un fichier en mode objc, l’en-tête est placé dans ce mode.

Aucune variable spéciale Emacs dans les commentaires requis.

J'utiliserais eproject pour m'aider à gérer cela. En supposant que je ne mélange pas les langues d'un même projet, je pourrais créer un fichier .eproject dans la racine du projet contenant le texte:

:cc-header-type :objc

Ensuite, je définirais une sorte de mode par défaut pour les fichiers .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))

Ajoutez ensuite un hook pour ce mode:

<*>

Le mode changera automatiquement en fonction du réglage effectué dans le fichier .eproject . (Notez que le fichier .eproject n'est pas le seul moyen de définir des variables pour eproject; si vous avez une heuristique pour détecter les projets d'objectif c, eproject peut également obtenir la variable de cette manière.)

Quoi qu'il en soit, si cela fonctionne pour vous, faites-le moi savoir afin que je puisse l'ajouter au wiki de eproject .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top