如何在 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 中创建一个空文件夹

cd是啥意思。 > 在 Windows CMD 中创建空文件?

在非空远程文件夹中创建存储库

将文件写入 blob 容器时在根容器中创建空文件

如何在 Java 中创建一个空流?

如何在 mySQL 中创建一个空的 VIEW