74 votes

Comment créer un fichier vide dans emacs ?

Comment puis-je créer un fichier vide à partir d'emacs, idéalement à l'intérieur d'un tampon ditd ?

Par exemple, je viens d'ouvrir un module Python en mode dired, j'ai créé un nouveau répertoire, je l'ai ouvert en mode dired, et je dois maintenant ajouter un fichier vide __init__.py 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 aucune modification n'a été apportée. Il faudrait que je tape dans le fichier, que je l'enregistre, que j'efface ma saisie et que je l'enregistre à nouveau pour que cela fonctionne.

Merci

9 votes

Je vis avec cette impasse : Emacs est un éditeur de texte puissant qui peut même intégrer un compilateur Scala, etc, etc ... mais souvent des choses très simples sont trop compliquées. Je trouve plus facile de "toucher /chemin/vers/nom du fichier" et de l'ouvrir plus tard dans Emacs que d'essayer de créer un nouveau fichier dans Emacs, en particulier quand il y a un autre fichier avec le même nom ou même un nom similaire. Emacs "essaie de m'aider" en ouvrant le mauvais fichier. S'il vous plaît, n'essayez pas de "m'aider"... faites simplement ce que je vous ai dit qu'il fallait faire ! Je suis presque sûr qu'il doit y avoir un "plugin" (peut-être ditd) qui fait ça. Encore une fois, c'est trop compliqué !

1 votes

@RichardGomes Ayant utilisé la solution de phils depuis quelques années maintenant, je trouve qu'il est beaucoup plus facile de simplement taper "_" et il me demande un nom de fichier. Emacs est certainement très compliqué, mais je ne pense pas qu'il soit trop compliqué. Une grande partie de ce que j'ai fait au cours des 5 dernières années a été de le rendre plus compliqué, ainsi que de raser tous ces coins ennuyeux. J'ai souffert exactement du même problème que vous avec l'achèvement, mais il peut être résolu si vous prenez la peine de passer quelques années à apprendre à connaître le système.

1 votes

C-x C-f __init__.py RET C-x C-s fonctionne bien pour moi (version 24.5.1 ), donc peut-être le problème a-t-il été résolu depuis que cette question a été posée.

62voto

Dani Points 7744

Vous pouvez utiliser la commande tactile :

M-! touch __init__.py RET

1 votes

@offby1, si vous ajoutez cela comme une réponse appropriée, je la choisirai, car c'est celle qui fonctionne le mieux pour moi. Elle utilise même le répertoire dans lequel se trouve Dired comme cwd.

1 votes

J'aime beaucoup ça, aussi ! C'est juste que je n'aime pas taper la partie M- !, mais je pense que je peux changer la combinaison de touches :)

30voto

slu Points 642

Les travaux suivants :

C-x b \_\_init\_\_.py RET C-x C-w RET

Si vous êtes dans une mémoire tampon directe, le fichier sera enregistré dans le répertoire indiqué ici.

L'astuce consiste à créer d'abord un tampon vide en passant à un nom qui n'existe pas. Ensuite, on écrit le fichier.

1 votes

Cette méthode est excellente car elle crée un nouveau fichier, prévient s'il existe déjà et se termine avec le nouveau fichier dans un tampon ouvert. Cela correspond à 99 % de mes cas d'utilisation.

0 votes

Dans ma configuration, si le nom du fichier correspond à un autre dans l'historique de sa mémoire tampon, alors C-x b ouvrira ce fichier au lieu du nouveau. C'est pratique, sauf dans les cas où vous voulez créer un nouveau fichier, ou si vous en avez plusieurs qui ont le même nom ( init .py serait l'un de ceux-là).

20voto

Kilian Foth Points 8619

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

0 votes

J'aime bien cela, et je pense que je vais probablement l'établir de toute façon, parce que cela semble plus sain dans le cas général, mais les M-! touch __init__.py est plus courte et n'implique pas l'ouverture et la fermeture d'un tampon.

0 votes

@Singletoned - vous n'avez pas besoin d'entrer ceci à chaque fois. Mettez-le simplement dans votre fichier init et chaque fois que vous créez un nouveau fichier avec C-x C-f il apparaitra dans dired. C'est plus rapide que de taper une commande shell ( touch ) à chaque fois.

12voto

Vatine Points 8884

Emacs ne vous permettra pas de sauvegarder un tampon à moins qu'il ne pense que son 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 (disons) l'espace et le retour arrière, alors vous devriez être en mesure d'enregistrer un fichier sans contenu.

Il existe d'autres moyens de modifier l'indicateur "le tampon a été modifié", mais je ne pense pas qu'il y en ait un plus simple.

12voto

phils Points 30543

Voici une adaptation de dired-create-directory . Cela fonctionne de la même façon, donc en plus d'un nom de fichier simple, vous pouvez également spécifier de nouveaux répertoires parents (à 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))))))

3 votes

Bien que j'aie spécifié une liaison réservée à l'utilisateur dans le code, j'ai en fait lié ceci à _ qui, sur mon clavier, est la séquence décalée à côté de + ce qui signifie que les touches pour "nouveau répertoire" et "nouveau fichier" dans dired sont juste à côté l'une de l'autre.

0 votes

J'ai modifié cette réponse, car c'est celle que j'utilise à long terme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X