【问题标题】:How can I create a file in a sub-directory in Emacs Dired?如何在 Emacs Dired 的子目录中创建文件?
【发布时间】:2016-12-02 10:20:45
【问题描述】:

我使用 dired 浏览带有i (dired-maybe-insert-subdir) 的目录及其子目录

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

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

【问题讨论】:

    标签: emacs dired


    【解决方案1】:

    以下是我自己的解决方案。

    (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)
    

    我刚刚学会了如何使用建议函数来扩充现有函数(和宏)。见(elisp) Advising Functions

    现在,如果您转到 dired 下的子目录并运行 C-x C-f,系统将提示您输入正确的路径。

    更新

    最近开始玩(ido) Top。定义 dired-subdir-aware 后,我可以轻松扩展 ido-find-file 以使用以下代码识别子目录。

    (dolist (fun '(find-file-read-args ido-expand-directory))
      (advice-add fun :around 'dired-subdir-aware))
    

    【讨论】:

    • 我不知道建议!这正是我想要的
    【解决方案2】:

    不,default-directory 是缓冲区本地的,而不仅仅是缓冲区的一部分。这是设计使然,无法更改。

    但您当然可以定义一个命令来获取 subdir 目录,然后在读取要访问的文件名时将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 反映你所在的子目录呢?你的用例是什么?

    【讨论】:

    • dired-current-directory 正是我所需要的,谢谢!但是为什么你的函数基本舍弃了read-file-name的结果呢?
    • 嗯?它不会丢弃它。该结果成为参数FILE 的值,该值被传递给find-file。您的版本(如下)没有更多功能,而且功能更少:您的版本也不能交互式使用。我认为您需要阅读interactive
    • 哈,是的,我不明白letinteractive 的参数。我很少看到这种使用方式。
    【解决方案3】:

    我将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)))
    

    【讨论】:

    • 我应该记下我自己的答案。 :-)
    猜你喜欢
    • 2011-05-11
    • 1970-01-01
    • 2010-09-14
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    相关资源
    最近更新 更多