2010-04-07 121 views
56

如何从emacs中创建一个空文件,理想情况下是从dired缓冲区中创建一个空文件?如何在emacs中创建空文件?

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

如果我使用C-x C-f __init__.py RET C-x C-s,那么emacs不会创建该文件,因为没有对其进行更改。我将不得不输入文件,保存它,删除我的输入,然后再保存它以便工作。除非它认为的内容发生了变化

M-! touch __init__.py RET 
+3

我生活在这种僵局:Emacs是一个功能强大的文本编辑器,甚至可以整合Scala编译器,等等等等......但很多时候很简单的事情是过于复杂。我发现在Emacs中比“尝试在Emacs中创建一个新文件更容易”touch/path/to/filename“,特别是当有另一个具有相同名称或相似名称的文件时。 Emacs“试图帮助我”打开错误的文件。请不要“试图帮助我!”...只是做我告诉你应该做的事!我很确定必须有一个“插件”(也许直接)这样做。过于复杂的!再次! – 2015-06-25 10:03:47

+0

@RichardGomes现在使用phils的解决方案已经有好几年了,我发现只需键入“_”并且要求我输入文件名就简单多了。 Emacs绝对是非常复杂的,但我认为它并不复杂。我在过去5年中所做的大部分工作都是为了让它变得更加复杂,同时也削减了所有那些烦人的角落。我完成的任务与您完全相同,但如果您可能花费几年的时间来了解系统,那么它是可以修复的。 – Singletoned 2015-06-26 10:24:28

+1

'C-x C-f __init__.py RET C-x C-s'对我来说很好(版本'24.5.1'),所以也许这个问题已经被解决了,因为这个问题最初被问到。 – Jian 2015-07-16 06:17:46

回答

9

这是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)))))) 
+3

尽管我已经在代码中指定了一个用户保留的绑定,但我实际上已将它绑定到'_',它在我的键盘布局上是'+'旁边的移位序列,这意味着“新目录”和“新文件“在dired中紧挨着。 – phils 2014-03-18 11:13:28

+0

我改变了这个答案,因为它是我长期使用的答案。 – Singletoned 2015-01-12 15:50:25

52

您可以使用触摸命令。最快但可能不清洁的是使用C-x C-f打开文件,然后按(说)空格和退格键,然后您应该可以保存没有内容的文件。

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

+1

@ offby1,如果你添加一个合适的答案,我会选择它,因为这是最适合我的那个。它甚至使用dired所在的目录作为cwd。 – Singletoned 2010-04-07 16:08:27

+1

我也非常喜欢!我只是不喜欢打M-!位,但我想我可以改变键盘绑定:) – Vivi 2010-06-08 15:02:20

11

Emacs会不会让您保存一个缓冲区:

感谢

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

我喜欢这个,我想我可能会设置它,因为它在一般情况下似乎更加安慰,但是'M-!触摸__init __。py'更短,不涉及打开和关闭缓冲区。 – Singletoned 2010-04-07 16:15:55

+0

刚刚使用过这个,谢谢! :) – Josh 2011-04-13 14:36:08

+0

@Singletoned - 你不必每次都进入。只需将它放在init文件中,每次用'C-x C-f'创建一个新文件时,它都会显示在dired中。这比每次输入shell命令('touch')更快。 – metakermit 2013-12-03 13:45:47

26

以下工作:

C-x b __init__.py RET C-x C-w RET

如果你在一个dired缓冲文件将保存在show here目录中。

诀窍是首先通过切换到一个不存在的名称来创建一个空缓冲区。然后写出文件。

+0

这种方法非常棒,因为它创建了一个新文件,并警告它是否已经存在,并在打开的缓冲区中以新文件结束。这匹配了我99%的用例。 – 2014-03-25 17:49:56

2

(shell-command (concat "touch " (buffer-file-name)))会做你想做的,如果你已经打开空文件。

5

使用触摸命令。

M-! touch __init__.py RET 
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无处不在创建初始化的.py的作用项目文件夹。

1

您可以通过运行set-buffer-modified-p将空缓冲区标记为修改状态。然后当你保存它时,Emacs将写入该文件。

M-;       ; Eval 
(set-buffer-modified-p t) ; Mark modified 
C-x C-s      ; Save buffer 
2

除了页面上的其他答案,你可以使用f.el的功能f-touch

M-:上touch(f-touch "__init__.py")RET

8

编程方式,没有任何依赖性,这很容易:

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

这是AFAIC,是正确的答案 – yPhil 2017-07-17 19:34:03

0

的最好的办法是:

(with-temp-file "filename" 
    (insert "")) 
4

的捷径

M-!> __init__.pyRET

+0

这非常聪明,绝对比使用触摸更短。虽然我使用的解决方案是@ phils,它使得它只是'_',后面跟着'__init __。py'。 – Singletoned 2016-12-02 08:23:37

0

我用下面绑定到t在dired。

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