Збережіть поточний файл із трохи іншим ім’ям


17

Мої файли мають довгі імена файлів, а частина імені файлу - дата та номер версії. Часто я хотів би зберегти файл у буфері, використовуючи майже те саме ім’я, просто змінити номер версії або дату.

Це було б набагато простіше, якби у мене була команда, яка вводить ім'я поточного буфера в кільце для вбивства, щоб я міг відкрити файл, потім введіть C-x C-w(запишіть файл), вимкніть поточне ім'я з Cy, змініть його та збережіть це.

Я використовую Emacs 24.3 для Windows та 24.4 для Linux. Мені доводиться використовувати різні назви файлів, а не git з різних причин. Я був би радий, якби ця команда працювала з AUCTeX / LaTeX як основний режим.


Редагувати 1:

Я помилився: я не хочу вводити C-x C-f(= find file), але C-x C-w(= write file). Я виправив це вище.

Редагувати 2:

Знайшли повторне запитання та відповідь: /unix//a/45381 Але кращої відповіді немає!

Редагувати 3:

Тут: http://www.gnu.org/software/emacs/manual/html_node/elisp/File-Name-Components.html - це функція, яка вибирає "неопосередковану" частину назви фільму:

Функція: ім'я файлу-неіменне ім'я файлу

This function returns the nondirectory part of filename.

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

Якби я тільки знав ліс ...


О, привіт, Кекс :) ​​Я насправді сам багато разів задавався цим питанням ... гарне запитання. А Лісп легко ......
Шон Алред

Щойно знайшли це питання ... З цікавості: чи є "різні причини" порадник / співавтор ...?
mbork

1
@mbork Я юрист і пишу листи, а також договори. Відкрити недавній лист комусь, перейменувати його, стерти вміст і почати писати новий той самий чоловік швидше, ніж починати з нуля. Але щодо договорів, що перейменують їх, є поганою заміною відеокамери, але я ніколи не зустрічав іншого юриста, який використовує LaTeX і Git, тому я повинен дати новій версії договору нове ім'я файлу ...
Keks Dose

Справедливо. Що з YASnippet? Здається, він дуже добре підходить для вашого використання.
mbork

@mbork Так, для своїх шаблонів я використовую YASnippets, починаючи з років. LaTeX, Emacs, orgmode, YASnippets роблять мій ПК набагато надійнішим, ніж Word та Outlook. Гаразд, я пишу це на машині Linux, але це те, чого ви насправді не можете очікувати від звичайної ІТ-служби: для підтримки Linux замість Windows.
Кекс Доза

Відповіді:


24

Не потрібно все це робити.

Просто:

  1. Ще в оригінальному файлі натисніть C-x C-w. Вам буде запропоновано нове ім'я файлу.
  2. Натисніть M-n, і поточне ім'я файлу буде вставлено для вас.
  3. Відредагуйте потрібне і натисніть, RETщоб зберегти файл до цього нового імені.

Ви все одно будете мати оригінальний файл. Якщо ви хочете повернутися до нього, просто завітайте до нього ще раз C-x C-f.


Я ознайомився з посібником Emacs про Файли / Збереження, але цього фокусу не знайшов. Як це ви дізналися? Чудово!
Кекс Доза

4
Не впевнений. Це загальна річ щодо підказок мінібуфера. Натискання Mp проходить через історію, а натискання на Mn дає вам "поточний" варіант.
Малабарба

5
Якщо ви використовуєте ido, зробіть C-fспочатку, а потім M-n.
Каушал Моді

1
Нічого собі, я цього не знав. Спасибі! (Вибачте за коментар "спасибі, я теж", але це чудовий приклад того, щоб дізнатися щось просте, але корисне. Viva la emacs.stackexchange!
Марк Оффлік

3

Копіювання імені файлу в поточний буфер

Ось функція, яку я використовую з блогу Cameron Desautels, який копіює поточне ім'я файлу буфера та відображає його у minibuffer.

 
;; Джерело: http://camdez.com/blog/2013/11/14/emacs-show-buffer-file-name/
(вимкнути show-copy-buffer-file-name ()
  "Показати повний шлях до поточного файлу в minibuffer, а також скопіювати його у ring-ring."
  (інтерактивний)
  (нехай ((ім'я файлу (буфер-ім’я файлу)))
    (якщо ім'я файлу
        (прогн
          (ім'я файлу повідомлення)
          (вбити нове ім’я файлу))
      (помилка "Буфер не відвідує файл"))))

Перейменування імені файлу в поточний буфер

Magnar Sveen реалізував наведену нижче функцію в одному зі своїх блогів, що зручно перейменовувати поточний буфер за один раз. Про це ви не просили, але я подумав, що це може бути пов'язано з вашим випадком використання.

;; Джерело: http://www.whattheemacsd.com/
(defun rename-current-buffer-file ()
  "Перейменовує поточний буфер і файл, який він відвідує."
  (інтерактивний)
  (нехай ((ім'я (ім'я буфера))
        (ім'я файлу (буфер-ім’я файлу)))
    (якщо (ні (і ім’я файлу (ім'я файлу-існує-p)))
        (помилка "Буфер"% s "не відвідує ім'я файлу!")
      (хай ((new-name (read-file-name "New name:" name file)))
        (якщо (get-buffer new-name)
            (помилка "Буфер з назвою"% s "вже існує!"
          (перейменувати-ім'я файлу new-name 1)
          (перейменування-буфер нового імені)
          (set-visit-file-name new-name)
          (встановлений буфер-модифікований-p нуль)
          (повідомлення "Файл"% s "успішно перейменовано на"% s "."
                   ім'я (file-name-nondirectory new-name)))))))

Рішення від Magnar Sveen видаляє оригінальний файл, після чого буде лише перейменований файл. Це корисно, але мені потрібно зберегти старий файл, а також перейменований. Функція Cameron Desautel копіює ім'я файлу цілим шляхом. Це досить близько до потрібного мені рішення. Чи знаєте ви, як змінити цю функцію, щоб вона лише розсипала ім'я файлу без шляху? Однак дуже дякую.
Кекс Доза

1
@KeksDose просто змініть (buffer-file-name)на (file-name-nondirectory (buffer-file-name))першу функцію, щоб отримати каталог файлів sans.
nispio
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.