동일한 버퍼에서 두 개의 주요 모드 맵 사용


11

한 주요 모드의 키맵을 다른 주요 모드의 대체 키맵으로 사용하는 것이 매우 편리한 몇 가지 상황에 처했습니다. 예를 들어 :

  • 조직 문서 중 일부에 LaTeX를 많이 작성하므로 latex-mode편집하는 동안 쉽게 사용할 수 있는 명령을 사용하는 것이 좋습니다 org-mode.
  • Markdown을 지원하는 irc room을 자주 사용하므로 키 markdown-mode바인드를 추가하는 것이 좋습니다 erc-mode.

두 경우 모두이 추가 키맵은 폴백으로 작동해야 합니다 (이로 인해 마이너 모드를 사용할 수없는 이유). 라텍스 명령이 org-mode키 를 재정의하는 것을 원하지 않습니다 . 내가 원하는 것은
키가 정의되어 있고 키가 정의되어 latex-mode-map있지 않으면 바인딩 org-mode-map을 사용하십시오latex-mode-map .

Q : 키맵을 메이저 모드의 대체 키맵으로 설정하려면 어떻게해야합니까?
또는
Q : 아무 것도 무시하지 않고 어떻게 하나의 주요 모드 맵에서 다른 주요 모드 맵으로 키를 복사 할 수 있습니까?


분명해 지려면 이러한 키를 하나씩 정의 할 수는 있지만 자동화 된 솔루션을 보유하는 것이 훨씬 더 편리 할 것입니다.


6
키맵 병합을 사용하십시오. 참조하십시오 make-composed-keymap.
Drew

답변:


12

이것은 예상보다 간단 해졌습니다. 여기에 의견과 질문에 제안 된대로 :

(with-eval-after-load 'erc
  (require 'markdown-mode)
  (require 'cl-lib)
  (setq erc-mode-map
        (make-composed-keymap (cl-copy-list erc-mode-map)
                              markdown-mode-map)))

이것의 사본 erc-mode-map이지만에서 상속받은 키맵이 생성 됩니다 markdown-mode-map. 따라서 모든 markdown키는 erc키 와 충돌 할 때마다 음영 처리 됩니다.

당신이 경우 않는 대체 키 맵의 일부 키를 원하는 주요 한 그들 만 해제, 주요 kemap을 밝게 빛나다합니다.

(define-key erc-mode-map "\C-c\C-a" nil)

2
define-key의 반환 값 을 사용 make-composed-keymap하면 원래 키 appended맵 에 예기치 않은 부작용이있을 수 있으며이 수동 맵 에도 동일하게 적용될 수 있습니다 . 을 사용하려면 부모 키맵이 구성된 키맵 define-key인 새 키맵을 만드는 것이 가장 안전합니다 .
Jon O.

@JonO. 사실, 난 정말이가 않습니다 알아 놀랐다 하지 여기에 일어난다. 내가 할 (define-key erc-mode-map "\C-c\C-s" nil)경우, 해당 markdown-mode키는 erc 버퍼 에서도 여전히 사용할 수 있습니다 .
Malabarba

Malabarba : 코드 변경 후 마지막 코멘트가 더 이상 적용되지 않는다고 생각합니다. 이 make-composed-keymap문서는 "MAPS의 nil 바인딩이 PARENT의 해당 바인딩을 재정의하지만 다른 MAPS 키맵의 해당 바인딩을 재정의하지는 않습니다"라고 말합니다. markdown-mode-map귀하의 예에서 PARENT와 마찬가지로 nil바인딩이 마크 다운 바인딩을 억제 할 것으로 기대 합니까?
phils

2
내 해석은 당신이 묘사 한 효과 가 있다고 (make-composed-keymap (list erc-mode-map markdown-mode-map)) 생각 합니까?
phils

1
cl-copy-list실제로 당신이 원하는 것을하지 않을 것입니다. 키맵을 복사하려면을 사용해야합니다 copy-keymap.
Stefan

3

@Malabarba에서 언급했듯이 사용할 수 있습니다 make-composed-keymap. 그러나 새 키맵이 두 키맵 모두에서 상속되도록하려면 새 키맵을 수정해도 다른 두 키맵에는 영향을 미치지 않습니다. 두 단계로 수행해야합니다.

(make-composed-keymap
 nil (make-composed-keymap (list erc-mode-map markdown-mode-map)))

이는 define-key때때로 첫 번째 인수로 전달 된 맵을 수정할 수 make-composed-keymap있지만 두 번째로 전달 된 맵은 수정할 수 없기 때문 입니다. 나는 당신이 두 번째 인수로 키 맵 목록M-x report-emacs-bugmake-composed-keymap수락 해야한다고 생각 하므로 그냥 할 수 있습니다.

(make-composed-keymap nil (list erc-mode-map markdown-mode-map))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.