2014-03-25 1 views
0

현재 내가 작업하고있는 프로젝트에 새로운 C 들여 쓰기 스타일을 만드는 데 어려움을 겪고 있습니다. 이것은 내가 이런 짓을 :이맥스의 어느 부분이 변수를 오버라이드하는지 확인하는 방법

(c-add-style "ck-style" 
      '("bsd" 
       (c-auto-align-backslashes . nil) 
       (c-basic-offset . 4) 
       (c-offsets-alist . ((case-label . +) 
            (label . -) 
            (statement-case-open . +))) 
       (fill-column . 78) 
       (indent-tabs-mode . t) 
       (tab-width . 4))) 

(defun ck-init-c() 
    (if (string-match "/project/" buffer-file-name) 
     (c-set-style "ck-style") 
     (c-set-style "bsd"))) 

(add-hook 'c-mode-hook 'ck-init-c) 

나는 또한 c-indentation-style의 가치를 보여주는 후크로 호출하고 훅에 확실히 올바른 값을 가지고 (message) 추가 디버그. 그러나 버퍼를 체크인 할 때 c-indentation-style의 값은 "bsd"으로 다시 설정됩니다. 거기에 초기화의 어떤 부분이 이것을 일으키는 지 확인하는 방법이 있습니까? GDB에서 시계 식과 같은 것이 있습니까?

+3

더 쉬운 방법은 [디렉토리 변수] (http://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables.html)를 참조하십시오. '.dir-locals.el' 파일을 원하는 설정으로 프로젝트 폴더에 넣기 만하면됩니다. 그것은 폴더 범위의'init.el'처럼 행동합니다. – harpo

+0

@harpo nice, 아직 디렉토리 변수에 대해 몰랐습니다. 포인터 주셔서 감사! 그러나 디버깅을 목적으로 해답을 알고 있다면 여전히 유용 할 것입니다. – ckruse

+0

@harpo 프로젝트 트리에 이미 그런 것이 있는지 궁금하게 생각하게되었습니다. 그리고 yes입니다.'(c-file-style. "bsd")'가 .dir-locals.el에 설정되었습니다. 그래서 내'c-set-style'가 덮어 쓰기 때문입니다. 다시 한 번 감사드립니다! – ckruse

답변

0

나는 당신이 묘사하고있는 것에 대한 메커니즘이 있다고 생각하지 않습니다.

난 당신이 setqdefadvice를 사용할 수 원칙적으로 생각하지만 지적하면서 수동 advises against 조언 프리미티브, 그것은 효과가 100 % 아니라고 : 당신은 당신이 무엇을하고 있는지 알지 못한다면

,하지 프리미티브를 조언하십시오 ( 기능이란 참조). advice 메카니즘에 의해 사용되는 일부 프리미티브 (primitives); 그들을 조언하면 무한 재귀가 발생할 수 있습니다. 또한 많은 원시 타입 이 C 코드에서 직접 호출됩니다. Lisp 코드 에서 프리미티브를 호출하면 조언을 기록하지만 C 코드의 호출은 조언을 무시합니다.

setq은 실제로 defadvice에 의해 사용됩니다.

즉, 변수 할당이 너무 낮아 일반적인 방법 (즉,, elisp)을 사용할 수 없습니다.

+0

정리해 주셔서 감사합니다. – ckruse

관련 문제