如何在Emacs目录的子目录中创建文件?
我使用dired浏览目录及其子目录,并使用如何在Emacs目录的子目录中创建文件?,emacs,dired,Emacs,Dired,我使用dired浏览目录及其子目录,并使用I(dired可能插入subdir) 当光标位于子目录中时,我执行C-x C-f,默认目录是我的缓冲区的根目录,有办法更改吗 因此,如果我访问/foo/bar,然后在bar的缓冲区中插入/foo/bar/baz的内容,并将光标放在那里,当我要求访问文件时,会得到一个带有/foo/bar/baz/的小缓冲区(使用默认键绑定或其他键绑定,这对我来说无关紧要)。不,默认目录是缓冲区的本地目录,不仅仅是缓冲区的一部分。这是故意的,没有办法改变 但是您当然可以定义
I
(dired可能插入subdir
)
当光标位于子目录中时,我执行C-x C-f
,默认目录是我的缓冲区的根目录,有办法更改吗
因此,如果我访问/foo/bar,然后在bar的缓冲区中插入/foo/bar/baz的内容,并将光标放在那里,当我要求访问文件时,会得到一个带有
/foo/bar/baz/
的小缓冲区(使用默认键绑定或其他键绑定,这对我来说无关紧要)。不,默认目录是缓冲区的本地目录,不仅仅是缓冲区的一部分。这是故意的,没有办法改变
但是您当然可以定义一个命令,该命令拾取subdir目录,然后在读取要访问的文件名时将默认目录
绑定到该目录,等等)
例如,此命令将读取默认目录为您所需的文件名,然后访问该文件:
(defun foo (file)
"..."
(interactive
(let ((default-directory (dired-current-directory)))
(list (read-file-name "File: "))))
(find-file file))
而且,开箱即用,您当然可以访问另一个Dired缓冲区中的subdir,其中默认目录
是您想要的。像dired这样的命令可以查找标记的文件(F
)和dired显示文件(C-o
)这样做
但是,为什么希望默认目录反映您所在列表的子目录?您的用例是什么?我改进了一个函数,它完全满足了我的需求:
(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)))
以下是我自己的解决方案
(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函数来扩充现有函数(和宏)。看
现在,如果您转到dired下的子目录并运行C-x C-f
,系统将提示您正确的路径
更新:
最近,我开始玩。定义了dired subdir aware
后,我可以轻松地扩展ido find file
,用以下代码识别subdir
(dolist (fun '(find-file-read-args ido-expand-directory))
(advice-add fun :around 'dired-subdir-aware))
dired当前目录
正是我需要的,谢谢!但是为什么你的函数基本上放弃了读取文件名的结果呢?它不会丢弃它。该结果成为参数文件
的值,该值被传递到查找文件
。您的版本(以下)没有做更多的事情,但做的事情更少:您的版本也不能以非交互方式使用。我想你需要好好读一读。哈,是的,我不明白let
是如何成为交互
的一个参数的。我很少看到这样使用它。我应该记下我自己的答案。:-)我不知道建议!这正是我要找的!