我能否更改Emacs的查找文件历史记录?

8
当我调用find-file打开一个新文件时,通常情况下我要找的文件在我已经加载的目录之一。理想情况下,我想使用上/下箭头滚动历史记录。但是问题是,如果我已经从一个目录中加载了10个文件,那么在看到我的文件可能在的新目录之前,我必须先通过同一目录中的那十个文件。最终,我经常只是重新输入目录或从xterm中剪切/粘贴它。在find-file命令中,我能否改变上/下箭头的行为,使其迭代目录而不是文件?或者,我是否可以更改文件顺序,以匹配最近访问缓冲区的顺序而不是加载文件的顺序?

历史浏览记录可以使用箭头键,是吗?(我意识到您遇到的问题与顺序有关) - Trey Jackson
5个回答

4

我的第一个答案在“查找文件”中不再按预期工作,但这种技术仍然似乎很有用(如果您喜欢它,更可取)。

然而,这个解决方案具有相同的历史行为,但在“查找文件”内保持了预期的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))

这个解决方案有一个不好的副作用,就是向下箭头和向上箭头不是互补的。例如,如果你使用向上箭头循环浏览文件列表,并找到了你想要的文件,按下向下箭头并不能回到你刚刚浏览过的列表中的前一项! - EoghanM
我并不认为是这样的。当我在“next-history-element”建议中设置断点时,我发现按上箭头或下箭头键时会调用它。也许你的按键绑定不同? - Trey Jackson
我不认为我有任何奇怪的按键绑定 - 当我创建另一个“previous-history-element”函数时,上下箭头似乎是相反的。 - EoghanM

4

我建议使用IDO。您可以在缓冲区列表或查找文件中进行搜索。当在查找文件中搜索时,如果当前文件夹中没有匹配项,则会搜索历史记录。


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

嗯...这会改变find-file的TAB补全行为,因为TAB是在历史记录(已打开的文件)上进行补全,而不是在您指定的目录中可用的文件上进行补全。

要同时使两者正常工作有点棘手...


1

这不是你想要的,但是

你尝试过(electric-buffer-list)Ctrl-x Ctrl-b吗?

或者(dired)?


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接