마이너 모드 정의를 개발할 때 어떻게 업데이트합니까?


13

키 바인딩을 제공하기 위해 부 모드를 코딩하기 시작했습니다. 처음 시도 할 때 오타가있었습니다.

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  nil nil
  '(([b] . 'previous-line)))

나는 b키 를 사용하려고 했고 즉시 "b"대신 대신 사용해야한다는 것을 깨달았습니다 [b]. 그래서 부 모드를 다시 정의했습니다.

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  nil nil
  '(("b" . 'previous-line)))

그러나 이것은 작동하지 않았습니다. 이렇게하면 키를 바인딩하는 다양한 방법 (예 : (kbd ...), [...] 등)을 통해 거위 추적이 시작되었습니다. 마지막으로 단순히 (define-minor-mode ...)양식을 다시 평가 해도 아무런 변화가 없음을 깨달았 으며 원래의 깨진 키 맵에 붙어있었습니다. 그런 다음 키맵을 직접 통해 변경하려고 시도했지만 (define-key borked-mode-map ...)여전히 올바른 키맵을로드 할 수 없었습니다. 마지막으로 Emacs를 다시 시작했고 마이너 모드가 올바르게로드되었습니다.

내 질문은 : 마이너 모드 정의를 개발할 때 어떻게 업데이트합니까? 깨진 정의를 지우는 방법이 있습니까, 아니면 깨진 비트를 지우려면 emacs를 다시 시작해야합니까?

답변:


11

처음 평가할 때 지정한 키 바인딩 define-minor-mode으로 변수 borked-mode-map를 정의 합니다. 그러나 해당 기호가 정의되면 다시 평가 define-minor-mode해도 변경되지 않습니다.

코드를 borked-mode-xxx사용하여 다양한 기호를 삭제 unintern한 다음 코드를 다시 평가할 수 있습니다. 시험:

(unintern 'borked-mode-map)

define-minor-mode실제로 수행중인 작업을 확인하기 위해 매크로를 확장하는 데 관심이있을 수 있습니다 . 끝에 포인트를 넣고을 호출 M-x pp-macroexpand-last-sexp합니다. 확장 된 매크로를 보여주는 새 버퍼가 열립니다. defvar모드 변수를 설정하는 데 사용되는 호출 이 표시 됩니다. 도움말을 읽으면 defvar정의중인 기호가 void 인 경우에만 초기 값이 사용되는 것을 알 수 있습니다. 일단 존재하면 후속 defvar호출은 해당 값을 변경하지 않습니다.


13

내가 줄 수있는 가장 좋은 대답은의 "인라인 키 바인딩 기능"에서 벗어나는 것입니다 define-minor-mode. 사용하다

(defvar borked-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map [b] 'previous-line)
    ...
    map))

(define-minor-mode borked-mode
  "A mode defined with a broken key binding"
  :global nil
  ...)

대신에. 그런 다음 C-M-x해당 정의를 다시 평가하는 데 사용할 수 있습니다 .


1
defvar다음에 다시 값을 평가하지 않습니다. C-M-x:) 필요 defparameter하거나 별도 setf입니다.
wvxvw

@wvxvw가 지적했듯이 실제로 문제를 해결하지는 않습니다. 예제 코드는 define-minor-mode매크로 와 동일한 방식으로 defvar지도를 정의하기 위해 호출 하는 것입니다. defvar를 두 번 평가해도 효과가 없습니다.
glucas

7
@wvxvw C-M-x( eval-defun)를 사용 하여 재평가 defvar하면 변수가 업데이트됩니다. 이것은 특별한 경우이다 eval-defun; 전화를 걸 eval-buffer거나 eval-region기존 값은 변경되지 않습니다.
Gilles 'SO- 악마 그만해'

아-그것은 핵심 포인트처럼 보인다.
glucas

1
참고 C-M-xdefvar양식에만 모드 맵 변수 자체를 업데이트합니다. 당신은 또한에 가지고 C-M-xdefine-minor-mode마이너 모드로 '설치'변경된지도를 얻을 수 형태. 나는 매크로를 확장하여 이유를 알아 내려고 노력했지만 그 이상입니다.
Tyler
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.