2010-07-22 2 views

Antwort

61

Versuchen Sie folgendes:

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

Jedes Mal, wenn Sie Dateien öffnen .h, C++ - Modus verwendet werden.

+0

Es funktionierte. Danke vielmals. – kujawk

3

Ich könnte schwören, ich sah diese Frage bereits angemessen beantwortet? Seltsam.

Sie wollen dies:

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

Sie haben ... der Autor löschte es. –

19

Wenn Sie dies für jede H-Datei gelten nicht möchten, können Sie die folgenden Funktionen der Unterseite Ihres C++ Header-Dateien hinzufügen.

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

Dies funktioniert für alle Emacs-Variablen, die Sie pro Datei festlegen möchten. Emacs ignoriert die führenden Zeichen. Verwenden Sie daher die für den Dateityp geeigneten Kommentarzeichen.

+0

Danke, habe nicht gemerkt, dass du das mit Emacs machen kannst. – kujawk

+0

Wusste nicht, dass das in jeder Datei funktioniert hat. Dies könnte sehr nützlich sein. Danke :) –

16

Da ich sowohl C und C++ verwenden regelmäßig, schrieb ich diese Funktion, um zu versuchen und „erraten“, ob eine .h-Datei C sein soll oder 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)) 

Und wenn das ich nicht funktioniert setzt einen Schlüssel, um zwischen C und C++ Modi

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

es ist nicht perfekt, es könnte eine bessere Heuristik für die Entscheidung, ob ein Header C oder C++ ist, aber es funktioniert für mich.

+0

Eine bessere Lösung könnte sein, den Modus in der Datei zu verschlüsseln (siehe meine Antwort), und dann Schlüssel definieren, um die entsprechenden Zeilen zur Datei hinzuzufügen. Der einzige Nachteil ist, dass Leute, die Emacs nicht verwenden, dies auch sehen werden, aber da es am Ende der Datei ist, sollte es kein großes Problem sein. – KeithB

+1

Das ist gut für Ihre eigenen Projekte, aber meine Lösung ist hauptsächlich für den Umgang mit Projekten anderer Leute. Sie könnten Ihre lokalen Variablen am Ende der Header in einem 3rd-Party-Projekt "cat", aber das ist viel zu viel Aufwand IMO. – Borbus

+0

Ich mag diese Lösung wirklich sehr, es macht es einfach, das Verhalten anzupassen, ohne irgendwelche Quelldateien zu verändern. Zum Beispiel verwende ich in meiner Version Dinge wie '(string-match" llvm "(buffer-file-name))', um festzustellen, ob eine .h-Datei C++ ist oder nicht (llvm ist ein C++ - Projekt). – zdav

32

Ein anderer Ansatz für die Verwendung sowohl im C-Modus als auch im C++ - Modus ist die Verwendung des Modus directory local variables.

Directory-Variablen ausgewertet werden, nachdem der Modus eingestellt wurde, so dass Sie eine .dir-locals.el Datei tatsächlich schreiben Sie Ihre C++ Projekt mit diesem für:

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

Und Emacs wird um den Modus zu c++-mode wann immer es ändern hatte es ursprünglich auf c-mode eingestellt.

Wenn Sie mit einer Mischung aus C- und C++ - Projekten arbeiten, ist dies pro Projekt eine ziemlich triviale Lösung. Wenn die Mehrheit Ihrer Projekte C++ ist, können Sie natürlich den C++ - Modus als Standard setzen, und Sie könnten dann diesen Ansatz in umgekehrter Reihenfolge verwenden, um gegebenenfalls in den c-Modus zu wechseln.


normal-mode Anrufe (set-auto-mode)(hack-local-variables) und in dieser Reihenfolge.Siehe auch: How can I access directory-local variables in my major mode hooks?

so zu tun, fügen Sie

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

auf Ihre .emacs Datei, die standardmäßig .h Dateien in C++ Modus öffnen.

+3

Dies ist die nützlichste Antwort. Beachten Sie auch, dass 'mode' ein spezielles Formular in lokalen Variablenlisten ist und nur [hier] dokumentiert ist (http://www.gnu.org/software/emacs/manual/html_node/emacs/Specifying-File-Variables) .html). – scry

+0

Ich habe die Fußnote (2) hinzugefügt, damit Ihre Antwort autark ist und nicht von anderen abhängt. Jetzt sollte es die akzeptierte Antwort sein. Danke. – YSC

+0

Diese Lösung bewirkt, dass der C++ - Modus auch für .glsl-Dateien verwendet wird. Gibt es eine Möglichkeit, stattdessen den glsl-Modus zu erzwingen? – jco

17

Anscheinend kann man auch dies der Datei an der Spitze setzen:

// -*-c++-*- 

Emacs zu sagen, es ist eine C++ Datei.

Ich benutze dies, da ich ziemlich häufig auf einem Vanille Emacs lande und es funktioniert, ohne Emacs in irgendeiner Weise zu konfigurieren.

+1

Oder auch als: '// - * - mode: C++ - * -'. Sie können auch andere Variablen hinzufügen wie zum Beispiel '- * - coding: utf-8; Modus: Python; Tab-Breite: 4; - * - ' – donkopotamus

Verwandte Themen