2013-10-11 13 views
2

모든 프로그램 모드에 적합한 개선을 위해 사용자 지정 모드를 정의하고 싶습니다. 그리고이 모든 모드에 대해 키 바인딩을 정의해야합니다. 최소 노력으로 키 바인딩을 선언하려면 define-minor-mode:keymap과 함께 사용합니다.부 모드에 대한 키맵을 올바르게 정의하는 방법

바인딩하고 싶습니다. comment-or-uncomment-region"C-;" kbd 매크로가이 키 시퀀스에 대해 [67108923] 마술 번호를 부여했습니다. 나는 모드를 등록한

(define-minor-mode 
    my-mode 
    nil nil 
:keymap '(
    ([67108923] . comment-or-uncomment-region) 
) 
) 

작동하지 않습니다 샘플을 쓴 적이

는 그것을 전환 만 누르면 С-;은 키 순서가 난 후

을 정의되지 않은 알림을 생산 스크래치 버퍼에 글을 쓰고 예상 된 방식으로 수행 된 간단한 global-set-key을 평가합니다.

(global-set-key [67108923] 'comment-or-uncomment-region) 

지금 C-;을 누르면 예상되는 comment-or-oncomment-region 동작이 생성됩니다.

C-h f을 통해 기능 정보를 검색 할 때 문제를 디버그하려고했습니다. 그것은 comment-or-oncomment-region다른 키 시퀀스에 두 번를 바인딩, 이상한 출력을 생성합니다

It is bound to C - ;, C-; 

먼저 하나가 나타나고 다른 global-set-key 호출에서 등장, 마이너 모드 토글로 사라집니다.

두 맵에 동일한 키 정의를 사용했다면 어떻게 될까요? 내가 놓친 세부 사항은 무엇인가?

답변

3
  1. 그냥 make-sparse-keymap를 사용하여, 일반적으로 키 맵을 작성하고, 그것을 my-mode-map 이름을 --- 당신이 완료됩니다. :keymap에 대한 문의는 define-minor-mode으로해야합니다.

  2. 또는 make-sparse-keymap을 사용하여 생성 한 키맵을 원할 경우 :keymap 값으로 사용하십시오. (단, 부 모드로 명명 된 이후로는 필요하지 않습니다. my-mode-map)

  3. 그러나 글로벌 바인딩을 사용하지 않는 이유는 global-set-key입니까? 왜 이것이 마이너 모드 바인딩이 필요한가요?

+0

make-sparse-keymap은 완벽하게 작동했지만 http://www.gnu.org/software/emacs/manual/html_node/elisp/Defining-Minor에 기반한 원래의 접근 방식에 무엇이 잘못되었는지 아직 이해하지 못합니다. -Modes.html – ayvango

+0

ayvango : 코드는 Emacs 24.3에서 작동합니다. 나는 당신의 문제가 처음에는 틀렸다고 생각하고 그 후에는 "my-mode-map"을 정의했다.이후의 모든 평가는 기존지도를 손상시키지 않았습니다. 당신은'my-mode-map '을 언 바인드해야 할 필요가있었습니다. – phils

3

마법 번호를 사용하지 마십시오. IOW는 [?\C-\;]을 사용하므로 사람이 이해할 수 있습니다.

(defvar my-mode-map 
    (let ((map (make-sparse-keymap))) 
    (define-key map [?\C-\;] 'comment-or-uncomment-region) 
    map)) 

(define-minor-mode my-mode 
    "blabla" 
    nil nil nil 
    <add code, if any>) 

아, 그리고 한가지 더 : 그리고 드류 동의 왜 바인딩 표준 M-;을 통해 C-;를 선호?