web-dev-qa-db-fra.com

Comment créer un fichier vide dans emacs?

Comment créer un fichier vide à partir d’emacs, idéalement à partir d’un tampon dired?

Par exemple, je viens d’ouvrir un module Python en mode dired, de créer un nouveau répertoire, de l’ouvrir dans dired et de devoir ajouter un fichier __init__.py vide dans le répertoire.

Si j'utilise C-x C-f __init__.py RET C-x C-s, emacs ne crée pas le fichier car aucune modification n'y a été apportée. Je devrais taper le fichier, le sauvegarder, supprimer ma saisie et le sauvegarder à nouveau pour que cela fonctionne.

Merci

60
Singletoned

Voici une adaptation de dired-create-directory. Il fonctionne de la même manière. Ainsi, vous pouvez également spécifier un nouveau répertoire parent (à créer dans le répertoire actuel) pour le fichier (par exemple, 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

Vous pouvez utiliser la commande tactile:

M-! touch __init__.py RET
54
Dani

Les oeuvres suivantes: 

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

Si vous êtes dans un tampon de répertoire, le fichier sera sauvegardé dans le répertoire indiqué ici.

L'astuce consiste d'abord à créer un tampon vide en basculant sur un nom qui n'existe pas. Puis écrivez le fichier.

27
slu

Si vous voulez qu'Emacs traite tous les nouveaux fichiers comme modifiés, vous pouvez automatiser la solution de la manière suivante:

(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

Emacs ne vous permettra pas de sauvegarder un tampon à moins qu’il pense que le contenu a changé. Le plus rapide, voire le moins propre, consiste à ouvrir le fichier à l’aide de C-x C-f, puis appuyez sur (par exemple) espace et retour arrière, vous devriez alors pouvoir enregistrer un fichier sans contenu.

Il existe d'autres moyens de changer l'indicateur "Le tampon a été modifié", mais je ne pense pas qu'il soit plus facile.

12
Vatine

Par programmation et sans aucune dépendance de touch, c'est très simple:

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

Utilisez la commande tactile.

M-! touch __init__.py RET
5
Uchenna Nwanyanwu

Après ce fil, Emacs a ajouté deux nouvelles commandes:

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

Ces commandes seront disponibles dans la version 27.1 d’emacs.

4
Tino

Le plus court chemin

M-! > __init__.py RET

4
thanhpk

(Shell-command (concat "touch " (buffer-file-name))) fera ce que vous voulez, si vous avez déjà ouvert le fichier vide.

3
Squidly

En plus des autres réponses sur la page, vous pouvez utiliser la fonction de f.elf-touch :

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

2
Mirzhan Irkegulov

J'utilise le suivant lié à t dans 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

Vous pouvez marquer un tampon vide comme modifié en exécutant set-buffer-modified-p . Ensuite, lorsque vous enregistrez, Emacs écrit le fichier.

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

La meilleure option serait:

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

J'ai modifié la réponse de MrBones et créé une fonction personnalisée avec le raccourci clavier:

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

Ceci est très utile pour ne pas perdre de temps sur des actions récurrentes de création de init . Py partout dans le nouveau dossier de projet Python.

0
alex_koval