2012-06-07 4 views
2

내 .emacs 파일에서 완벽하게 작동하는 emacs 매크로 (global-set-key)가 있는데, 이유는 무엇이든지 내 .c 파일에서 작동하지 않습니다. 나는 닫고 내 이맥스 파일을 다시 개설하고 장난 시작하면 아래 라인에 라인을 복사, 예상대로Emacs 매크로는 .emacs 파일에서는 작동하지만 소스 파일에서는 작동하지 않습니까?

(global-set-key "\C-c\C-d" "\C-a\C- \C-e\M-w\C-j\C-y")

,이 매크로는 동작합니다. 그러나 C 파일을 열면 동일한 매크로가 단순히 문자를 삭제합니다 (C-d에서만 인식되는 것 같습니다).

아이디어가 있으십니까?

답변

6

은 공통 - 모드는 글로벌 레벨에서 결합 숨어 c-hungry-delete-forward, 수 c-mode-base-map에서 C-C에서 C-D을 정의한다. 그래서,이 문제를 해결하기 위해 더 나은 방법은 UNDEFINE에있는 cc-mode 만든 것을 바인딩, 당신은 할 그 다음과 같은 :

(eval-after-load "cc-mode" 
    '(define-key c-mode-base-map (kbd "C-c C-d") nil)) 

또한 후크에 그것을 할 수 있지만, 내가 eval-after-load를 선호 그것 때문에 단지 한 번 실행됩니다.

참고 : 나는 결정 c-mode에서 파일을 열고 입력하여, 기존의 바인딩 채널 Ck를 참조 카드뮴 (일명 MX 설명 결합 참조 카드뮴), 그리고 보는 :

참조를 Cd는`cc-cmds.el '에 대화 형 컴파일 된 Lisp 함수 인 c-hungry-delete-forward 명령을 실행합니다.

가 만든 그 바인딩이 (중 하나) c-mode의에서 설정, 그래서 내가 찾은 그러자 난 그냥 c-hungry-delete-forward의 소스 파일을 열어 (또는 grep ED) 된 것을 매우 명확 :

(define-key c-mode-base-map "\C-c\C-d"  'c-hungry-delete-forward) 

그리고 그 대답은 곧장 나아졌습니다.

가 나는을 재정의 UNDEFINE 지방 원하는 글로벌 바인딩을 숨길 바인딩보다는 더 나은 것 같아요. 문제가되는 바인딩을 찾아내는 것만 큼 많은 작업이 필요합니다.이 방법으로 전역 바인딩의 기능을 변경하려면 한 곳에서해야합니다.

+0

감사합니다. 나중에 참조 할 수 있도록, 다른 모드가 정의한 것을 어떻게 발견 했습니까? 어딘가에 파일이 있습니까? – Jon

+0

@ 존 (Jon) 나는 그 일을 돕기 위해 답을 업데이트했으나 완전히 단순하지는 않다. –

0

명백하게 C 모드는 바인딩을 제거하거나 변경합니다. c-mode-hook에 추가하여 작동하는지 확인할 수 있습니다. 이 유사 :

(add-hook `c-mode-hook '(lambda() 
         (global-set-key "\C-c\C-d" "\C-a\C- \C-e\M-w\C-j\C-y"))) 

어느 c-mode-hook 또는 c-mode-common-hook. 또한 전역 버퍼 대신 local-set-key을 사용하여이 버퍼에 바인딩을 적용 할 수 있습니다.

+0

나는 이맥스에 정말 익숙하다. 정교하게 말할 수 있겠 니? c-mode-hook에 어떻게 추가 할 수 있습니까? 그렇게? (add-hook'c-mode-hook (전역 설정 키 "\ C-c \ C-d" "\ C-a \ C- \ C-e \ M-w \ C-j \ C-y)) – Jon

+0

종류입니다. 내 대답을 편집 할게. –

+0

이 답변은 약간 혼란 스럽습니다. (1) 모드 훅에서'global-set-key'를 사용하는 것은 모드 훅 외부에서 사용하는 것과 다르지 않습니다. 하나의 글로벌 키맵 만 있고, 메이저/마이너 모드는 그것을 수정할 가능성이 매우 낮습니다.(2)'local-set-key'는 현재 버퍼에 영향을 줄뿐만 아니라; 대부분의 경우 동일한 주요 모드를 사용하는 * 모든 * 버퍼에 의해 공유되는 현재 버퍼의 * 로컬 키맵에 영향을줍니다. – phils

관련 문제