2009-06-18 25 views
8

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

EDIT: Parece que hay algo de confusión en 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 guardar en mi c-mode-common-hook o en algún lugar que verificará si se trata de un archivo C .h objetivo, y luego lo forzará al modo C objetivo, o algo así. La idea es que puedo abrir un archivo .h y automáticamente estará en el modo correcto.

Obviamente puedo cambiar de modo manualmente cuando estoy en el archivo, pero eso es un problema, y ​​a menudo me olvido hasta que toco la pestaña y sucede algo raro. Esta es la solución que estoy usando ahora.

Creo que el comentario del encabezado es probablemente la forma correcta de hacerlo, pero para que sea VERDADERAMENTE útil, necesito averiguar cómo hacer que XCode ponga el comentario allí cuando está creando el archivo para me ...

Edit2:

Actualmente estoy usando la solución cabecera de comentario. Hasta que pueda encontrar la manera de hacer XCode añadir 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"))))) 
+1

No entiendo su objeción? los archivos objetivo .h son diferentes a los archivos C++ .h. Quiero usar el modo correcto. –

+0

Puede usar un marcador en lugar de calcular la posición de retorno usted mismo: (let ((m (marcador de punto))) (goto-char 0) (inserte "...") (goto-char (marcador-posición m))) – Svante

Respuesta

15

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

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

o

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

según sea apropiado. Más detalles en Specifying File Variables en el manual de Emacs.

+0

que funcionará, sí. Estaba buscando un POCO menos de esfuerzo, pero puedo hacer un script para hacer eso ... –

+0

Ahora, necesito una forma de agregar automáticamente eso cuando Xcode crea el archivo ... –

1

Yo usaría eproject para ayudarme a manejar esto. Suponiendo idiomas que no mezclo y combinar dentro de un proyecto dado, tan sólo pudiera crear un archivo .eproject en la raíz del proyecto que contiene el texto:

:cc-header-type :objc 

Entonces, me puse algún tipo de defecto el modo de archivos .h:

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

a continuación, agregue un gancho para ese modo:

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

Ahora el modo se cambiará automáticamente de acuerdo con el ajuste que realiza en el .eproject archivo. (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 todos modos, si esto funciona para usted, házmelo saber para que pueda agregarlo al eproject wiki.

+0

En realidad, tendré que mezclar C++ y Archivos de Objective C en un proyecto ... –

+0

Los proyectos de ObjC contienen con frecuencia C++. Incluso hay dialectos ObjC++. – Arafangion

5

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 Emacs construido en el paquete para encontrar los correspondientes archivos .h/.cc. 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 el origen es un archivo objc-mode, el encabezado se pone en ese modo.

No hay variables especiales de Emacs en los comentarios requeridos.

+0

Interesante. Tendré que mirar eso con más cuidado para ver exactamente cómo está funcionando. ¡Muy agradable! –