Zapisz bieżący plik pod nieco inną nazwą

17

Moje pliki mają długie nazwy plików, a część nazwy pliku to data i numer wersji. Często chciałbym zapisać plik w buforze pod prawie taką samą nazwą, wystarczy zmienić numer wersji lub datę.

Byłoby to o wiele łatwiejsze, gdybym miał polecenie, które umieszcza nazwę bieżącego bufora w pierścieniu zabijania, dzięki czemu mogę otworzyć plik, a następnie wpisać C-x C-w(zapisać plik), podciągnąć bieżącą nazwę za pomocą Cy, zmienić ją i zapisać to.

Używam Emacsa 24.3 w systemie Windows i 24.4 w systemie Linux. Muszę używać różnych nazw plików i nie używać git z różnych powodów. Byłbym szczęśliwy, gdyby to polecenie działało z AUCTeX / LaTeX jako głównym trybem.


Edycja 1:

Popełniłem błąd: nie chcę pisać C-x C-f(= znaleźć plik), ale C-x C-w(= pisać plik). Poprawiłem to powyżej.

Edycja 2:

Znaleziono duplikat pytania i odpowiedzi: /unix//a/45381 Ale nie ma lepszej odpowiedzi!

Edycja 3:

Tutaj: http://www.gnu.org/software/emacs/manual/html_node/elisp/File-Name-Components.html to funkcja, która wybiera „nienazwaną” część nazwy pliku:

Funkcja: nazwa-pliku-niekatalogowy plik

This function returns the nondirectory part of filename.

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

Gdybym tylko znał seplenienie ...

Dawka Keksa
źródło
Och, cześć, Keks :) Właściwie to zastanawiałem się wiele razy ... dobre pytanie. A Lisp jest łatwy ......
Sean Allred
Właśnie znalazłem to pytanie ... Z ciekawości: czy doradca / współautor „różnych powodów”…?
mbork,
1
@mork Jestem prawnikiem i piszę listy oraz umowy. Otwarcie nowego listu do kogoś, zmiana nazwy, zwiększenie zawartości i rozpoczęcie pisania nowego listu do tej samej osoby jest szybsze niż rozpoczęcie od zera. Ale jeśli chodzi o zmiany nazw umów, to kiepski zamiennik CVS, ale nigdy nie spotkałem innego prawnika, który używa LaTeXa i Gita, więc muszę nadać nowej wersji umowy nową nazwę pliku ...
Keks Dose
Słusznie. Co z YASnippet? Wydaje się, że bardzo dobrze pasuje do twojego przypadku użycia.
mbork,
@mbork Tak, do moich szablonów używam YASnippets od lat. LaTeX, Emacs, orgmode, YASnippets sprawiają, że mój komputer jest znacznie bardziej niezawodny niż Word i Outlook. OK, piszę to na komputerze z systemem Linux, ale tak naprawdę nie można oczekiwać od zwykłego działu pomocy technicznej: obsługi Linuksa zamiast Windowsa.
Keks Dose

Odpowiedzi:

24

Nie trzeba tego wszystkiego robić.

Po prostu:

  1. Wciąż w oryginalnym pliku naciśnij C-x C-w. Zostaniesz poproszony o podanie nowej nazwy pliku.
  2. Naciśnij M-n, a obecna nazwa pliku zostanie wstawiona dla Ciebie.
  3. Edytuj, co chcesz i naciśnij, RETaby zapisać plik pod tą nową nazwą.

Nadal będziesz mieć oryginalny plik. Jeśli chcesz wrócić do niego, po prostu odwiedź go ponownie za pomocą C-x C-f.

Malabarba
źródło
Zajrzałem do instrukcji Emacsa na temat plików / zapisywania, ale nie znalazłem tej sztuczki. Jak się dowiedziałeś? Świetny!
Keks Dose
4
Niepewny. Jest to ogólna rzecz dotycząca podpowiedzi minibuforów. Uderzenie Mp przechodzi przez historię, a trafienie Mn daje „aktualną” opcję.
Malabarba
5
Jeśli używasz ido, zrób C-fnajpierw, a potem M-n.
Kaushal Modi
1
Wow, nigdy tego nie wiedziałem. Dzięki! (Przepraszam za komentarz „dziękuję, ja też”, ale jest to świetny przykład nauczenia się czegoś prostego, ale przydatnego. Viva la emacs.stackexchange!
Mark Aufflick
3

Kopiowanie nazwy pliku w bieżącym buforze

Oto funkcja, której używam z bloga Camerona Desautelsa, która kopiuje nazwę bieżącego pliku bufora i wyświetla go w minibuforze.

 
;; Źródło: http://camdez.com/blog/2013/11/14/emacs-show-buffer-file-name/
(defun show-copy-buffer-file-name-) ()
  „Pokaż pełną ścieżkę do bieżącego pliku w minibuforze, a także skopiuj go do pierścienia zabijania”.
  (interaktywny)
  (let ((nazwa-pliku (nazwa-pliku-bufora)))
    (jeśli nazwa pliku
        (progn
          (nazwa pliku wiadomości)
          (kill-new file-name))
      (błąd „Bufor nie odwiedza pliku”))))

Zmiana nazwy pliku w bieżącym buforze

Magnar Sveen zaimplementował poniższą funkcję na jednym ze swoich blogów, która wygodnie zmienia nazwę bieżącego bufora za jednym razem. Nie o to prosiłeś, ale pomyślałem, że może to być związane z twoim przypadkiem użycia.

;; Źródło: http://www.whattheemacsd.com/
(defun rename-current-buffer-file ()
  „Zmienia nazwę bieżącego bufora i pliku, który odwiedza”.
  (interaktywny)
  (let ((nazwa (nazwa bufora))
        (nazwa pliku (nazwa-pliku-bufora)))
    (if (nie (i nazwa pliku (plik-istnieje-p nazwa pliku)))
        (błąd „Nazwa bufora '% s' nie odwiedza pliku!”)
      (let ((new-name (read-file-name "New name:" filename)))
        (if (get-buffer new-name)
            (błąd „Bufor o nazwie„% s ”już istnieje!” nowa nazwa)
          (zmień nazwę pliku nazwa_pliku nowa-nazwa 1)
          (rename-buffer new-name)
          (set-visit-file-name nowa-nazwa)
          (set-buffer-zmodyfikowany-p zero)
          (komunikat „Plik”% s ”został zmieniony na„% s ”.”
                   nazwa (nazwa-pliku-brak nowego katalogu)))))))
Kaushal Modi
źródło
Rozwiązanie Magnar Sveen usuwa oryginalny plik, a plik zostanie zmieniony dopiero później. Jest to przydatne, ale muszę zachować zarówno stary plik, jak i plik o zmienionej nazwie. Funkcja Cameron Desautel kopiuje nazwę pliku z całą ścieżką. Jest to dość zbliżone do rozwiązania, którego potrzebuję. Czy wiesz, jak zmienić tę funkcję, aby wylewała tylko nazwę pliku bez ścieżki? Jednak bardzo dziękuję.
Keks Dose
1
@ KeksDose wystarczy zmienić (buffer-file-name)na (file-name-nondirectory (buffer-file-name))w pierwszej funkcji, aby uzyskać katalog sans z nazwą pliku.
nispio