在 emacs 中创建新文件时可以创建不存在的目录吗?

在 emacs 中创建新文件时可以创建不存在的目录吗?

在 emacs 中,我通过使用 Cx Cf 访问来创建一个文件。假设我想创建/home/myself/new_directory/file.txt

如果 new_directory 尚不存在,是否有办法在创建过程中创建它而file.txt无需任何额外步骤?(我正在考虑在 Linux 中使用-p标志之类的操作。)mkdir

我觉得除了 Cx Cf 之外还有一个不同的按键可以做到这一点,但我不记得它是什么了。

答案1

您还可以建议函数find-file透明地创建必要的目录。

(defadvice find-file (before make-directory-maybe (filename &optional wildcards) activate)
  "Create parent directory if not exists while visiting file."
  (unless (file-exists-p filename)
    (let ((dir (file-name-directory filename)))
      (unless (file-exists-p dir)
        (make-directory dir t)))))

只需将其放在.emacs某处并C-x C-f照常使用即可。

答案2

当我提供一个不存在的组件的路径名时,find-file(即碳数),并向我发送一条额外消息,内容为

使用 Mx make-directory RET RET 创建目录及其父目录

由于文件是在你第一次保存缓冲区后才创建的,因此你可以make-directory在新缓冲区出现后立即运行,也可以在需要保存文件之前的任何其他时间运行。然后从需要目录的缓冲区中输入Mx 创建目录 RET RET(它将提示创建目录(默认值来自缓冲区的路径名);第二个 RET 是接受默认值)。

答案3

我愿意模式提供了ido-find-file替代的选项find-file,并为您提供了更多功能。例如,它允许您在打开文件的同时创建新目录。

  • 照常输入C-x C-f(重新映射到ido-find-file),

  • 提供不存在的路径,

  • 按提示M-m创建新目录,

  • 然后在新创建的目录中指定要访问的文件名。

答案4

除了@Chris 建议的 Mx make-directory 之外,您还可以编写一个简短的 elisp 函数,该函数将执行 find-file 然后执行 make-directory...您可以尝试这个:

(defun bp-find-file(filename &optional wildcards)
  "finds a file, and then creates the folder if it doesn't exist"

  (interactive (find-file-read-args "Find file: " nil))
  (let ((value (find-file-noselect filename nil nil wildcards)))
    (if (listp value)
    (mapcar 'switch-to-buffer (nreverse value))
      (switch-to-buffer value)))
  (when (not (file-exists-p default-directory))
       (message (format "Creating  %s" default-directory))
       (make-directory default-directory t))
  )

它并不漂亮,并且在说“创建目录...”之前它会闪现“it MX make-directory....”但如果没有别的,它应该给你一个开始。

相关内容