如何从emacs创建一个空文件,最好是从一个直接缓冲区中创建?
例如,我刚刚以dired模式打开了一个Python模块,创建了一个新目录,在dired中打开了,现在需要在目录中添加一个空的__init__.py
文件。
如果我使用C-x C-f __init__.py RET C-x C-s
,那么emacs不会创建该文件,因为没有对其进行任何更改。我必须输入文件,保存,删除我的输入,然后再次保存,以便工作。
由于
答案 0 :(得分:55)
您可以使用触摸命令:
M-! touch __init__.py RET
答案 1 :(得分:27)
以下作品:
C-x b __init__.py RET C-x C-w RET
如果您在一个直接缓冲区中,该文件将保存在此处显示的目录中。
诀窍是首先通过切换到不存在的名称来创建一个空缓冲区。然后写出文件。
答案 2 :(得分:20)
如果您希望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)))
答案 3 :(得分:12)
Emacs不允许您保存缓冲区,除非它认为内容已更改。最快,但可能不是最干净的是使用 C-x C-f 打开文件,然后按(说)空格和退格键,然后你应该能够保存没有内容的文件。
还有其他方法可以更改“缓冲区已被修改”标志,但我认为没有任何更容易。
答案 4 :(得分:10)
这是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))))))
答案 5 :(得分:10)
以编程方式且不依赖touch
,非常简单:
(with-temp-buffer (write-file "path/to/empty/file/"))
答案 6 :(得分:6)
使用touch命令。
M-! touch __init__.py RET
答案 7 :(得分:5)
在此线程之后,Emacs添加了两个新命令:
这些命令将在emacs 27.1发行版中提供。
答案 8 :(得分:4)
最短路
M - ! > __init__.py
RET
答案 9 :(得分:3)
(shell-command (concat "touch " (buffer-file-name)))
将执行您想要的操作。
答案 10 :(得分:2)
答案 11 :(得分:1)
您可以通过运行set-buffer-modified-p
将空缓冲区标记为已修改。然后,当您保存它时,Emacs将写入该文件。
M-; ; Eval
(set-buffer-modified-p t) ; Mark modified
C-x C-s ; Save buffer
答案 12 :(得分:1)
我在dired中使用以下绑定到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))
答案 13 :(得分:0)
我修改了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)
这对于不花时间在新的Python项目文件夹中创建 init .py的重复操作非常有用。
答案 14 :(得分:0)
最好的选择是:
(with-temp-file "filename"
(insert ""))