2010-04-07 117 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))