【问题标题】:How do I create an empty file in emacs?如何在 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,然后_创建一个新文件,很短

标签: file emacs elisp 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 增加了两个新命令:

  1. 制作空文件
  2. 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 ""))
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-05-25
                  • 1970-01-01
                  • 2010-10-22
                  • 1970-01-01
                  • 2017-12-02
                  • 1970-01-01
                  相关资源
                  最近更新 更多