如何在Emacs目录的子目录中创建文件?

如何在Emacs目录的子目录中创建文件?,emacs,dired,Emacs,Dired,我使用dired浏览目录及其子目录,并使用I(dired可能插入subdir) 当光标位于子目录中时,我执行C-x C-f,默认目录是我的缓冲区的根目录,有办法更改吗 因此,如果我访问/foo/bar,然后在bar的缓冲区中插入/foo/bar/baz的内容,并将光标放在那里,当我要求访问文件时,会得到一个带有/foo/bar/baz/的小缓冲区(使用默认键绑定或其他键绑定,这对我来说无关紧要)。不,默认目录是缓冲区的本地目录,不仅仅是缓冲区的一部分。这是故意的,没有办法改变 但是您当然可以定义

我使用dired浏览目录及其子目录,并使用
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
是如何成为
交互
的一个参数的。我很少看到这样使用它。我应该记下我自己的答案。:-)我不知道建议!这正是我要找的!