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 en dired et d’append un fichier __init__.py vide dans le répertoire.

Si j’utilise Cx Cf __init__.py RET Cx Cs alors emacs ne crée pas le fichier car aucune modification n’a été apscope. Je devrais taper le fichier, l’enregistrer, supprimer ma saisie et l’enregistrer à nouveau pour que cela fonctionne.

Merci

Voici une adaptation de dired-create-directory . Cela fonctionne de la même manière, aussi bien qu’un nom de fichier simple, vous pouvez également spécifier de nouveaux répertoires parents (à créer sous le répertoire actuel) pour le fichier (par exemple, foo/bar/filename ).

 (eval-after-load 'dired '(progn (define-key dired-mode-map (kbd "Cc 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 œuvres suivantes:

  Cx b __init__.py RET Cx Cw RET 

Si vous êtes dans un tampon dired, le fichier sera enregistré dans le répertoire show here.

L’astuce consiste à créer d’abord un tampon vide en basculant vers un nom qui n’existe pas. Ensuite, écrivez le fichier.

Si vous voulez qu’Emacs traite tous les nouveaux fichiers comme 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 sauf s’il pense que le contenu a changé. Le plus rapide, même si ce n’est peut-être pas le plus propre, est d’ouvrir le fichier en utilisant Cx Cf , puis d’appuyer sur (disons) l’espace et le retour arrière pour pouvoir enregistrer un fichier sans contenu.

Il y a d’autres façons de changer le drapeau “tampon a été modifié”, mais je ne pense pas qu’il soit plus facile.

Par programme et sans aucune dépendance au touch , c’est assez facile:

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

Utilisez la commande tactile.

 M-! touch __init__.py RET 

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.

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

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

Après cette discussion, 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.

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

 M-; ; Eval (set-buffer-modified-p t) ; Mark modified Cx Cs ; Save buffer 

J’utilise le suivant lié à t en dired.

 (defun my-dired-touch (filename) (interactive (list (read-ssortingng "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 créé une fonction personnalisée avec un raccourci clavier:

 ; create empty __init__.py at the place (defun create-empty-init-py() (interactive) (shell-command "touch __init__.py") ) (global-set-key (kbd "Cc pi") 'create-empty-init-py) 

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

La meilleure option serait:

 (with-temp-file "filename" (insert ""))