후크를 사용하여 주요 모드 키를 설정하는 것과 모드 맵에 추가하는 것의 차이점


13

내가이라는 메이저 모드를 다운로드했고라는 magical-mode자체 마법 키맵이 있다고 가정합니다 magical-mode-map. 이 모드는 또한 버퍼의 주요 모드가 될 때 magical-mode-hook마다 실행 되는 후크 를 제공합니다 magical-mode. 이제 init 파일을 수정하여 해당 모드에서 사용할 몇 가지 사용자 정의 키 바인딩을 추가하려고합니다.

에 대한 사용자 정의 키 바인딩을 설정하는 방법에는 적어도 두 가지가있는 것 같습니다 magical-mode. 내가 가장 일반적으로 보는 것은 다음과 같습니다.

(defun my-magical-keys ()
  (local-set-key (kbd "C-i") 'previous-line)
  (local-set-key (kbd "C-k") 'next-line)
  (local-set-key (kbd "C-j") 'backward-char)
  (local-set-key (kbd "C-l") 'forward-char))
(add-hook 'magical-mode-hook 'my-magical-keys)

그러나 이런 식으로도 가능합니다.

(define-key magical-mode-map (kbd "C-i") 'previous-line)
(define-key magical-mode-map (kbd "C-k") 'next-line)
(define-key magical-mode-map (kbd "C-j") 'backward-char)
(define-key magical-mode-map (kbd "C-l") 'forward-char)

두 번째 방법은 실제로 더 깨끗해 보입니다. 한 가지 방법으로 다른 방법으로 이점을 얻을 수 있습니까?


기본 이동 명령에 동일한 키를 사용합니다. 경고 : 이것은 오르막 전투 이며이 작업을 시작하기 전에 키 바인딩에 대해 조금 더 배우고 싶을 수도 있습니다.
tarsius

@tarsius 실제로 오르막 전투. 내가 전에 그 길을 갔다,하지만 지금은 다시 좋은 똑똑한 '로 생각 C-n하고 C-p. 예제는 단지 더미 코드입니다. 나는 바인딩 자체가 질문의 실제 목적을 방해하지 않도록 매우 간단한 예제 모드와 예제 바인딩을 생각해 내고 싶었습니다.
nispio

답변:


15

두 번째 방법은 모드의 키맵을 한 번만 수정하므로 바람직합니다.

모드의 후크를 사용하여 수행하면 해당 버퍼가 일부 버퍼에서 활성화 될 때마다 호출됩니다. 키가 이미 바인드 된 키에 다시 바인드 되었기 때문에 다시 그렇게하는 것은 실제로 효과가 없습니다. 주 모드 키맵은 해당 모드를 사용하는 개별 버퍼가 아닌 주 모드에 대해 "로컬"입니다. 따라서이 버퍼 중 하나에서 바인딩을 변경 local-set-key하면 동일한 주 모드를 가진 모든 버퍼에 영향을 미칩니다.

local-set-key주로 명령으로 사용됩니다. 변경 사항을 영구적으로 유지하기로 결정한 define-key경우 모드 키맵을 첫 번째 인수로 사용하십시오.

후크를 사용하여 키맵을 반복해서 수정하면의 의도 된 사용과 충돌 할 수 있습니다 local-set-key. 의 M-x local-set-key RET C-i fancy-previous-line RET변형을 시험해보고 싶었다고 가정 해 봅시다 previous-line. 동일한 주 모드를 사용하는 새 버퍼를 열면 이전에 사용한 버퍼를 포함하여 해당 주 모드를 사용하는 모든 버퍼 에서 후크가 다시 실행되고 임시 바인딩을 재정의합니다 local-set-key.


나는이 대답을 좋아하지만 모드가 자동로드되면 어떻게됩니까?
remvee

2
일부 라이브러리가로드 될 때까지 코드로드를 지연시킬 수 있습니다 (eval-after-load 'magical '(progn (define-key magical-mode-map ...) ...)).
tarsius

4

사용하는 (define-key my-magical-mode-map …)것이 일반적인 방법입니다.

후크 및을 사용하면 local-set-key일부 버퍼에서 내 마법 모드로 들어갈 때마다 키가 추가됩니다. local-set-key동일한 모드에있는 모든 버퍼 (보다 일반적으로 동일한 키맵을 사용하는 모든 버퍼)에 영향을주기 때문에 이상 합니다. 따라서 키맵을 변경 한 경우 버퍼에서 내 마법 모드로 들어갈 때마다 키맵이 재정의됩니다.

다른 위치에서 키맵을 사용자 정의하면 두 번째 방법도 혼동 될 수 있습니다. 후크는 추가 된 순서와 역순으로 실행되며 처음 실행될 때까지 사용자 정의 흔적이 표시되지 않습니다.


2

당신은 분명히있다 없다 에 대해 물어 정의 주요 모드 키맵을하지만 대한 사용자 에 몇 키 바인딩을 추가하거나 변경하는 코드를 기존의 주요 모드 키맵. 당신은 "custom"이라고 말하는데, 이것은 이것을 제안하지만, 우리는 그것을 분명히 할 수도 있습니다.

확실히, 이것에 대해 가장 일반적으로 보는 것은 주 모드 키맵 을 정의 하는 데 일반적으로 사용되는 것이 아닙니다 . 예를 들어 Emacs 소스 코드에서 찾을 수있는 것은 아닙니다 . 그리고 Elisp 매뉴얼 (노드 ) 에서 권장 하지 않습니다 .Major Mode Conventions

다른 사람들에게 명확하게하기 위해 그것을 막고 싶었습니다. 일반적으로 주요 모드 맵을 정의하기 위해 모드 후크를 사용하고 싶지 않습니다.


사용자 키 사용자 정의에 대한 질문-

어쨌든 local-set-key모드 후크에서 사용해야하는 것은 아닙니다 . define-key첫 번째 예제에서와 마찬가지로 주요 모드 키맵과 함께 사용 하십시오. @tarsius는 이미 이것을 잘 설명했습니다.

그 이외의 대답은 일반적으로 키를 define-key한 번 바인드 ( 모드 맵과 함께 사용 )하거나 모두에 대해 후크를 사용하여 모드에 들어갈 때마다 키를 바인딩하는 것입니다.

그러나 맵의 바인딩이 변경되는 경우 (예 : 바인딩을 변경하는 다른 코드를로드하여) 변경 될 수 있습니다. 이 경우, 주 모드 후크에 바인딩을 설정하면 모드가 시작될 때 바인딩이 설정됩니다. 즉, 이들이 만들어 지도록 보장하지만 나중에 다른 변경 사항이 없는지 확인하지는 않습니다 (예 : 동일한 후크의 다른 기능, 이후에 호출). 물론 후크에서 실행될 항목에 대해서는 거의 제어 할 수 없다는 점을 기억하십시오. 물론 자신의 코드만이 엉망이되는 것을 확신하지 않는 한.

그것이 내가 생각할 수있는 유일한 효과의 차이입니다. 그 차이를 하나 또는 다른 방법의 장점으로 생각할시기를 결정하십시오. FWIW, 내 자신의 코드를 보면 모드 훅에 키를 바인딩하지 않는다고 생각합니다.


감사. 나는 주요 모드를 생성 하지 않고 단순히 내 자신의 키 바인딩과 기존 주요 모드 를 추가 한다는 사실을 분명히하기 위해 질문을 수정했습니다 .
nispio

0

당신의 이름은 거의 혼란스럽지 않습니다 ( my질문의 두 번째 부분에서 제거해야한다고 생각합니다 ).

어쨌든 가정은 my-magical-keys의 사용자 정의 기능입니다 magical-mode알겠습니다, 하나 개의 명백한 이점을. remove-hook한 번에 후크를 쉽게 제거 할 수 있습니다.

두 번째 장점은 기능의 의미입니다. 재사용이 가능하다는 뜻입니다. 다른 모드로 연결할 수 있습니다.

편집하다:

@tarsius가 지적했듯이 후크를 제거해도 원래 동작이 복원되지 않고 기능을 마이너 모드로 전환하는 것이 좋습니다.


나는 가상의 주요 모드를 사용자 정의하고 my-magical-mode있습니다. 그러나 my-접두사 사용이 혼란 스럽다면 확실히 질문을 편집 할 수 있습니다.
nispio

그렇습니다 my-. 사용자 기능에 일반적으로 더 좋을 것 입니다.
kindahero

1
동의했다. 방금을 적용하여 my-아무도 magical-mode(있는 경우) 라는 실제 모드를 구성하는 방법을 묻지 않을 것이라고 생각하지 않았습니다 .
nispio

1
아니요, 후크를 제거해도 이전 바인딩이 복원되지 않습니다. 적어도 Emacs가 다시 시작될 때까지는 안됩니다. 그런 다음 크게 개선 된 것처럼 4 줄 대신 한 줄만 주석 처리하지 않아도됩니다.
tarsius

2
두 번째 장점은 다음과 같습니다. 여기에서 마이너 모드를 생성하여 다양한 메이저 모드 및 / 또는 특정 메이저 모드를 사용하여 일부 버퍼에서만 활성화 할 수 있습니다.
tarsius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.