Domanda

Sto iniziando a utilizzare l'obiettivo C e la modalità obiettivo C funziona perfettamente. Tuttavia, ObjC utilizza file .h, proprio come C e C ++. Devo essere in grado di usare tutti e tre. Qualcuno sa come ottenere emacs per dire se dovrebbe essere in modalità OBJC o C / C ++?

EDIT: sembra esserci un po 'di confusione su ciò che sto chiedendo. Il problema è che ho alcuni file .h associati ai file .m e alcuni file .h associati ai file .c e altri associati ai file .cpp. Quello che VOGLIO è qualcosa che posso attaccare nel mio hook comune c-mode o da qualche parte che verificherà se si tratta di un file C .h obiettivo, e quindi lo forza in modalità C obiettivo , o qualcosa. L'idea è che poi posso solo aprire un file .h e sarà automaticamente nella modalità corretta.

Ovviamente posso cambiare manualmente la modalità quando mi trovo nel file, ma è una seccatura, e spesso mi dimentico fino a quando non raggiungo la scheda e succede qualcosa di strano. Questa è la soluzione che sto usando ora.

Penso che il commento dell'intestazione sia probabilmente il modo giusto per farlo, ma affinché sia ??VERAMENTE utile, devo capire come far sì che XCode inserisca il commento quando sta creando il file per me ...

EDIT2:

Attualmente sto usando la soluzione di commento-intestazione. Fino a quando non riesco a capire come aggiungere automaticamente XCode al commento, sto usando la seguente funzione 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")))))
È stato utile?

Soluzione

Puoi inserire un commento come questo nella prima riga del file:

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

o

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

come appropriato. Maggiori dettagli in Specifica delle variabili di file nel manuale di Emacs.

Altri suggerimenti

Ok, che ne dici di una soluzione che non richiede di inserire un commento speciale nel file?

Dai un'occhiata:

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

Usa il pacchetto integrato di Emacs per trovare i file .h / .cc corrispondenti. Quindi, se il file di intestazione che hai appena aperto corrisponde a un file in modalità c ++, il file .h viene messo in quella modalità, se l'origine è un file in modalità objc, l'intestazione viene messa in quella modalità.

Nessuna variabile speciale Emacs nei commenti richiesti.

Vorrei usare eproject per aiutarmi a gestirlo. Supponendo che non combini le lingue all'interno di un determinato progetto, potrei semplicemente creare un file .eproject nella radice del progetto che contiene il testo:

:cc-header-type :objc

Quindi, impostarei una sorta di modalità predefinita per i file .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))

Quindi, aggiungi un hook per quella modalità:

<*>

Ora la modalità verrà modificata automaticamente in base all'impostazione effettuata nel file .eproject . (Si noti che il file .eproject non è l'unico modo per impostare le variabili per eproject; se si dispone di un'euristica per rilevare progetti con obiettivo c, anche eproject può ottenere la variabile in questo modo.)

Comunque, se questo funziona per te, fammi sapere così posso aggiungerlo al wiki wiki .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top