Как я могу создать пустой файл из emacs, идеально из сушеного буфера?
Например, я только что открыл модуль Python в сушеном режиме, создал новый каталог, открыл это в сушеном, и теперь должен добавить пустое __init__.py
файл в каталоге.
Если я использую C-x C-f __init__.py RET C-x C-s
затем emacs не создает файл, потому что никакие изменения не были внесены в него. Я должен был бы ввести в файле, сохранить его, удалить свой ввод и затем сохранить его снова, чтобы это работал.
Спасибо
Вот адаптация dired-create-directory
. Это работает тот же путь, так а также простое имя файла, можно также указать новые родительские каталоги (чтобы быть созданными под текущим каталогом) для файла (например, foo/bar/filename
).
(eval-after-load 'dired
'(progn
(define-key dired-mode-map (kbd "C-c n") 'my-dired-create-file)
(defun my-dired-create-file (file)
"Create a file called FILE.
If FILE already exists, signal an error."
(interactive
(list (read-file-name "Create file: " (dired-current-directory))))
(let* ((expanded (expand-file-name file))
(try expanded)
(dir (directory-file-name (file-name-directory expanded)))
new)
(if (file-exists-p expanded)
(error "Cannot create file %s: file exists" expanded))
;; Find the topmost nonexistent parent dir (variable `new')
(while (and try (not (file-exists-p try)) (not (equal new try)))
(setq new try
try (directory-file-name (file-name-directory try))))
(when (not (file-exists-p dir))
(make-directory dir t))
(write-region "" nil expanded t)
(when new
(dired-add-file new)
(dired-move-to-filename))))))
Наилучший вариант был бы:
(with-temp-file "filename"
(insert ""))
Я изменил ответ от MrBones и создал пользовательскую функцию с привязкой клавиш:
; create empty __init__.py at the place
(defun create-empty-init-py()
(interactive)
(shell-command "touch __init__.py")
)
(global-set-key (kbd "C-c p i") 'create-empty-init-py)
Это очень полезно для не проведения времени на повторяющемся действии создания init.py везде в новой папке проекта Python.
Я использую следующее, связанное с t
в сушеном.
(defun my-dired-touch (filename)
(interactive (list (read-string "Filename: " ".gitkeep")))
(with-temp-buffer
(write-file filename)))
;; optionally bind it in dired
(with-eval-after-load 'dired
(define-key dired-mode-map "t" 'my-dired-touch))
Можно отметить пустой буфер, как изменено путем выполнения set-buffer-modified-p
. Затем при сохранении его Emacs запишет файл.
M-; ; Eval
(set-buffer-modified-p t) ; Mark modified
C-x C-s ; Save buffer
В дополнение к другим ответам на странице можно использовать f.el
функция f-touch
:
M-: (f-touch "__init__.py")
RET
(shell-command (concat "touch " (buffer-file-name)))
сделает то, что Вы хотите, если Вы уже открыли пустой файл.
Используйте сенсорную команду.
M-! touch __init__.py RET
Programatically и без любой зависимости от touch
, это довольно легко:
(with-temp-buffer (write-file "path/to/empty/file/"))
После этого потока Emacs добавил две новых команды:
Эти команды будут доступны в выпуске emacs 27.1.