2014-01-23 51 views
1

我還沒有能夠讓minibuffer-exit-hookread-string配合使用。據我所知,在完成read-string之後,我不應再在迷你緩衝器中。但是,條件(minibufferp)表示即使read-string完成,我仍處於小型緩衝區中。 read-string是用C編寫的,所以我不能在那裏添加鉤子(即在read-string函數的尾部)。 。如何使用帶字符串的小型緩衝區退出鉤

文檔[小緩衝區退出掛機]:正常運行鉤剛剛之後,從迷你緩衝區

退出[思考多一點關於這個之後,我敢肯定這是一個錯誤 - 所以我提交了錯誤報告:BUG#16524正如我學到更多,我會更新這個線程

(defun test() 
    (interactive) 
    (read-string "Prompt: " "testing")) 

(add-hook 'minibuffer-exit-hook (lambda() 
    (cond 
    ((minibufferp) 
     (message "Focus is still in the minibuffer: %s" (buffer-name))) 
    (t (message "Contragulations -- focus is now in: %s." (buffer-name)))))) 

回答

1

真正退出minibuffer後運行一個鉤子是毫無意義的:你可能在任何類型的緩衝區(因爲minibuffer使用可以從任何地方觸發),因此你對當前的上下文知之甚少(除非你使用緩衝區本地退出鉤子,我猜)。

如果您希望在所選窗口發生變化時運行鉤子,那麼您的最佳選擇可能是使用post-command-hook將當前所選窗口存儲在輔助變量中,並使用它與前一個選定窗口進行比較。

+0

是的,謝謝你,你的建議確實解決了所有情況。我將我的模式設置合併爲一個函數,該函數現在將通過'post-command-hook'調用。有幾種情況下其它鉤也可以是有用的 - 例如,'改變-主要模式-hook'和'窗口配置改變-hook'。而且,由於在定位同一幀的相同窗口時沒有顯示緩衝區掛鉤,因此我添加了自己的掛鉤。 – lawlist

3

doc字符串是不準確的,這就是所有的鉤子在minibuffer輸入文本時運行。已完成(不再可能)。運行時的當前緩衝區仍然是mi nibuffer。 (這就是它的方式應該是,FWIW。)

注意,elisp的手動把它略有不同(但同樣,不是很準確):

This is a normal hook that is run whenever the minibuffer is 
entered. 

(「每當」,意思是差不多的時間,不一定以後)

如果你想在你的代碼每次使用的read-string後做一些事情,然後定義一個函數,執行以下操作:先(read-string...),那麼不管你想要做旁邊。並使用該功能。

如果您還需要影響read-string的其他調用,除了您在代碼中編寫的代碼之外,還請告知函數read-string在完成香草代碼後執行任何操作。

例如:

(defadvice read-string (after fooness activate) 
    (message "buffer: %S" (current-buffer))) 

[注:是的,你可以建議(C寫的函數)。你曾經甚至能夠建議特殊的形式,但他們倒退了這個功能。]

+0

謝謝你 - 我將創建一個環繞'讀string',然後有一個'(運行鉤「退出小緩衝區掛機)'新功能。啊,我剛剛看到你的例子...我也會嘗試。 – lawlist

+0

是的,那是'defadvice。 。 「工作完美 - 非常感謝 - 非常感謝! :) – lawlist