2009-03-03 122 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中搜索并且它在当前文件夹中没有匹配时,它将搜索历史记录。

相关问题