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
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))))))
Vous pouvez utiliser la commande tactile:
M-! touch __init__.py RET
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.
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)))
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.
Par programmation et sans aucune dépendance de touch
, c'est très simple:
(with-temp-buffer (write-file "path/to/empty/file/"))
Utilisez la commande tactile.
M-! touch __init__.py RET
Après ce fil, Emacs a ajouté deux nouvelles commandes:
Ces commandes seront disponibles dans la version 27.1 d’emacs.
Le plus court chemin
M-! > __init__.py
RET
(Shell-command (concat "touch " (buffer-file-name)))
fera ce que vous voulez, si vous avez déjà ouvert le fichier vide.
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))
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
La meilleure option serait:
(with-temp-file "filename"
(insert ""))
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.