在 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....”但如果没有别的,它应该给你一个开始。