Reputation: 5129
How can I create an empty file from emacs, ideally from within a dired buffer?
For example, I've just opened a Python module in dired mode, created a new directory, opened that in dired, and now need to add an empty __init__.py
file in the directory.
If I use C-x C-f __init__.py RET C-x C-s
then emacs doesn't create the file because no changes have been made to it. I would have to type in the file, save it, delete my typing and then save it again for that to work.
Thanks
Upvotes: 74
Views: 70401
Reputation: 4297
The shortest way
Creates an empty file via a shell operation (but does not open it):
M-! > __init__.py
RET
Open the new file:
C-x C-f RET
(Note: we don't have to type in the name again, because the new file is automatically the first choice)
Upvotes: 5
Reputation: 444
After this thread, Emacs has added two new commands:
These commands will be available in the emacs 27.1 release.
Upvotes: 15
Reputation: 32426
I use the following bound to t
in 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))
Upvotes: 1
Reputation: 91
The best option would be:
(with-temp-file "filename"
(insert ""))
Upvotes: 0
Reputation: 14346
If you want Emacs to treat all new files as modified, you can automate the solution like this:
(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)))
Upvotes: 20
Reputation: 3566
Programatically and without any dependency on touch
, it's quite easy:
(with-temp-buffer (write-file "path/to/empty/file/"))
Upvotes: 15
Reputation: 18055
In addition to other answers on the page, you can use f.el
's function f-touch
:
M-:(f-touch "__init__.py")
RET
Upvotes: 2
Reputation: 14238
You can mark an empty buffer as modified by running set-buffer-modified-p
. Then when you save it, Emacs will write the file.
M-; ; Eval
(set-buffer-modified-p t) ; Mark modified
C-x C-s ; Save buffer
Upvotes: 1
Reputation: 73264
Here's an adaptation of dired-create-directory
. It works the same way, so as well as a plain filename, you can also specify new parent directories (to be created under the current directory) for the file (e.g. 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))))))
Upvotes: 12
Reputation: 1701
I've modified answer from MrBones and created custom function with keybinding:
; 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)
This is very useful to not spend time on recurring action of creating init.py everywhere in new Python project folder.
Upvotes: 0
Reputation: 2717
(shell-command (concat "touch " (buffer-file-name)))
will do what you want, if you've already opened the empty file.
Upvotes: 3
Reputation: 1325
The following works:
C-x b __init__.py RET C-x C-w RET
If you're in a dired buffer the file will be saved in the directory show here.
The trick is to first create an empty buffer by switching to a name that doesn't exist. Then write out the file.
Upvotes: 30
Reputation: 21258
Emacs won't allow you to save a buffer unless it thinks the contents have changed. The quickest, though possibly not cleanest is to open the file using C-x C-f, then press (say) space and backspace, then you should be able to save a file with no contents.
There are other ways of changing the "buffer has been modified" flag, but I don't think there's any easier.
Upvotes: 12