如何在emacs中创建一个空文件?

73

如何在emacs中创建一个空文件,最好是在dired缓冲区内创建?

例如,我刚刚在dired模式下打开了一个Python模块,创建了一个新的目录,以dired模式打开该目录,现在需要在该目录中添加一个空的__init__.py文件。

如果我使用C-x C-f __init__.py RET C-x C-s,那么emacs不会创建该文件,因为它没有被修改过。我必须输入该文件名、保存它、删除我的输入,然后再次保存才能实现。

谢谢!


9
我有一个棘手的问题:Emacs是一款功能强大的文本编辑器,甚至可以集成Scala编译器等等……但很多时候非常简单的事情都被复杂化了。我发现更容易先运行“touch /path/to/filename”,然后再在Emacs中打开它,而不是尝试在Emacs中创建一个新文件,特别是当存在另一个同名或相似名称的文件时,Emacs会“试图帮助我”打开错误的文件。请不要“试图帮助我!”……只需按照我告诉你应该做的去做!我相当确定一定有一个“插件”(也许是dired)可以做到这一点。又是那么复杂! - Richard Gomes
1
@RichardGomes 我已经使用phils的解决方案有几年了,现在我发现只需键入“_”,它就会要求我输入文件名,这使得操作更加容易。Emacs确实非常复杂,但我认为它并不过于复杂。在过去的五年中,我所做的大部分工作都是让它变得更加复杂,并且切掉所有那些令人烦恼的角落。我也曾遇到过与您相同的完成问题,但如果您愿意花费几年时间来了解该系统,它是可以解决的。 - Singletoned
1
C-x C-f __init__.py RET C-x C-s 对我来说很好用(版本 24.5.1),所以也许这个问题在最初提问时已经解决了。 - Jian
你说得对,它似乎已经被修复了。而且好的一点是,它可以在任何地方使用,即使你不在dired中也可以。现在我已将C-x j绑定为打开dired,然后_用于创建一个新文件,这相当简短。 - Singletoned
15个回答

62
你可以使用 "touch" 命令:
M-! touch __init__.py RET

1
@offby1,如果您将其作为正确答案添加,我会选择它,因为它对我最有效。它甚至使用dired所在的任何目录作为cwd。 - Singletoned
1
我也非常喜欢它!我只是不喜欢输入M-!,但我想我可以改变按键绑定 :) - Vivi

29
以下命令有效:
C-x b __init__.py RET C-x C-w RET
如果您在dired缓冲区中,则文件将保存在此处显示的目录中。
诀窍是首先通过切换到不存在的名称来创建一个空缓冲区,然后写出该文件。

1
这个方法很棒,因为它会创建一个新文件,如果已经存在则会发出警告,并以新文件在打开的缓冲区中结束。这符合我99%的使用情况。 - Timothy C. Quinn
在我的设置中,如果文件名与缓冲区历史记录中的另一个文件名匹配,则 C-x b 将打开该文件而不是新文件。这很方便,但在您想要创建新文件或有多个具有相同名称的文件的情况下就不太方便了(init.py 就是其中之一)。 - Jacob Lee

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)))

我喜欢这个,而且我认为我可能会设置它,因为在一般情况下它似乎更合理,但是M-! touch __init__.py更短,不涉及打开和关闭缓冲区。 - Singletoned
@Singletoned - 您不必每次输入此命令。只需将其放入您的init文件中,每次使用C-x C-f创建新文件时,它都会显示在dired中。这比每次键入shell命令(touch)更快。 - metakermit
你说的“视为修改”是什么意思? - user129393192

15

通过编程且不依赖于touch,这非常容易:

(with-temp-buffer (write-file "path/to/empty/file/"))

这似乎是 Emacs 26 的最佳答案。 - Winny

13

在这个线程之后,Emacs 增加了两个新的命令:

  1. make-empty-file
  2. dired-create-empty-file

这些命令将在 Emacs 27.1 发布版本中提供。


1
这就是 make-empty-file 使用的方法来创建空文件的:(write-region "" nil filename nil 0) - Hubisan
许多年前,Emacs的“新文件”选项卡只是这样做的:打开一个窗口,不需要文件名。很“好”,他们以某种方式回到了这种(更好!在我看来)的方式。 - Michael

12

如果Emacs认为文本内容没有变化,它将不允许你保存缓冲区。最快的方法是使用C-x C-f打开文件,然后按下空格和退格键,这样就能够保存一个没有任何内容的文件。尽管这种方法可能不是最干净的。

还有其他改变“缓冲区已被修改”标志的方法,但我认为没有更简单的方法了。


12
这是的一种改编版本。它的功能与原版相同,因此除了普通文件名外,您还可以为文件指定新的父目录(在当前目录下创建)(例如)。
(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))))))

3
虽然我已经在代码中指定了一个用户保留的绑定,但实际上我将其绑定到了下划线(_),在我的键盘布局中,它是跟加号(+)旁边的Shift组合键,这意味着在dired中,“新建目录”和“新建文件”的按键紧挨在一起。 - phils
我已将此更改为答案,因为这是我长期使用的答案。 - Singletoned

6
使用touch命令。
M-! touch __init__.py RET

5

最简单的方法

通过shell操作创建一个空文件(但不打开它):

M-! > __init__.py RET

打开新文件:

C-x C-f RET

(注意:我们不必再次输入文件名,因为新文件自动成为第一选择)


这相当聪明,而且肯定比使用touch来得短。虽然我正在使用的解决方案是@phils,它只是_后跟__init__.py - Singletoned

3
如果您已经打开了空文件,

(shell-command (concat "touch " (buffer-file-name)))

可以完成您想要的操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接