Pergunta
Eu estou começando a usar objetivo C, e o modo C objetivo funciona perfeitamente bem. No entanto, ObjC usa arquivos .h, assim como C e C ++. Eu preciso ser capaz de usar todos os três. Alguém sabe como obter emacs para dizer se ele deve estar no modo ObjC ou o modo C / C ++?
EDIT: Parece haver alguma confusão sobre o que eu estou pedindo. O problema é que eu tenho alguns arquivos .h que estão associados com arquivos .m, e alguns arquivos .h que estão associados com arquivos .c e alguns que estão associados com arquivos .cpp. O que eu Deseja é algo que eu posso ficar no meu c-mode-common-gancho ou em algum lugar que irá verificar para ver se é arquivo de um objetivo C .h, e depois forçá-lo para o modo C objetivo , ou alguma coisa. A idéia é que, em seguida, eu posso simplesmente abrir um arquivo .h e será automaticamente no modo correto.
Obviamente, eu posso modo de alterar manualmente quando estou no arquivo, mas isso é uma dor, e eu muitas vezes esquecem até que eu bati guia e algo maluco acontece. Esta é a solução que eu estou usando agora.
Eu acho que o comentário de cabeçalho é provavelmente a maneira certa de fazer isso, mas para que seja verdadeiramente útil, eu preciso descobrir como obter XCode para colocar o comentário na lá quando é criar o arquivo para mim ...
EDIT2:
Atualmente estou usando o cabeçalho-comment solução. Até que eu possa descobrir como fazer XCode automaticamente adicionar o comentário, eu estou usando a seguinte função 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")))))
Solução
Você pode colocar um comentário como este na primeira linha do arquivo:
/* -*- mode: objc -*- */
ou
// -*- mode: c++ -*-
conforme o caso. Mais detalhes no especificar as variáveis ??de arquivo no manual do Emacs.
Outras dicas
Ok, e quanto a uma solução que não requer colocar um comentário especial no arquivo?
Veja isto:
;; 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)
Isto usa Emacs construídas no pacote de encontrar as correspondentes .h / .cc arquivos. Assim, se o arquivo de cabeçalho que você abriu corresponde a um arquivo em c ++ -. Modo, o arquivo .h é colocado nesse modo, se a fonte é um arquivo de modo objc, o cabeçalho é colocado nesse modo
variáveis ??No special Emacs nos comentários necessário.
Gostaria de usar eProject para me ajudar a lidar com isso. Assumindo línguas que eu não misturar e combinar dentro de um determinado projeto, eu poderia simplesmente criar um arquivo .eproject
na raiz do projeto que contém o texto:
:cc-header-type :objc
Então, eu definir uma espécie de modo padrão para .h arquivos:
(add-to-list 'auto-mode-alist '("[.]h$" . c-mode))
Em seguida, adicione um gancho para esse 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))))))
Agora, o modo será alterado automaticamente de acordo com a configuração que você faz no arquivo .eproject
. (Note-se que o arquivo .eproject
não é a única forma de variáveis ??de ajuste para eProject;. Se você tem uma heurística para detectar projectos Objective C, eProject pode obter a variável dessa forma também)
De qualquer forma, se isso funciona para você, me avise para que eu possa adicioná-lo ao eProject wiki .