2015-04-06 48 views
2

我写了一个奇特的函数,我想绑定到TAB。该功能仅在任何非只读文本缓冲区中有意义。目前,我绑定,要么像:Emacs:如何仅在常规缓冲区中绑定密钥而不在minibuffer中?

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

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

与此结合的问题是,现在标签完成并在迷你缓冲区中,这是一个重要的功能不再工作(如对于缓冲区/文件名称,或M-x)。

是否可以绑定TAB只适用于普通模式?我知道我可以使用define-key some-major-mode-map,但是因为我希望它在所有模式(除了小型缓冲区的之外),所以这会很烦人。因此,我可能在寻找类似define-key any-mode-except-minibuffer ...的东西。

如果这样的功能不存在:是否有解决方法来让tab-completion在minibuffer中再次工作?也许我可以在更改全局绑定后重新设置原始的minibuffer选项卡绑定?我无法弄清楚,实际上我必须绑定哪个函数才能使其工作。

回答

1

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

minibuffer使用自己的键盘映射,它们是本地键盘映射,因此优先于全局键盘映射绑定。

但是,任何次要模式键盘映射优先于本地键盘映射。因此,例如,如果您打开了一个(全局)次要模式,该模式会绑定<tab>,那么它将覆盖小型缓冲区键盘映射中该键的任何绑定。

你可以做的另一件事是简单地绑定你想要的任何命令在minibuffer键盘映射中的<tab>。但是,如果您希望小缓冲区通常使用<tab>行为,则不需要那么做。

[另一种可能的混淆:有些事情,比如Isearch,你可能认为使用微型缓冲器不会使用它。 ISEARCH使用它自己的键盘布局,isearch-mode-map]您的评论后


更新:

分配在全球地图上的一个关键,因为你做了,应该不会影响什么键进行在minibuffer ,前提是它在小型缓冲键盘映射中具有不同的绑定。 TAB通常绑定在所有的小型缓冲区完成键盘映射中(但不包含在未完成的微型缓冲键盘映射中)。

有关小型缓冲器键盘映射的信息,请参阅Elisp手册中的节点Completion CommandsText from Minibuffer

要查看当前绑定是针对与变量(如minibuffer-local-completion-map)相关的键盘布局,加载库help-fns+.el和使用C-h M-k其次是键盘映射变量名。 (有关库的详细信息,请参阅Help+

如果你不想TAB不要使用全局命令,在未完成小缓冲区地图(minibuffer-local-mapminibuffer-local-ns-map)结合,则只是将其绑定在这些地图到任何命令你喜欢。但对于完成地图,你不需要做任何事情 - TAB应该已经绑定在那里。


你尝试emacs -Q,要看看是否有您的init文件被干扰?如果不是,那就先做。

+0

嗯,也许我的问题还不够清楚。我确实知道“导致问题”的原因:我新的全局选项卡绑定了花哨的my-indent-region函数。如果我删除它,那么“问题”就消失了,但我希望的结合也是如此。澄清:我的目标是将TAB绑定到'my-indent-function'_except_,用于在我输入minibuffer时。你的段落“你可以做的另一件事......”可能是我正在寻找的东西,但我不知道我必须如何绑定才能获得默认行为。 – bluenote10 2015-04-06 18:01:18

+0

看我的编辑。你的问题很清楚。也许我的回答不够清楚? ;-) – Drew 2015-04-06 18:32:49

2

经过一些更多的研究,我发现了一个解决方案/ this answer中的问题。

显然,我的问题是我绑定到(kbd "<tab>")。如果我理解正确,我的问题其实不是我覆盖了小缓冲区的实际键盘映射 - 我猜测它们在进入小型缓冲区小模式时正确加载。但是,似乎优先于与"\t"的结合与(kbd "<tab>")的结合。根据上面的答案,小缓冲区绑定只使用"\t",所以绑定到(kbd "<tab>")会使它们蒙上阴影。我现在使用以下绑定来代替:

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

现在一切似乎都正常工作。

+0

'(kbd“TAB”)'也是等价的,我相信 – 2017-06-01 20:09:40