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")))))
Foi útil?

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 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top