2010-07-22 8 views

Odpowiedz

61

Spróbuj tego:

(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode)) 

każdym otwarciu .h plików C++ - tryb zostanie użyty.

+0

Zadziałało. Wielkie dzięki. – kujawk

3

Mogę przysiąc, że widziałem, że odpowiedź na to pytanie już była odpowiednia? Dziwne.

Chcesz to:

(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode)) 
+0

Zrobiłeś ... autor usunął go. –

19

Jeśli nie chcesz, aby zastosować do każdego pliku .h, można dodać następujące dnie plików nagłówkowych C++.

// Local Variables: 
// mode: c++ 
// End: 

Będzie działać dla dowolnych zmiennych Emacs, które mają być ustawione dla każdego pliku. Emacs ignoruje znaki wiodące, więc używaj dowolnych znaków komentarza odpowiednich dla danego typu pliku.

+0

Dzięki, nie zdawałem sobie sprawy, że możesz to zrobić z emacs. – kujawk

+0

Nie wiedziałem, że działało w historii pliku. To może być bardzo przydatne. Dzięki :) –

16

Ponieważ używam zarówno C i C++ regularnie, napisałem tę funkcję, aby spróbować "odgadnąć" czy .h plik ma być C lub C++

;; function decides whether .h file is C or C++ header, sets C++ by 
;; default because there's more chance of there being a .h without a 
;; .cc than a .h without a .c (ie. for C++ template files) 
(defun c-c++-header() 
    "sets either c-mode or c++-mode, whichever is appropriate for 
header" 
    (interactive) 
    (let ((c-file (concat (substring (buffer-file-name) 0 -1) "c"))) 
    (if (file-exists-p c-file) 
     (c-mode) 
     (c++-mode)))) 
(add-to-list 'auto-mode-alist '("\\.h\\'" . c-c++-header)) 

A jeśli to nie poskutkuje I Ustaw przycisk do przełączania między C i C++ tryby

;; and if that doesn't work, a function to toggle between c-mode and 
;; c++-mode 
(defun c-c++-toggle() 
    "toggles between c-mode and c++-mode" 
    (interactive) 
    (cond ((string= major-mode "c-mode") 
     (c++-mode)) 
     ((string= major-mode "c++-mode") 
     (c-mode)))) 

to nie jest doskonały, nie może być lepiej heurystyczny w celu podjęcia decyzji, czy nagłówek jest C lub C++, ale to działa na mnie.

+0

Lepszym rozwiązaniem może być kodowanie trybu w pliku (zobacz moją odpowiedź), a następnie określenie klawiszy do dodawania odpowiednich wierszy do pliku. Jedyną wadą jest to, że ludzie, którzy nie używają emacsa, również to zobaczą, ale ponieważ znajduje się na samym dole pliku, nie powinno to stanowić problemu. – KeithB

+1

To jest dobre dla twoich własnych projektów, ale moje rozwiązanie służy głównie do obsługi projektów innych ludzi. Możesz "cat" swoje lokalne zmienne na końcu nagłówków w projekcie 3rd party, ale to jest za dużo wysiłku IMO. – Borbus

+0

Bardzo podoba mi się to rozwiązanie, ułatwia dostosowywanie zachowania bez modyfikowania plików źródłowych. Na przykład w mojej wersji używam takich rzeczy jak '(string-match" llvm "(nazwa-pliku-bufora))' w celu określenia, czy plik .h ma wartość C++ czy nie (llvm jest projektem C++). – zdav

32

Innym podejściem do korzystania zarówno z trybu c, jak i C++, jest użycie directory local variables do ustawienia trybu.

zmienne Directory są oceniane po tryb został ustawiony , więc rzeczywiście można zapisać plik .dir-locals.el dla projektu C++ zawierającym to:

((c-mode . ((mode . c++)))) 

a Emacs zmienia tryb na c++-mode ilekroć początkowo ustawił go na c-mode.

Jeśli pracujesz z mieszanką projektów C i C++, tworzy to całkiem banalne rozwiązanie dla każdego projektu.

Oczywiście, jeśli większość swoich projektów są C++, można ustawić tryb C++ - jako domyślny , a następnie można użyć tego podejścia w odwrotnej kolejności, aby przełączyć do trybu c gdzie stosowne.


normal-mode rozmowy (set-auto-mode) i (hack-local-variables) w tej kolejności.Zobacz także: How can I access directory-local variables in my major mode hooks?

Aby to zrobić, należy dodać

(add-to-list 'auto-mode-alist '("\\.h\\'" . c++-mode)) 

do pliku .emacs które otwierają .h plików w trybie C++ domyślnie.

+3

To jest najbardziej przydatna odpowiedź. Pamiętaj też, że "tryb" jest specjalną formą na listach zmiennych lokalnych plików i jest tylko udokumentowany [tutaj] (http://www.gnu.org/software/emacs/manual/html_node/emacs/Specifying-File-Variables .html). – scry

+0

Dodałem przypis (2), więc twoja odpowiedź jest samowystarczalna i nie zależy od innych. Teraz powinna to być zaakceptowana odpowiedź. Dzięki. – YSC

+0

To rozwiązanie powoduje, że tryb C++ jest używany również dla plików .glsl. Czy jest zamiast tego jakiś sposób na użycie trybu glsl? – jco

17

Podobno można również umieścić to na początku pliku:

// -*-c++-*- 

powiedzieć Emacs jest to plik C++.

Używam tego, ponieważ dość często trafiam na waniliowy Emacs i działa bez jakiejkolwiek konfiguracji Emacsa.

+1

Lub też jako: '// - * - mode: C++ - * -'. Możesz także dodać inne zmienne, takie jak '- * - coding: utf-8; tryb: python; tab-width: 4; - * - ' – donkopotamus

Powiązane problemy