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

时间:2016-12-02 10:20:46

标签: emacs dired

我使用dired浏览目录及其子目录idired-maybe-insert-subdir

当光标位于子目录中时,我执行C-x C-f,默认目录是我的缓冲区的根目录,有没有办法改变它?

所以,如果我访问/ foo / bar然后在条形缓冲区中插入/ foo / bar / baz的内容并将光标放在那里,当我使用/foo/bar/baz/时获取一个迷你缓冲区要求访问一个文件(使用默认的键绑定或其他,对我来说并不重要)。

3 个答案:

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