2012-07-08 69 views
3

考慮下面的例子:我想從迷你緩衝區使用ido讀取文件,但合併在我經常使用的所有目錄中。我不能只執行乾淨的方式來執行Emacs迷你緩衝區中的命令

(ido-find-file) 
(ido-merge-work-directories) 

因爲第二個sexp將只在用戶完成選擇文件後執行。那麼問題是:在minibuffer的命令循環中執行命令的最好/最乾淨的方式是什麼?

我知道只有這樣,才能做,這是我想要的命令綁定到一個鍵序列,並依次加入到讀命令的事件所以關鍵的運行,一旦我們進入迷你緩衝區命令循環:

(setq unread-command-events (append (listify-key-sequence (kbd "M-s")) unread-command-events)) ; std key-binding for ido-merge-work-directories 
(ido-find-file) 

但這是非常hacky,我想知道是否有更好的解決方案。

謝謝!

編輯:只是爲了澄清,這個問題是不是關於ido。讓我解釋。當你調用一個函數,如發現文件,或切換到緩衝,或任何需要小緩衝區的互動中,「遞歸編輯」創建 - 也就是說,一個命令循環的內部命令循環。

所以,代碼:

(message "A") 
(recursive-edit) 
(message "B") 

印刷品A,然後暫停功能的執行並重新進入命令循環。你可以四處移動,打開文件等,直到你離開遞歸編輯,然後打印「B」。

所以,讓我改一下我的問題:如果你創建一個遞歸編輯,你怎麼又在創建新的命令循環執行一個命令(在同一個函數)?如果我必須鍵入額外的鍵,它不會計算在內。對於ido示例,要合併目錄,ido必須正在運行:在調用ido之前執行合併目錄不在ido的命令循環中。如果你之後執行它,那麼ido就會銷燬它的命令循環。

+1

你總是* *要合併的其他目錄? – 2012-07-08 08:06:36

+0

這只是一個例子,但對於我正在編寫的應用程序(項目管理庫),答案是肯定的。我主要對一般問題的答案感興趣:如果我進入minibuffer命令循環,我該如何幹淨地執行該循環中的命令? – 2012-07-08 20:04:40

回答

1

所以我覺得有三個回答您的問題:

  • 您可以綁定在迷你地圖鍵,一樣的任何其他。有several keymaps潛在相關。

  • ido有一些鉤子可用來改變各種功能的行爲,尤其是ido-make-*-hook變量似乎有關。 (如果您從未使用過它,M-x describe-variable,又名\C-h v,是你的朋友。)

  • 如果你想改變通用功能的行爲,並沒有可用的鉤子,你應該考慮defadvice。就你而言,我認爲你會很開心(未經測試!):

    (defadvice ido-find-file (before) 
        (ido-merge-work-directories)) 
    (ad-activate ido-find-file) 
    

    您可以將這些行添加到您的.emacs

    (when (require 'ido) 
        (defadvice ido-find-file (before) 
        (ido-merge-work-directories)) 
        (ad-activate ido-find-file)) 
    
+1

這些都不起作用。當然,我可以在minibuffer映射中綁定鍵,但我不希望用戶輸入更多。 ido具有鉤子,但是我沒有見過這種鉤子允許你在循環中執行任意代碼,而且這個問題並不是專門關於ido的。建議也不行,如果你之前建議在ido創建它的命令循環之前先執行代碼......如果你在之後執行它,那麼命令在ido已經關閉它的命令循環時執行。 – 2012-07-09 02:34:27

1

引述手冊:

一般情況下,我們嘗試使用遞歸減少編輯級別 GNU Emacs。這是因爲他們限制你以特定順序「回去」 - 從最內層到最高層。當 可能,我們在不同的緩衝區呈現不同的活動,讓你 可以在它們之間請你切換。一些命令切換到 新的主要模式,該模式提供切換回的命令。這些 辦法給你更多的靈活性回到未完成的任務 您選擇的順序。

所以,你可以描述你確實需要這樣做的情形? Ido在這種情況下的工作方式很奇怪。

+1

我知道他們是「令人難以接受」,但每個迷你緩衝區操作調用遞歸編輯,所以它不完全是一個罕見的情況。在我的文章中的例子是促使我發佈這個問題的例子,但我過去也需要它將minibuffer輸入注入到提供蹩腳API的第三方庫中。我對「用ATM解決實際問題的不同方式」感興趣。我已經發現了一個工作黑客。我純粹想知道在內部遞歸編輯命令循環中是否有乾淨的方法來執行命令,如果沒有乾淨的方法,我只是在某個時候修補一個補丁。 – 2012-07-10 04:08:56

1

這不是我清楚你的要求正是,但它聽起來有點像你問如何調用命令交互,從迷你緩衝區中讀取的時候你是不是在頂層。

如果這是問題,那麼答案很簡單:在命令調用周圍綁定enable-recursive-minibuffers到非nil

相關問題