В emacs я создаю файл путем посещения его с C-x C-f. Скажем, я хотел бы создать /home/myself/new_directory/file.txt
.
Если new_directory еще не существует, есть ли способ иметь его, создаются во время создания file.txt
без каких-либо дополнительных шагов? (Я думаю о чем-то как использование -p
флаг к mkdir
в Linux.)
Я чувствую, что существует другое нажатие клавиши вместо C-x C-f, который может сделать это, но я не могу помнить, каково это.
Можно также советовать функции 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)))))
Просто вставьте это Ваш .emacs
где-нибудь и использование C-x C-f, как обычно.
Когда я предоставляю путь несуществующий компонент, find-file
(т.е. C-x C-f), дает мне дополнительное сообщение, в котором говорится
Используйте делать-каталог M-x RET RET для создания каталога и его родителей
Так как файл не создается, пока Вы сначала не сохраняете буфер, можно или работать make-directory
прямо после того, как Ваш новый буфер подходит, или можно сделать это любое другое время, прежде чем необходимо будет сохранить файл. Затем от буфера, которому нужен каталог, введите делать-каталог M-x RET RET (это запросит каталог для создания (значение по умолчанию получено из пути буфера); второе RET должно принять значение по умолчанию).
Режим идо обеспечивает ido-find-file
это - замена find-file
и дает Вам намного больше функций. Например, это позволяет Вам создавать новый каталог между тем, Вы открываете файл.
Введите C-x C-f, как обычно (который повторно отображается на ido-find-file
),
обеспечьте несуществующий путь,
нажмите M-m, который запросит новый каталог для создания,
и затем укажите имя файла для посещения в недавно созданном каталоге.
В дополнение к @Chris' предложению делать-каталога M-x можно записать короткую функцию elisp, которая сделает находить-файл и затем делать-каталог... Можно попробовать это:
(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))
)
Это не симпатично, и это высвечивает "на нем делать-каталог M-X...." перед тем, чтобы говорить "Каталог Creating...", но если ничто иное, это должно дать Вам запуск.