2010-07-22 4 views

답변

61

이 시도 :

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

당신이 파일을 .H 열 때마다, C를 ++ - 모드가 사용됩니다.

+0

효과가있었습니다. 고마워. – kujawk

3

나는이 질문이 적절하게 이미 응답 된 것을 맹세 할 수 있 었는가? 기묘한. 이 모든 .H 파일에 적용하지 않으려면

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

작성자가 삭제했습니다. –

19

, 당신은 당신의 C++ 헤더 파일의 맨 아래에 다음을 추가 할 수 있습니다

당신이 원하는.

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

이것은 파일 단위로 설정하려는 이맥스 변수에서 작동합니다. Emacs는 선행 문자를 무시하므로 파일 유형에 적합한 주석 문자를 사용하십시오. 나는 둘 다 C 및 C++ 정기적를 사용하기 때문에

+0

감사합니다. 이맥스로이 작업을 수행 할 수 있다는 것을 깨닫지 못했습니다. – kujawk

+0

그 파일이 계속 작동하는지 몰랐습니다. 이것은 매우 유용 할 수 있습니다. 고마워 :) –

16

, 나는 시도하고 .H 파일이 C 될 운명 또는 여부를 "추측"이 기능을 쓴 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)) 

그리고 내가 작동하지 않는 경우

헤더가 C 또는 C++이지만 나를 위해 작동하는지 C와 C 사이를 전환하는 키를 설정 ++ 모드

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

그것은 완벽 하진는 결정을위한 더 나은 발견이있을 수 있습니다.

+0

더 나은 솔루션을 파일에 모드를 인코딩 할 수 있습니다 (내 대답을 참조), 다음 파일에 적절한 줄을 추가하기위한 키를 정의하십시오. 유일한 단점은 이맥을 사용하지 않는 사람들도 이것을 볼 수 있지만 그 파일의 맨 아래에서 이슈가되지 않아야한다는 것입니다. – KeithB

+1

자신의 프로젝트에서는 괜찮 았지만 내 솔루션은 주로 다른 사람들의 프로젝트를 다루기위한 것입니다. 제 3 자 프로젝트에서 헤더의 끝 부분에 로컬 변수를'cat '시킬 수는 있지만 이것은 너무 많은 노력을 필요로합니다. – Borbus

+0

저는이 솔루션이 정말 마음에 들었습니다. 소스 파일을 수정하지 않고도 동작을 쉽게 사용자 정의 할 수 있습니다. 예를 들어, 제 버전에서는 .h 파일이 C++인지 여부를 결정하기 위해'(string-match "llvm"(buffer-file-name))'과 같은 것을 사용합니다 (llvm은 C++ 프로젝트입니다). – zdav

32

c 모드와 C++ 모드를 적절하게 사용하는 또 다른 방법은 directory local variables을 사용하여 모드를 설정하는 것입니다.

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

그리고 이맥스 c++-mode 때마다 그것을로 전환됩니다 : 모드가 1 설정 한 후 C++ 프로젝트가이를 포함 해 실제로 .dir-locals.el 파일을 쓸 수 있도록

디렉토리 변수, 평가 처음에는 c-mode으로 설정했습니다.

C 및 C++ 프로젝트를 함께 사용하는 경우 이는 프로젝트별로 매우 간단한 솔루션입니다.

물론 프로젝트의 대부분이 C++ 인 경우 C++ - 모드를 기본값 인 으로 설정하면이 방법을 역으로 사용하여 적절한 경우 C 모드로 전환 할 수 있습니다.


1normal-mode 전화 (set-auto-mode) 그 순서 (hack-local-variables)., How can I access directory-local variables in my major mode hooks?

2은 이렇게하려면 기본적으로 C++ 모드에서 .h 파일을 열려면 .emacs 파일에

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

을 추가 참조하십시오.

+3

이것은 가장 유용한 답변입니다. 또한,'mode'는 파일 - 로컬 변수리스트의 특별한 형태이며, 문서화되어 있습니다. [here] (http://www.gnu.org/software/emacs/manual/html_node/emacs/Specifying-File-Variables) .html). – scry

+0

각주 (2)를 추가 했으므로 응답이 자급 자족하며 다른 사람들에게 의존하지 않습니다. 이제, 그것은 받아 들여진 대답이어야합니다. 고마워. – YSC

+0

이 솔루션을 사용하면 .glsl 파일에도 C++ 모드가 사용됩니다. 대신에 glsl-mode를 강제로 사용할 수있는 방법이 있습니까? – jco

17

분명히 당신은 또한 파일의 상단에이를 넣을 수 있습니다 :

// -*-c++-*- 

그것은 C++ 파일의 이맥스 말할 수 있습니다.

꽤 자주 바닐라 이맥스로 끝나기 때문에 이것을 사용합니다. 어떤 식 으로든 이맥스를 구성하지 않아도 작동합니다.

+1

또는 ': // - * - mode : C++ - * -'. '- * - coding : utf-8;과 같은 다른 변수를 추가 할 수도 있습니다. 모드 : 파이썬; 탭 너비 : 4; - * -' – donkopotamus

관련 문제