我使用dired浏览目录及其子目录i
(dired-maybe-insert-subdir
)
当光标位于子目录中时,我执行C-x C-f
,默认目录是我的缓冲区的根目录,有没有办法改变它?
所以,如果我访问/ foo / bar然后在条形缓冲区中插入/ foo / bar / baz的内容并将光标放在那里,当我使用/foo/bar/baz/
时获取一个迷你缓冲区要求访问一个文件(使用默认的键绑定或其他,对我来说并不重要)。
答案 0 :(得分:2)
以下是我自己的解决方案。
(defun dired-subdir-aware (orig-fun &rest args)
(if (eq major-mode 'dired-mode)
(let ((default-directory (dired-current-directory)))
(apply orig-fun args))
(apply orig-fun args)))
(advice-add 'find-file-read-args :around 'dired-subdir-aware)
我刚学会了如何使用advice函数来扩充现有函数(和宏)。请参阅(elisp) Advising Functions。
现在,如果您转到dired下的子目录并运行C-x C-f
,系统将提示您输入正确的路径。
<强>更新强>:
最近,我开始玩(ido) Top。定义dired-subdir-aware
后,我可以使用以下代码轻松扩展ido-find-file
以识别subdir。
(dolist (fun '(find-file-read-args ido-expand-directory))
(advice-add fun :around 'dired-subdir-aware))
答案 1 :(得分:1)
不, default-directory
是缓冲区的本地,而不仅仅是缓冲区的一部分。这是设计的,没有办法改变它。
但是你当然可以定义一个命令来获取子目录,然后在它读取要访问的文件名等时将default-directory
绑定到该目录。)
例如,此命令将读取文件名,默认目录是您想要的,然后访问该文件:
(defun foo (file)
"..."
(interactive
(let ((default-directory (dired-current-directory)))
(list (read-file-name "File: "))))
(find-file file))
而且,开箱即用,您当然可以访问另一个Dired缓冲区中的子目录,其中default-directory
就是您想要的。 dired-do-find-marked-files
( F
)和dired-display-file
( C-o
)等命令可以做到这一点。
但是为什么你希望default-directory
反映你所在的子目录?你的用例是什么?
答案 2 :(得分:0)
我将Drew's answer改进为一个完全符合我想要的函数:
(defun dired-find-file ()
"Find a file in the current dired directory"
(interactive)
(let ((default-directory (dired-current-directory)))
(find-file (read-file-name "Find file:"))))
然后我将此函数绑定到方便的组合键:
(add-hook 'dired-mode-hook
(lambda ()
(local-set-key (kbd "C-x M-f") 'dired-find-file)))