当我调用find-file打开一个新文件时,通常情况下我要找的文件在我已经加载的目录之一。理想情况下,我想使用上/下箭头滚动历史记录。但是问题是,如果我已经从一个目录中加载了10个文件,那么在看到我的文件可能在的新目录之前,我必须先通过同一目录中的那十个文件。最终,我经常只是重新输入目录或从xterm中剪切/粘贴它。在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))
这将使用缓冲区列表的顺序作为历史记录,这正是您想要的。
(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是在历史记录(已打开的文件)上进行补全,而不是在您指定的目录中可用的文件上进行补全。
要同时使两者正常工作有点棘手...
这不是你想要的,但是
你尝试过(electric-buffer-list)Ctrl-x Ctrl-b吗?
或者(dired)?