2009-03-03 137 views
8

當我調用find-file打開一個新文件時,通常會發生我正在查找的文件位於我已經加載的其中一個目錄中。我可以更改Emacs查找文件歷史記錄嗎?

理想情況下,我想使用向上/向下箭頭滾動查看歷史記錄。

問題是,如果我已經從一個目錄中加載了10個文件,我首先必須在同一個目錄中通過這10個文件,然後才能看到我的文件可能位於哪個新目錄。

最後,我經常只需再次輸入目錄或從xterm剪切/粘貼它。

在find-file命令中,我可以更改向上/向下箭頭的行爲來迭代目錄而不是文件。

或者,我可以更改文件順序以匹配最近訪問的緩衝區的順序,而不是當我加載文件時?

+0

歷史瀏覽的工作原理與箭頭鍵,不是嗎?(我意識到你遇到的問題是有秩序的) – 2009-03-03 18:55:50

回答

4

我的第一個答案從行爲遭受了TAB完成不再擔任預計在「發現文件。但是這項技術似乎仍然有用(如果你喜歡它,最好)。

但是,此解決方案具有相同的歷史記錄行爲,但在'find-file'內部按預期維持TAB完成。

我很想知道是否有辦法避免提供find-file建議,但是我找不到任何內省,這讓我知道「find-file被調用了。

(defadvice find-file (around find-file-set-trigger-variable protect activate) 
    "bind a variable so that history command can do special behavior for find-file" 
    (interactive (let (inside-find-file-command) (find-file-read-args "Find file: " nil))) 
    ad-do-it) 

(defadvice next-history-element (around next-history-element-special-behavior-for-find-file protect activate) 
    "when doing history for find-file, use the buffer-list as history" 
    (if (boundp 'inside-find-file-command) 
     (let ((find-file-history (delq nil (mapcar 'buffer-file-name (buffer-list)))) 
      (minibuffer-history-variable 'find-file-history)) 
     ad-do-it) 
    ad-do-it)) 
+0

這個解決方案有令人討厭的副作用,下行和上行不互補,例如,如果你使用uparrow循環選擇你想要的文件,那麼按下downarrow並不會在你剛剛循環的列表中返回1! – EoghanM 2009-06-03 15:37:22

1

不是你想要的,但

你嘗試過(電緩衝列表)CTRL-X CTRL-B?

or(dired)?

1

這將使用緩衝區列表的歷史順序,這是你想要的。

(setq read-file-name-function 'my-read-file-name) 
(defun my-read-file-name (prompt dir default-filename mustmatch initial predicate) 
    (let ((default-directory dir) 
     (files (directory-files dir)) 
     (history (delq nil (mapcar 'buffer-file-name (buffer-list))))) 
    (completing-read prompt files predicate mustmatch initial 'history))) 

嗯......這是因爲TAB完成超歷史(已打開文件),而不是在過你指定的目錄中文件的修改查找文件的TAB完成的行爲。

四處都在同一時間的工作是有點麻煩......

4

我建議IDO。您可以在緩衝區列表或查找文件中進行搜索。當在find-file中搜索並且它在當前文件夾中沒有匹配時,它將搜索歷史記錄。

相關問題