wake-up-neo.net

Wie erstelle ich eine leere Datei in Emacs?

Wie kann ich aus emacs eine leere Datei erstellen, am besten aus einem Zwischenspeicher?

Zum Beispiel habe ich gerade ein Python-Modul im Dired-Modus geöffnet, ein neues Verzeichnis erstellt, dieses in Dired geöffnet und muss jetzt eine leere __init__.py-Datei im Verzeichnis hinzufügen.

Wenn ich C-x C-f __init__.py RET C-x C-s verwende, erstellt emacs die Datei nicht, da keine Änderungen daran vorgenommen wurden. Ich muss die Datei eingeben, speichern, meine Eingabe löschen und sie dann erneut speichern, damit das funktioniert.

Vielen Dank

60
Singletoned

Hier ist eine Anpassung von dired-create-directory. Es funktioniert genauso, so dass Sie neben einem einfachen Dateinamen auch neue übergeordnete Verzeichnisse angeben können (die im aktuellen Verzeichnis erstellt werden sollen) für die Datei (z. B. 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))))))
10
phils

Sie können den Touch-Befehl verwenden:

M-! touch __init__.py RET
54
Dani

Die folgenden Arbeiten: 

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

Wenn Sie sich in einem Zwischenspeicher befinden, wird die Datei im hier angezeigten Verzeichnis gespeichert.

Der Trick besteht darin, zuerst einen leeren Puffer zu erstellen, indem Sie zu einem Namen wechseln, der nicht vorhanden ist. Dann schreibe die Datei aus.

27
slu

Wenn Sie möchten, dass Emacs alle neuen Dateien als modifiziert behandelt, können Sie die Lösung folgendermaßen automatisieren:

(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)))
20
Kilian Foth

In Emacs können Sie keinen Puffer speichern, es sei denn, der Inhalt hat sich geändert. Am schnellsten, wenn auch möglicherweise nicht am saubersten, öffnen Sie die Datei mit C-x C-fDrücken Sie dann die Leertaste und die Rücktaste, um eine Datei ohne Inhalt zu speichern.

Es gibt andere Möglichkeiten, das Flag "Puffer wurde geändert" zu ändern, aber ich glaube nicht, dass es einfacher ist.

12
Vatine

Programmatisch und ohne Abhängigkeit von touch ist das ganz einfach:

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

Verwenden Sie den Touch-Befehl.

M-! touch __init__.py RET
5

Nach diesem Thread hat Emacs zwei neue Befehle hinzugefügt:

  1. leere Datei erstellen
  2. dired-create-empty-file

Diese Befehle werden in der Version 27.1 von emacs verfügbar sein.

4
Tino

Der kürzeste Weg

M-! > __init__.py RET

4
thanhpk

(Shell-command (concat "touch " (buffer-file-name))) macht, was Sie wollen, wenn Sie die leere Datei bereits geöffnet haben.

3
Squidly

Zusätzlich zu anderen Antworten auf der Seite können Sie die Funktion f.el von f-touch verwenden:

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

2

Ich verwende das folgende gebunden an t in 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))
1
jenesaisquoi

Sie können einen leeren Puffer als geändert markieren, indem Sie set-buffer-modified-p ausführen. Wenn Sie es speichern, schreibt Emacs die Datei.

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

Die beste Option wäre:

(with-temp-file "filename"
  (insert ""))
0
Marcin Antczak

Ich habe die Antwort von MrBones geändert und eine benutzerdefinierte Funktion mit Tastenkombination erstellt:

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

Dies ist sehr nützlich, wenn Sie nicht ständig wiederkehrende Aktionen zum Erstellen von init . Py im neuen Python-Projektordner durchführen müssen.

0
alex_koval