如何在 emacs 中创建一个空文件?
Posted
技术标签:
【中文标题】如何在 emacs 中创建一个空文件?【英文标题】:How do I create an empty file in emacs? 【发布时间】:2011-02-05 05:34:52 【问题描述】:如何从 emacs 创建一个空文件,最好是从一个 dired 缓冲区中创建?
例如,我刚刚在 dired 模式下打开了一个 Python 模块,创建了一个新目录,在 dired 下打开它,现在需要在目录中添加一个空的 __init__.py
文件。
如果我使用C-x C-f __init__.py RET C-x C-s
,那么 emacs 不会创建该文件,因为没有对其进行任何更改。我必须输入文件,保存它,删除我的输入,然后再次保存它才能工作。
谢谢
【问题讨论】:
我忍受着这种僵局:Emacs 是一个强大的文本编辑器,它甚至可以集成一个 Scala 编译器等等……但是很多时候非常简单的事情都过于复杂了。我发现“触摸 /path/to/filename”然后在 Emacs 中打开它比尝试在 Emacs 中创建新文件更容易,特别是当有另一个同名甚至相似名称的文件时。 Emacs “试图帮助我”打开错误的文件。拜托,不要“试图帮助我!”...只要按照我告诉你的去做就行了!我很确定必须有一个“插件”(可能是dired)可以做到这一点。过于复杂!又来了! @RichardGomes 已经使用 phils 的解决方案几年了,我发现只需键入“_”就容易多了,它会要求我输入文件名。 Emacs 绝对是非常复杂的,但我不认为它过于复杂。在过去的 5 年里,我对它所做的大部分工作都是让它变得更复杂,以及剃掉所有那些恼人的角落。我在完成时遇到了与您完全相同的问题,但是如果您可以花几年时间了解该系统,则可以解决。C-x C-f __init__.py RET C-x C-s
对我来说很好用(版本24.5.1
),所以自从最初提出这个问题以来,这个问题可能已经解决了。
你说得对,它似乎已被修复。好消息是,它可以在任何地方工作,即使你没有陷入困境。这些天我绑定C-x j
打开dired,然后_
创建一个新文件,很短
【参考方案1】:
您可以使用触摸命令:
M-! touch __init__.py RET
【讨论】:
@offby1,如果您将其添加为正确答案,我会选择它,因为它最适合我。它甚至使用任何目录作为 cwd。 我也非常喜欢!我只是不喜欢输入 M-!位,但我想我可以更改键绑定:)【参考方案2】:以下作品:
C-x b __init__.py RET C-x C-w RET
如果您在 dired 缓冲区中,文件将保存在此处显示的目录中。
诀窍是首先通过切换到一个不存在的名称来创建一个空缓冲区。然后写出文件。
【讨论】:
这个方法很棒,因为它会创建一个新文件,如果它已经存在就会发出警告,并以打开缓冲区中的新文件结束。这符合我 99% 的用例。 在我的设置中,如果文件名与其缓冲区历史记录中的另一个匹配,则 C-x b 将打开该文件而不是新文件。这很方便,除非您要创建一个新文件,或者您有多个同名文件(init.py 就是其中之一)。【参考方案3】:如果您希望 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)))
【讨论】:
我喜欢这个,我想我还是会设置它,因为在一般情况下它看起来更理智,但M-! touch __init__.py
更短,不涉及打开和关闭缓冲区.
@Singletoned - 您不必每次都输入。只要把它放在你的初始化文件中,每次你用C-x C-f
创建一个新文件时,它都会显示在dired中。这比每次都输入一个 shell 命令 (touch
) 要快。【参考方案4】:
以编程方式,不依赖于touch
,非常简单:
(with-temp-buffer (write-file "path/to/empty/file/"))
【讨论】:
这似乎是 emacs 26 的最佳答案。【参考方案5】:在这个线程之后,Emacs 增加了两个新命令:
-
制作空文件
dired-create-empty-file
这些命令将在 emacs 27.1 版本中提供。
【讨论】:
这就是make-empty-file
用来制作空文件的内容:(write-region "" nil filename nil 0)
多年(很多年)以前,emacs“新文件”选项卡就是这样做的:打开一个窗口不需要文件名。 “很好”他们以某种方式回到了这种(更好!恕我直言)方式。【参考方案6】:
这是对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))))))
【讨论】:
虽然我在代码中指定了一个用户保留的绑定,但我实际上已经将它绑定到_
,在我的键盘布局上是+
旁边的移位序列,意思是键dired 中的“新目录”和“新文件”是相邻的。
我已将其更改为答案,因为它是我长期使用的答案。【参考方案7】:
Emacs 不允许您保存缓冲区,除非它认为内容已更改。最快但可能不是最干净的方法是使用 C-x C-f 打开文件,然后按(比如说)空格和退格键,然后您应该能够保存一个没有内容的文件。
还有其他方法可以更改“缓冲区已修改”标志,但我认为没有更简单的方法。
【讨论】:
【参考方案8】:使用触摸命令。
M-! touch __init__.py RET
【讨论】:
【参考方案9】:最短路径
通过 shell 操作创建一个空文件(但不打开):
M-! > __init__.py
RET
打开新文件:
C-x C-f RET
(注意:我们不必再次输入名称,因为新文件会自动成为首选)
【讨论】:
这很聪明,而且绝对比使用触摸短。虽然我使用的解决方案是@phils,但它只是_
,然后是__init__.py
。【参考方案10】:
(shell-command (concat "touch " (buffer-file-name)))
会做你想做的事,如果你已经打开了空文件。
【讨论】:
【参考方案11】:除了页面上的其他答案,还可以使用f.el
的函数f-touch
:
M-:(f-touch "__init__.py")
RET
【讨论】:
【参考方案12】:您可以通过运行set-buffer-modified-p
将空缓冲区标记为已修改。然后当你保存它时,Emacs 会写入文件。
M-; ; Eval
(set-buffer-modified-p t) ; Mark modified
C-x C-s ; Save buffer
【讨论】:
【参考方案13】:我在 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))
【讨论】:
【参考方案14】:我已经修改了 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 的重复操作非常有用。
【讨论】:
【参考方案15】:最好的选择是:
(with-temp-file "filename"
(insert ""))
【讨论】:
以上是关于如何在 emacs 中创建一个空文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Azure Databricks 在 Azure Blob 中创建一个空文件夹