Aktuelle Datei unter einem etwas anderen Namen speichern

17

Meine Dateien haben lange Dateinamen und ein Teil des Dateinamens ist ein Datum und eine Versionsnummer. Oft möchte ich die Datei unter fast gleichem Namen im Puffer speichern , einfach Versionsnummer oder Datum ändern.

Dies wäre viel einfacher, wenn ich einen Befehl hätte, der den Dateinamen des aktuellen Puffers in den Kill-Ring legt, damit ich eine Datei öffnen kann, dann C-x C-wtippe (schreibe Datei), ziehe den aktuellen Namen mit Cy, ändere ihn und speichere es.

Ich verwende Emacs 24.3 unter Windows und 24.4 unter Linux. Ich muss aus verschiedenen Gründen unterschiedliche Dateinamen und keine git verwenden. Ich würde mich freuen, wenn dieser Befehl mit AUCTeX / LaTeX als Hauptmodus funktioniert.


Bearbeiten 1:

Ich habe einen Fehler gemacht: Ich möchte nicht tippen C-x C-f(= Datei suchen), sondern C-x C-w(= Datei schreiben). Ich habe das oben korrigiert.

Bearbeiten 2:

Du hast eine doppelte Frage und Antwort gefunden: /unix//a/45381 Aber es gibt keine bessere Antwort!

Edit 3:

Hier: http://www.gnu.org/software/emacs/manual/html_node/elisp/File-Name-Components.html ist eine Funktion, die den "Nicht-Verzeichnis" -Teil des Dateinamens auswählt:

Funktion: Dateiname-Nicht-Verzeichnis-Dateiname

This function returns the nondirectory part of filename.

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

Wenn ich nur lisp wüsste ...

Keks Dosis
quelle
Oh, hallo da, Keks :) Ich habe mich das schon oft gefragt ... gute Frage. Und Lisp ist einfach ......
Sean Allred
Gerade diese Frage gefunden ... Aus Neugier: Sind "verschiedene Gründe" Berater / Co-Autor im Zusammenhang ...?
mbork
1
@mbork Ich bin Rechtsanwalt und schreibe Briefe sowie Verträge. Das Öffnen eines neuen Briefes an jemanden, das Umbenennen, das Löschen des Inhalts und das Schreiben eines neuen Briefes an dieselbe Person ist schneller als von vorne. Aber was die Umbenennung von Verträgen betrifft, ist dies ein schlechter Ersatz für einen Lebenslauf, aber ich habe noch nie einen anderen Anwalt getroffen, der LaTeX und Git verwendet. Daher muss ich einer neuen Version eines Vertrages einen neuen Dateinamen geben ...
Keks Dose
Meinetwegen. Was ist mit YASnippet? Es scheint sehr gut für Ihren Anwendungsfall geeignet zu sein.
mbork
@mbork Ja, für meine Templates verwende ich seit Jahren YASnippets. LaTeX, Emacs, orgmode, YASnippets machen meinen PC viel zuverlässiger als Word und Outlook. OK, ich schreibe dies auf einem Linux-Computer, aber das können Sie vom üblichen IT-Helpdesk wirklich nicht erwarten: Linux statt Windows zu unterstützen.
Keks Dosis

Antworten:

23

Es ist nicht nötig, das alles zu tun.

Einfach:

  1. Noch in der Originaldatei, drücken Sie C-x C-w. Sie werden aufgefordert, einen neuen Dateinamen einzugeben.
  2. Wenn Sie auf M-ndrücken, wird der aktuelle Dateiname für Sie eingefügt.
  3. Bearbeiten Sie, was Sie möchten, und drücken Sie RET, um die Datei unter diesem neuen Namen zu speichern.

Sie haben immer noch die Originaldatei. Wenn Sie darauf zurückkommen möchten, besuchen Sie es einfach erneut mit C-x C-f.

Malabarba
quelle
Ich habe mir das Emacs-Handbuch über Dateien / Speichern angesehen, aber diesen Trick nicht gefunden. Wie hast du das herausgefunden? Groß!
Keks Dosis
4
Nicht sicher. Es ist eine allgemeine Sache über Minipuffer-Eingabeaufforderungen. Das Drücken von Mp geht durch den Verlauf und das Drücken von Mn gibt Ihnen die "aktuelle" Option.
Malabarba
5
Wenn Sie verwenden ido, tun Sie C-fzuerst und dann M-n.
Kaushal Modi
1
Wow, das habe ich nie gewusst. Vielen Dank! (Entschuldigung für den Kommentar "Danke, ich auch", aber dies ist ein großartiges Beispiel für das Erlernen von etwas Einfachem, aber Nützlichem. Viva la emacs.stackexchange!
Mark Aufflick
3

Kopieren des Dateinamens in den aktuellen Puffer

Hier ist eine Funktion, die ich aus dem Blog von Cameron Desautels verwende und die den aktuellen Namen der Pufferdatei kopiert und im Minipuffer anzeigt.

 
;; Quelle: http://camdez.com/blog/2013/11/14/emacs-show-buffer-file-name/
(defun show-copy-buffer-file-name ()
  Msgstr "Zeige den vollständigen Pfad zu der aktuellen Datei im Minipuffer und kopiere sie auch in den Killring."
  (interaktiv)
  (let ((Dateiname (Puffer-Dateiname)))
    (wenn Dateiname
        (progn
          (Name der Nachrichtendatei)
          (kill-neuer Dateiname)
      (Fehler "Puffer besucht keine Datei"))))

Umbenennen des Dateinamens im aktuellen Puffer

Magnar Sveen hat die folgende Funktion in einem seiner Blogs implementiert, die den aktuellen Puffer bequem auf einmal umbenennt. Dies ist nicht das, wonach Sie gefragt haben, aber ich dachte, es könnte mit Ihrem Anwendungsfall zusammenhängen.

;; Quelle: http://www.whattheemacsd.com/
(defun rename-current-buffer-file ()
  "Benennt den aktuellen Puffer und die besuchte Datei um."
  (interaktiv)
  (let ((name (puffername))
        (Dateiname (Name der Pufferdatei)))
    (if (not (und filename (datei-existiert-p filename)))
        (Fehler "Puffer '% s' besucht keine Datei!")
      (let ((neuer Name (Name der gelesenen Datei "Neuer Name:" Dateiname)))
        (if (get-buffer new-name)
            (Fehler "Ein Puffer mit dem Namen '% s' existiert bereits!" neuer Name)
          (Datei umbenennen Dateiname neuer Name 1)
          (Umbenennungspuffer neuer Name)
          (set-visited-file-name new-name)
          (set-buffer-modified-p nil)
          (Meldung "Datei '% s' wurde erfolgreich in '% s' umbenannt."
                   name (dateiname-nicht-verzeichnis neuer-name))))))
Kaushal Modi
quelle
Die Lösung von Magnar Sveen löscht die Originaldatei und es wird nur die umbenannte Datei hinterher angezeigt. Das ist nützlich, aber ich muss die alte und die umbenannte Datei behalten. Die Funktion von Cameron Desautel kopiert den Dateinamen mit dem gesamten Pfad. Dies ist ziemlich nah an der Lösung, die ich brauche. Wissen Sie, wie Sie diese Funktion so ändern, dass nur der Dateiname ohne Pfad ausgegeben wird? Vielen Dank jedoch.
Keks Dosis
1
Ändern @KeksDose nur (buffer-file-name)zu (file-name-nondirectory (buffer-file-name))in der ersten Funktion Dateinamen sans Verzeichnis.
Nispio