特定于缓冲区的键绑定


14

是否可以设置特定于缓冲区的键绑定?

我的一个组织文件中包含以下内容:

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

但是此绑定对于其他组织模式文件也同样有效。如果我使用其他主要模式打开文件,则会启动默认键绑定。

看来local-set-key是设置特定于主模式的绑定而不是特定于缓冲区的绑定。

如何使绑定仅在特定缓冲区中激活?


2
哇,您是对的:“绑定进入当前缓冲区的本地映射,在大多数情况下,该绑定与同一主模式下的所有其他缓冲区共享。” 我从来不知道
shosti 2014年

现在,我考虑一下,如果在本节之前执行此操作,则与之local-unset-key挂钩org-mode-hook可能会起作用Local Variables:
Kaushal Modi 2014年

或者,您可以使用半稀疏的键盘映射进行次要模式,然后使用Local Variables:
Vamsi

@Vamsi谢谢!这是一个优雅的解决方案!我已经更新了您的解决方案。
Kaushal Modi 2014年

Answers:


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 2014年

我收到此错误: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)
白炽灯工

我也得到同样的错误。任何的想法?
zeltak

@incandescentman用:keymap关键字致电(make-keymap),请检查nullprogram.com/blog/2013/02/06
nichijou

5

这是设置特定于缓冲区的键绑定的通用方法。

  • 创建一个临时次要模式(将以下代码段保存到,temp-mode.el并将require其保存在您的init.el
  • 启用temp-mode次要模式,并仅在所需的缓冲区中定义次要模式的键盘映射。

将下面的Local Variables代码片段放入您想要自定义键绑定的缓冲区中。以下是org-mode文件示例。

在缓冲区ONE

# 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绑定,这就是我要做的事情:

  • 在缓冲区ONE中工作,C-x C-s(保存)并切换到缓冲区2
  • revert-buffer(刷新绑定),在缓冲区TWO中工作,C-x C-s然后切换到缓冲区ONE
  • revert-buffer(刷新绑定),在缓冲区ONE中工作,C-x C-s然后切换到缓冲区2

但是我宁愿将不同的特定于缓冲区的命令绑定到不同的键。


临时次要模式

;; 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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.