我可以更改Emacs查找文件历史记录吗?

时间:2009-03-03 15:40:34

标签: emacs

当我调用find-file打开一个新文件时,通常会发生我正在查找的文件位于我已加载的目录之一。

理想情况下,我想使用向上/向下箭头滚动浏览历史记录。

这个问题是,如果我已经从目录中加载了10个文件,我首先必须通过这10个文件,所有文件都在同一个目录中,然后才会看到我的文件所在的新目录。 / p>

最后,我经常再次输入目录或从xterm剪切/粘贴它。

在find-file命令中,我是否可以更改向上/向下箭头的行为来迭代目录而不是文件。

或者,我可以更改文件顺序以匹配最近访问的缓冲区的顺序,而不是在我加载文件时吗?

5 个答案:

答案 0 :(得分:4)

我的第一个答案遭遇了TAB完成在'find-file中不再按预期工作的行为。但这项技术似乎仍然有用(如果你喜欢它,最好)。

但是,此解决方案具有相同的历史记录行为,但在“find-file”中保持TAB完成符合预期。

我有兴趣知道是否有办法避免建议查找文件,但我找不到任何能让我知道“查找文件被调用”的内省。

(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))

答案 1 :(得分:4)

我建议IDO。您可以在缓冲区列表或查找文件中进行搜索。在find-file中搜索并且当前文件夹中没有匹配项时,它会搜索历史记录。

答案 2 :(得分:1)

不是你想要的,但是

你试过(电子缓冲列表)Ctrl-x Ctrl-b?

或(dired)?

答案 3 :(得分: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 :(得分:0)

使用Icicles,您可以在候选文件名之间循环,并且可以通过多种方式对它们进行排序。您可以按照上次使用的顺序访问它们等。