Comment créer un fichier vide dans emacs?
Comment puis-je créer un fichier vide à partir d'emacs, idéalement dans un dired tampon?
Par exemple, je viens d'ouvrir un module Python en mode dired, a créé un nouveau répertoire, ouvert que dans dired, et maintenant besoin d'ajouter un vide __init__.py
fichier dans le répertoire.
si j'utilise C-x C-f __init__.py RET C-x C-s
alors emacs ne crée pas le fichier car aucun changement n'y a été apporté. J'aurais le type du fichier, enregistrer, supprimer mon tapant puis de l'enregistrer de nouveau pour que cela fonctionne.
Merci
15 réponses
voici une adaptation de dired-create-directory
. Il fonctionne de la même manière, de sorte qu'en plus d'un nom de fichier simple, vous pouvez également spécifier de nouveaux répertoires parent (à créer sous le répertoire courant) 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 touch:
M-! touch __init__.py RET
les œuvres suivantes:
C-x b __init__.py RET C-x C-w RET
si vous êtes dans un buffer dirigé, le fichier sera sauvegardé dans le répertoire afficher ici.
le truc est d'abord de créer un tampon vide en passant à un nom qui n'existe pas. Ensuite, écrivez le fichier.
si vous voulez Qu'Emacs traite tous les nouveaux fichiers modifiés, vous pouvez automatiser la solution comme ceci:
(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 ne pense que le contenu a changé. Le plus rapide, mais peut-être pas le plus propre est d'ouvrir le fichier en utilisant C-x c-f , puis appuyez sur (say) space et backspace, alors vous devriez être en mesure d'enregistrer un fichier sans contenu.
il y a d'autres façons de changer le drapeau" buffer has been modified", mais je ne pense pas que ce soit plus facile.
par programmation et sans aucune dépendance sur touch
, c'est assez facile:
(with-temp-buffer (write-file "path/to/empty/file/"))
utilisez la commande touch.
M-! touch __init__.py RET
(shell-command (concat "touch " (buffer-file-name)))
fera ce que vous voulez, si vous avez déjà ouvert le fichier vide.
en plus des autres réponses sur la page, vous pouvez utiliser f.el
'S fonction f-touch
:
M-: (f-touch "__init__.py")
RET
après ce thread, Emacs a ajouté deux nouvelles commandes:
- font-vide-fichier
- dired-créer-vide-fichier
ces commandes seront disponibles dans la version 27.1 d'emacs.
vous pouvez marquer un tampon vide tel que modifié en lançant set-buffer-modified-p
. Ensuite, quand vous le sauvegarderez, Emacs écrira le fichier.
M-; ; Eval
(set-buffer-modified-p t) ; Mark modified
C-x C-s ; Save buffer
j'utilise le lien suivant à 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))
j'ai modifié la réponse de MrBones et j'ai créé une fonction sur mesure avec la reliure:
; 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)
C'est très utile pour ne pas passer du temps sur l'action récurrente de créer init .py everywhere in new Python project folder.
la meilleure option serait:
(with-temp-file "filename"
(insert ""))