Emacs:如何仅在常规缓冲区中而不是在迷你缓冲区中绑定密钥?

时间:2015-04-06 09:05:52

标签: emacs

我写了一个奇特的函数,我想绑定到 TAB 。该功能仅在任何非只读文本缓冲区中有意义。目前,我这样绑定它:

(global-set-key (kbd "<tab>") 'my-indent-region)

(define-key global-map (kbd "<tab>") 'my-indent-region)

此绑定的问题是现在tab-completion不再适用于迷你缓冲区,这是一项基本功能(例如缓冲区/文件名或M-x)。

是否可以仅为常规模式绑定 TAB ?我知道我可以使用define-key some-major-mode-map,但由于我希望在除以外的所有模式中使用迷你缓冲区,因此维护起来会很烦人。因此,我可能正在寻找类似define-key any-mode-except-minibuffer ...的东西。

如果不存在此类功能:是否有解决方法可以再次使用迷你缓冲区中的制表符完成工作?也许我可以在更改全局绑定后重新设置原始的迷你缓冲区选项卡绑定?我无法弄清楚我实际上必须绑定哪个功能才能使其正常工作。

2 个答案:

答案 0 :(得分:2)

经过一些研究后,我在this answer找到了问题的解决方法/解决方案。

显然,我的问题是我绑定到(kbd "<tab>")。如果我理解正确,我的问题实际上不是我覆盖了迷你缓冲区的实际键盘映射 - 我猜他们在进入迷你缓冲器次要模式时正确加载。但是,绑定到(kbd "<tab>")似乎优先于绑定到"\t"。根据上面的答案,迷你缓冲区绑定只使用"\t",因此绑定到(kbd "<tab>")会影响它们。我现在正在使用以下绑定:

(global-set-key "\t" 'my-indent-region)

现在一切似乎都运转正常。

答案 1 :(得分:1)

在没有init文件(emacs -Q)的情况下启动Emacs时是否会看到此行为?我对此表示怀疑。如果没有,则递归地将您的init文件平分,以找出导致问题的原因。

迷你缓冲区使用自己的键映射,这些键映射是本地的,因此优先于全局键映射绑定。

但是,任何次模式键盘映射都优先于本地键盘映射。因此,例如,如果您启用了绑定<tab>的(全局)次要模式,则会覆盖迷你缓冲区键映射中该键的任何绑定。

您可以做的另一件事就是在迷你缓冲区键盘映射中绑定您想要<tab>的任何命令。但是,如果你想要迷你缓冲区通常的<tab>行为,那么你不应该这样做。

[另一种可能的混淆:有些东西,例如Isearch,您可能认为使用迷你缓冲区不会使用它。 Isearch使用自己的键映射isearch-mode-map。]


评论后更新:

如您所做的那样,在全局地图中分配密钥不应影响该密钥在迷你缓冲区中的作用,前提是它在迷你缓冲区键盘映射中具有不同的绑定。 TAB通常绑定在所有迷你缓冲区完成键映射中(但不在未完成的迷你缓冲区键映射中)。

有关迷你缓冲区键盘映射的信息,请参阅Elisp手册,节点Completion CommandsText from Minibuffer

要查看与变量关联的键映射的当前绑定(例如minibuffer-local-completion-map),请加载库help-fns+.el并使用 C-h M-k 其次是keymap变量的名称。 (有关该库的更多信息,请参阅Help+。)

如果您不希望TAB在非完成迷你缓冲区映射(minibuffer-local-mapminibuffer-local-ns-map)中使用全局命令绑定,则只需将这些映射中的绑定绑定到任何命令你喜欢。但是对于完成地图,您不需要做任何事情 - TAB应该已经绑定在那里。


您是否尝试emacs -Q,看看初始文件中的某些内容是否在干扰?如果没有,请先这样做。