Pregunta

Estoy empezando a usar el objetivo C, y el modo objetivo C funciona perfectamente bien. Sin embargo, ObjC usa archivos .h, al igual que C y C ++. Necesito poder usar los tres. ¿Alguien sabe cómo hacer que emacs diga si debería estar en modo objC o en modo C / C ++?

EDITAR: Parece haber cierta confusión sobre lo que estoy pidiendo. El problema es que tengo algunos archivos .h que están asociados con archivos .m, y algunos archivos .h que están asociados con archivos .c y algunos que están asociados con archivos .cpp. Lo que QUIERO es algo que puedo pegar en mi gancho común c-mode o en algún lugar que verifique si es un archivo C .h objetivo y luego lo fuerce al modo C objetivo , o algo. La idea es que luego puedo abrir un archivo .h y automáticamente estará en el modo correcto.

Obviamente puedo cambiar manualmente el modo cuando estoy en el archivo, pero eso es un dolor, y a menudo lo olvido hasta que presiono la tecla y sucede algo extraño. Esta es la solución que estoy usando ahora.

Creo que el comentario del encabezado es probablemente la forma correcta de hacer esto, pero para que sea realmente útil, necesito descubrir cómo hacer que XCode coloque el comentario allí cuando esté creando el archivo para mí. ...

EDIT2:

Actualmente estoy usando la solución de comentario de encabezado. Hasta que pueda descubrir cómo hacer que XCode agregue automáticamente el comentario, estoy usando la siguiente función 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")))))
¿Fue útil?

Solución

Puede poner un comentario como este en la primera línea del archivo:

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

o

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

según corresponda. Más detalles en Especificación de variables de archivo en el manual de Emacs.

Otros consejos

Ok, ¿qué tal una solución que no requiere poner un comentario especial en el archivo?

Mira esto:

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

Esto utiliza el paquete integrado de Emacs para encontrar los archivos .h / .cc correspondientes. Entonces, si el archivo de encabezado que acaba de abrir corresponde a un archivo en modo c ++, el archivo .h se pone en ese modo, si la fuente es un archivo en modo objc, el encabezado se pone en ese modo.

No se requieren variables especiales de Emacs en los comentarios.

Usaría eproject para ayudarme a manejar esto. Suponiendo que no mezcle y combine idiomas dentro de un proyecto determinado, podría crear un archivo .eproject en la raíz del proyecto que contiene el texto:

:cc-header-type :objc

Entonces, establecería algún tipo de modo predeterminado para archivos .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))

Luego, agregue un gancho para ese modo:

<*>

Ahora el modo cambiará automáticamente según la configuración que realice en el archivo .eproject . (Tenga en cuenta que el archivo .eproject no es la única forma de establecer variables para eproject; si tiene una heurística para detectar proyectos objetivos c, eproject también puede obtener la variable de esa manera).

De todos modos, si esto funciona para usted, hágamelo saber para que pueda agregarlo al eproject wiki .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top