Enregistrer le fichier actuel avec un nom légèrement différent

17

Mes fichiers ont des noms de fichiers longs et une partie du nom de fichier est une date et un numéro de version. Souvent, j'aimerais enregistrer le fichier dans le tampon en utilisant presque le même nom, il suffit de changer le numéro de version ou la date.

Ce serait beaucoup plus facile, si j'avais une commande qui met le nom de fichier du tampon actuel dans le kill ring, afin que je puisse ouvrir un fichier, puis taper C-x C-w(écrire un fichier), taper le nom actuel avec Cy, le changer et enregistrer il.

J'utilise Emacs 24.3 sous Windows et 24.4 sous Linux. Je dois utiliser des noms de fichiers différents et non git pour diverses raisons. Je serais heureux si cette commande fonctionnait avec AUCTeX / LaTeX comme mode principal.


Modifier 1:

J'ai fait une erreur: je ne veux pas taper C-x C-f(= trouver le fichier), mais C-x C-w(= écrire le fichier). J'ai corrigé cela ci-dessus.

Modifier 2:

Trouvé une question et une réponse en double: /unix//a/45381 Mais il n'y a pas de meilleure réponse!

Modifier 3:

Ici: http://www.gnu.org/software/emacs/manual/html_node/elisp/File-Name-Components.html est une fonction qui sélectionne la partie "non-répertoire" du nom de fichier:

Fonction: nom-fichier-non-répertoire nom de fichier

This function returns the nondirectory part of filename.

          (file-name-nondirectory "lewis/foo")
               ⇒ "foo"
          (file-name-nondirectory "foo")
               ⇒ "foo"
          (file-name-nondirectory "lewis/")
               ⇒ ""

Si seulement je connaissais le lisp ...

Dose de clés
la source
Oh, bonjour Keks :) Je me suis déjà demandé ça plusieurs fois ... bonne question. Et Lisp est facile ......
Sean Allred
Je viens de trouver cette question ... Par curiosité: les "raisons diverses" sont-elles liées au conseiller / co-auteur ...?
mbork
1
@mbork Je suis avocat et j'écris des lettres ainsi que des contrats. Ouvrir une lettre récente à quelqu'un, la renommer, effacer le contenu et commencer à en écrire une nouvelle à la même personne est plus rapide que de recommencer à zéro. Mais en ce qui concerne les contrats, les renommer est un mauvais substitut pour un CV, mais je n'ai jamais rencontré un autre avocat qui utilise LaTeX et Git, donc je dois donner à une nouvelle version d'un contrat un nouveau nom de fichier ...
Keks Dose
C'est suffisant. Et YASnippet? Il semble très bien adapté à votre cas d'utilisation.
mbork
@mbork Oui, pour mes modèles j'utilise YASnippets depuis des années. LaTeX, Emacs, orgmode, YASnippets rendent mon PC beaucoup plus fiable que Word et Outlook. OK, j'écris ceci sur une machine Linux, mais c'est quelque chose que vous ne pouvez vraiment pas attendre du service d'assistance informatique habituel: prendre en charge Linux au lieu de Windows.
Keks Dose du

Réponses:

23

Il n'est pas nécessaire de faire tout cela.

Simplement:

  1. Toujours dans le fichier d'origine, appuyez sur C-x C-w. Vous serez invité à entrer un nouveau nom de fichier.
  2. Cliquez sur M-net le nom de fichier actuel sera inséré pour vous.
  3. Modifiez ce que vous voulez et appuyez sur RETpour enregistrer le fichier sous ce nouveau nom.

Vous aurez toujours le fichier d'origine. Si vous voulez y revenir, visitez-le à nouveau avec C-x C-f.

Malabarba
la source
J'ai jeté un œil au manuel d'Emacs sur Fichiers / Enregistrement, mais je n'ai pas trouvé cette astuce. Comment avez-vous trouvé? Génial!
Keks Dose du
4
Pas certain. C'est une chose générale à propos des invites de mini-tampon. Frapper Mp passe par l'histoire, et frapper Mn vous donne l'option "actuelle".
Malabarba
5
Si vous utilisez ido, faites d' C-fabord et ensuite M-n.
Kaushal Modi
1
Wow, je ne l'ai jamais su. Merci! (Désolé pour le commentaire «merci, moi aussi», mais c'est un excellent exemple d'apprentissage de quelque chose de simple mais utile. Viva la emacs.stackexchange!
Mark Aufflick
3

Copie du nom du fichier dans le tampon courant

Voici une fonction que j'utilise du blog de Cameron Desautels qui copie le nom du fichier tampon actuel et l'affiche dans le mini-tampon.

 
;; Source: http://camdez.com/blog/2013/11/14/emacs-show-buffer-file-name/
(defun show-copy-buffer-file-name ()
  "Montrez le chemin complet du fichier actuel dans le mini-tampon et copiez-le également dans le kill-ring."
  (interactif)
  (let ((nom-fichier (nom-fichier-tampon))))
    (si nom-fichier
        (progn
          (nom de fichier du message)
          (kill-nouveau nom de fichier))
      (erreur "Buffer ne visitant pas un fichier")))))

Renommer le nom du fichier dans le tampon actuel

Magnar Sveen a implémenté la fonction ci-dessous dans l' un de ses blogs qui renomme facilement le tampon actuel en une seule fois. Ce n'est pas ce que vous avez demandé mais j'ai pensé que cela pouvait être lié à votre cas d'utilisation.

;; Source: http://www.whattheemacsd.com/
(defun rename-current-buffer-file ()
  "Renomme le tampon actuel et le fichier qu'il visite."
  (interactif)
  (let ((nom (nom-tampon))
        (nom de fichier (nom-fichier-tampon)))
    (si (pas (et nom de fichier (fichier-existe-p nom de fichier))))
        (erreur "Le tampon '% s' ne visite pas un fichier!" nom)
      (let ((new-name (read-file-name "New name:" filename))))
        (if (get-buffer new-name)
            (erreur "Un tampon nommé '% s' existe déjà!" nouveau-nom)
          (rename-file nom de fichier nouveau-nom 1)
          (nouveau nom du tampon de renommage)
          (nom-de-fichier-ensemble-nouveau-nom)
          (set-buffer-modified-p nil)
          (message "Le fichier '% s' a été renommé avec succès en '% s'."
                   nom (nom-fichier-non-répertoire nouveau-nom)))))))
Kaushal Modi
la source
La solution de Magnar Sveen supprime le fichier d'origine et il n'y aura que le fichier renommé par la suite. C'est utile, mais j'ai besoin de conserver l'ancien fichier ainsi que celui renommé. La fonction de Cameron Desautel copie le nom de fichier avec le chemin complet. C'est assez proche de la solution dont j'ai besoin. Savez-vous comment modifier cette fonction, afin qu'elle ne répande que le nom de fichier sans le chemin? Merci beaucoup.
Keks Dose
1
@KeksDose change juste (buffer-file-name)en (file-name-nondirectory (buffer-file-name))dans la première fonction pour obtenir le nom de fichier sans répertoire.
nispio