Как создать пустой файл в emacs?
Как создать пустой файл из emacs, в идеале из встроенного буфера?
Например, я только что открыл модуль Python в режиме dired, создал новый каталог, открыл его, и теперь вам нужно добавить пустой каталог __init__.py
в каталог.
Если я использую C-x C-f __init__.py RET C-x C-s
, то emacs не создает файл, потому что никаких изменений в нем не было. Я должен был бы ввести файл, сохранить его, удалить свой ввод и затем снова сохранить его для работы.
Спасибо
Ответы
Ответ 1
Здесь приведена адаптация 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))))))
Ответ 2
Вы можете использовать команду touch:
M-! touch __init__.py RET
Ответ 3
Следующие работы:
C-x b __init__.py RET C-x C-w RET
Если вы находитесь в загруженном буфере, файл будет сохранен в этом каталоге.
Хитрость заключается в том, чтобы сначала создать пустой буфер, переключившись на имя, которое не существует. Затем запишите файл.
Ответ 4
Если вы хотите, чтобы Emacs обрабатывал все новые файлы как измененные, вы можете автоматизировать решение следующим образом:
(add-hook 'find-file-hooks 'assume-new-is-modified)
(defun assume-new-is-modified ()
(when (not (file-exists-p (buffer-file-name)))
(set-buffer-modified-p t)))
Ответ 5
Emacs не позволит вам сохранять буфер, если он не считает, что содержимое изменилось. Самый быстрый, хотя, возможно, и не самый чистый - открыть файл с помощью C-x C-f, затем нажмите (скажем) пространство и обратное пространство, тогда вы сможете сохранить файл без содержимого.
Существуют и другие способы изменения флага "буфер был изменен", но я не думаю, что там будет проще.
Ответ 6
Программно и без какой-либо зависимости от touch
, это довольно просто:
(with-temp-buffer (write-file "path/to/empty/file/"))
Ответ 7
Используйте команду touch.
M-! touch __init__.py RET
Ответ 8
Самый короткий путь
M-! > __init__.py
RET
Ответ 9
(shell-command (concat "touch " (buffer-file-name)))
будет делать то, что вы хотите, если вы уже открыли пустой файл.
Ответ 10
В дополнение к другим ответам на странице вы можете использовать f.el
function f-touch
:
M-: (f-touch "__init__.py")
RET
Ответ 11
Вы можете пометить пустой буфер как измененный, выполнив set-buffer-modified-p
. Затем, когда вы сохраните его, Emacs напишет файл.
M-; ; Eval
(set-buffer-modified-p t) ; Mark modified
C-x C-s ; Save buffer
Ответ 12
Я изменил ответ от 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.
Ответ 13
Лучший вариант:
(with-temp-file "filename"
(insert ""))
Ответ 14
Я использую следующую привязку к t
в dired.
(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))