2015-04-06 47 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