Salva il file corrente con un nome leggermente diverso


17

I miei file hanno nomi di file lunghi e una parte del nome file è una data e un numero di versione. Spesso vorrei salvare il file nel buffer usando quasi lo stesso nome, basta cambiare il numero di versione o la data.

Questo sarebbe molto più semplice, se avessi un comando che inserisce il file del buffer corrente nel kill ring, in modo da poter aprire un file, quindi digitare C-x C-w(scrivere il file), strappare il nome corrente con Cy, cambiarlo e salvare esso.

Sto usando Emacs 24.3 su Windows e 24.4 su Linux. Devo usare nomi di file diversi e non git per vari motivi. Sarei felice se questo comando funzionasse con AUCTeX / LaTeX come modalità principale.


Modifica 1:

Ho fatto un errore: non voglio digitare C-x C-f(= trova file), ma C-x C-w(= scrivi file). Ho corretto questo sopra.

Modifica 2:

Hai trovato una domanda e una risposta duplicate: /unix//a/45381 Ma non esiste una risposta migliore!

Modifica 3:

Qui: http://www.gnu.org/software/emacs/manual/html_node/elisp/File-Name-Components.html è una funzione che seleziona la parte "non directory" del nome file:

Funzione: nome file non nome directory

This function returns the nondirectory part of filename.

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

Se solo sapessi lisp ...


Oh, ciao, Keks :) In realtà me lo sono chiesto molte volte anche io ... bella domanda. E Lisp è facile ......
Sean Allred,

Ho appena trovato questa domanda ... Per curiosità: i consiglieri / coautori "vari motivi" sono collegati ...?
mbork,

1
@mbork Sono un avvocato e scrivo lettere e contratti. Aprire una lettera recente a qualcuno, rinominarla, cancellare il contenuto e iniziare a scriverne una nuova per la stessa persona è più veloce che iniziare da zero. Ma per quanto riguarda i contratti che li rinominano è un cattivo sostituto di un cvs, ma non ho mai incontrato un altro avvocato che utilizza LaTeX e Git, quindi devo dare a una nuova versione di un contratto un nuovo nome di file ...
Keks Dose

Giusto. Che dire di YASnippet? Sembra molto adatto al tuo caso d'uso.
mbork,

@mbork Sì, per i miei modelli sto usando YASnippet, da anni. LaTeX, Emacs, orgmode, YASnippet rendono il mio PC molto più affidabile di Word e Outlook. OK, sto scrivendo questo su una macchina Linux, ma è qualcosa che non puoi aspettarti dal solito helpdesk IT: supportare Linux invece di Windows.
Keks Dose

Risposte:


23

Non è necessario fare tutto ciò.

Semplicemente:

  1. Ancora nel file originale, premi C-x C-w. Ti verrà richiesto un nuovo nome file.
  2. Premi M-ne il nome file corrente verrà inserito per te.
  3. Modifica ciò che vuoi e premi RETper salvare il file con questo nuovo nome.

Avrai comunque il file originale. Se vuoi tornare ad esso, basta visitarlo di nuovo con C-x C-f.


Ho dato un'occhiata al manuale di Emacs su File / Salvataggio, ma non ho trovato questo trucco. Come l'hai scoperto? Grande!
Keks Dose

4
Non sono sicuro. È una cosa generale sui prompt dei minibuffer. Colpire Mp passa attraverso la storia e colpire Mn ti dà l'opzione "corrente".
Malabarba,

5
Se stai usando ido, fallo C-fprima e poi M-n.
Kaushal Modi,

1
Wow, non l'ho mai saputo. Grazie! (Ci scusiamo per il commento "grazie, anch'io", ma questo è un ottimo esempio di apprendimento di qualcosa di semplice ma utile. Viva la emacs.stackexchange!
Mark Aufflick

3

Copia del nome del file nel buffer corrente

Ecco una funzione che uso dal blog di Cameron Desautels che copia il nome del file buffer corrente e lo visualizza nel minibuffer.

 
;; Fonte: http://camdez.com/blog/2013/11/14/emacs-show-buffer-file-name/
(defun show-copy-buffer-file-name ()
  "Mostra il percorso completo del file corrente nel minibuffer e copialo anche sul kill-ring."
  (Interattivo)
  (let ((nome-file (nome-file-buffer)))
    (se nome-file
        (progn
          (nome file messaggio)
          (kill-new nome-file))
      (errore "Buffer non visitando un file"))))

Rinominare il nome del file nel buffer corrente

Magnar Sveen ha implementato la funzione di seguito in uno dei suoi blog che rinomina comodamente il buffer corrente in una volta sola. Non è quello che hai chiesto, ma ho pensato che potesse essere correlato al tuo caso d'uso.

;; Fonte: http://www.whattheemacsd.com/
(defun rename-current-buffer-file ()
  "Rinomina il buffer corrente e il file che sta visitando."
  (Interattivo)
  (let ((name (buffer-name))
        (nome file (nome file buffer)))
    (if (not (e nome file (file-esiste-p nomefile)))
        (errore "Buffer '% s' non sta visitando un file!")
      (let ((new-name (read-file-name "Nuovo nome:" nomefile)))
        (if (get-buffer new-name)
            (errore "Un buffer chiamato '% s' esiste già!" nuovo nome)
          (rinomina file nome nuovo nome 1)
          (rinomina buffer nuovo nome)
          (set-visitato-nome-file-nome-nuovo)
          (set-buffer-modificato-p nil)
          (messaggio "File '% s' rinominato correttamente in '% s'."
                   name (nome-file-nondirectory nuovo-nome))))))))

La soluzione di Magnar Sveen elimina il file originale e successivamente il file verrà rinominato. Questo è utile, ma devo conservare sia il vecchio file che quello rinominato. La funzione di Cameron Desautel copia il nome file con l'intero percorso. Questo è abbastanza vicino alla soluzione di cui ho bisogno. Sai come modificare questa funzione, in modo che sparga solo il nome file senza il percorso? Tuttavia, grazie mille.
Keks Dose

1
@KeksDose basta passare (buffer-file-name)a (file-name-nondirectory (buffer-file-name))nella prima funzione per ottenere la directory sans del nome file.
nispio,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.