버퍼에 특정한 키 바인딩


14

버퍼에 특정한 키 바인딩을 설정할 수 있습니까?

내 조직 파일 중 하나에 다음이 있습니다.

# Local Variables:
# eval: (local-set-key (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)
# End:

그러나이 바인딩은 다른 조직 모드 파일에도 적용됩니다. 다른 주 모드로 파일을 열면 기본 키 바인딩이 시작됩니다.

local-set-key버퍼에 국한되지 않고 주요 모드에 고유 한 바인딩을 설정하는 것 같습니다 .

특정 버퍼에서만 활성화되는 바인딩을 어떻게 가질 수 있습니까?


2
오 와우, 당신은 옳습니다 : "바인딩은 현재 버퍼의 로컬 맵에서 진행되며, 대부분의 경우 동일한 주 모드에서 다른 모든 버퍼와 공유됩니다." 나는 그것을 몰랐다.
shosti

이제 그것에 대해 생각 하기 때문에 섹션이 실행되기 전에 local-unset-key연결 되면 연결될 org-mode-hook수 있습니다 Local Variables:.
Kaushal Modi

또는 세미 스파 스 키맵을 사용하여 부 모드를 만들고 다음을 사용하여 전환 할 수 있습니다.Local Variables:
Vamsi

@Vamsi 감사합니다! 이것은 우아한 해결책입니다! 솔루션을 업데이트했습니다.
Kaushal Modi

답변:


17

폐쇄를 위해, 여기 내 의견에 따라 확장되는 답변이 있습니다. 필요한 키 바인딩으로 부 모드를 정의하고 파일 로컬 변수를 사용하여 필요한 버퍼에서 토글합니다.

  (define-minor-mode my-org-buffer-local-mode
    "Minor mode to simulate buffer local keybindings."
    :init-value nil)
  (define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)

파일 끝에서 로컬 변수 섹션을 다음과 같이 설정하여 필요한 파일에서 토글 할 수 있습니다. 여기에서 키 바인딩을 변경하거나 추가 할 수도 있습니다. 동일한 키 순서를 다른 명령에 매핑하는 각 버퍼에 대해 다른 부 모드를 정의해야합니다.

 # Local Variables:
 # my-org-buffer-local-mode: t
 # eval:(define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-other-custom-defun-specific-to-this-buffer)
 # End:

@kaushalmodi : 편집이 더 완벽하기 때문에 편집 내용을 별도의 답변으로 분리 할 수 ​​있습니다. 또한 버퍼 특정 이름을 사용하지 않으면 동일한 키 순서를 두 개의 다른 함수에 동시에 맵핑 할 수 없습니다.
Vamsi

나는이 오류가 발생합니다 : 이것을 eval-buffer: Symbol's value as variable is void: my-org-buffer-local-mode-map실행하려고 할 때(define-minor-mode my-org-buffer-local-mode "Minor mode to simulate buffer local keybindings." :init-value nil) (define-key my-org-buffer-local-mode-map (kbd "<f10>") 'some-custom-defun-specific-to-this-buffer)
incandescentman

또한 같은 오류가 발생합니다. 어떤 생각?
zeltak

키워드로 @incandescentman 전화 (make-keymap) :keymap확인 nullprogram.com/blog/2013/02/06
nichijou

5

다음은 버퍼 별 키 바인딩을 설정하는 일반적인 방법입니다.

  • (가) 아래에 니펫을 저장 (임시 사소한 모드를 생성 temp-mode.el하고 require그것은 당신에 init.el.
  • temp-mode마이너 모드를 활성화하고 필요한 버퍼에서만 마이너 모드의 키맵을 정의하십시오.

Local Variables사용자 정의 키 바인딩을 원하는 버퍼에 아래 스 니펫을 넣으십시오 . 아래는 org-mode파일의 예입니다 .

버퍼 1에서

# Local Variables:
# eval: (temp-mode 1)
# eval: (define-key temp-mode-map (kbd "<f10>") 'function-ONE)
# End:

다른 버퍼가 다음을 사용하여 동일한 키 바인딩을 재정의하는 경우,

버퍼에서 두

# Local Variables:
# eval: (temp-mode 1)
# eval: (define-key temp-mode-map (kbd "<f10>") 'function-TWO)
# End:

그런 다음 새로운 바인딩이 효과적입니다 M-x revert-buffer.

이것은이 두 버퍼 사이를 매우 자주 전환해야하고 F10둘 다 에서 바인딩 을 사용해야하는 경우 수행 할 작업입니다 .

  • 버퍼 하나에서 작업하고 C-x C-s(저장) 버퍼 두 개로 전환
  • revert-buffer(바로 바인딩 새로 고침), 버퍼 2에서 C-x C-s작동하고 버퍼 ONE으로 전환
  • revert-buffer(바로 바인딩 새로 고침), 버퍼 ONE에서 C-x C-s작동하고 버퍼 두 번으로 전환

그러나 다른 버퍼 특정 명령을 다른 키에 바인딩하려고합니다.


임시 마이너 모드

;; temp-mode.el
;; Temporary minor mode
;; Main use is to enable it only in specific buffers to achieve the goal of
;; buffer-specific keymaps

(defvar temp-mode-map (make-sparse-keymap)
  "Keymap while temp-mode is active.")

;;;###autoload
(define-minor-mode temp-mode
  "A temporary minor mode to be activated only specific to a buffer."
  nil
  :lighter " Temp"
  temp-mode-map)

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