Сохранить текущий файл с немного другим именем

17

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

Это было бы намного проще, если бы у меня была команда, которая помещает имя текущего буфера в список уничтожений, чтобы я мог открыть файл, затем набрать C-x C-w(записать файл), восстановить текущее имя с помощью Cy, изменить его и сохранить Это.

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


Изменить 1:

Я сделал ошибку: я не хочу печатать C-x C-f(= найти файл), но C-x C-w(= записать файл). Я исправил это выше.

Изменить 2:

Нашел дубликат вопроса и ответа: /unix//a/45381 Но лучшего ответа нет!

Изменить 3:

Здесь: http://www.gnu.org/software/emacs/manual/html_node/elisp/File-Name-Components.html - это функция, которая выбирает часть «nondirectory» в имени файла:

Функция: file-name-nondirectory filename

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 Я юрист и пишу письма, а также контракты. Открывать недавнее письмо кому-то, переименовывать его, удалять содержимое и начинать писать новое письмо тому же человеку быстрее, чем начинать с нуля. Но что касается контрактов, переименование их - плохая замена для cvs, но я никогда не встречал другого юриста, который использует LaTeX и Git, поэтому я должен дать новой версии контракта новое имя файла ...
Кекс Доуз
Справедливо. Как насчет ЯСниппет? Кажется, это очень хорошо подходит для вашего случая использования.
mbork
@mbork Да, для своих шаблонов я использую YASnippets, так как годами. LaTeX, Emacs, orgmode, YASnippets делают мой компьютер намного надежнее, чем Word и Outlook. Хорошо, я пишу это на компьютере с Linux, но вы не можете ожидать от обычной службы технической поддержки: поддержки Linux вместо Windows.
Кекс Доза

Ответы:

23

Там нет необходимости делать все это.

Просто:

  1. Все еще в оригинальном файле, ударил C-x C-w. Вам будет предложено ввести новое имя файла.
  2. Нажмите M-n, и текущее имя файла будет вставлено для вас.
  3. Отредактируйте то, что вы хотите, и нажмите, RETчтобы сохранить файл под этим новым именем.

У вас все еще будет оригинальный файл. Если вы хотите вернуться к нему, просто посетите его снова с C-x C-f.

Malabarba
источник
Я заглянул в руководство Emacs о Files / Saving, но не нашел этого трюка. Как вы узнали? Большой!
Кекс Доза
4
Точно сказать не могу. Это общая вещь о подсказках минибуфера. Удар Mp проходит через историю, а нажатие Mn дает вам «текущий» вариант.
Малабарба
5
Если вы используете ido, сделайте C-fсначала, а затем M-n.
Каушал Моди
1
Вау, я никогда этого не знал. Благодарность! (Извините за комментарий «спасибо, мне тоже», но это отличный пример изучения чего-то простого, но полезного. Viva la emacs.stackexchange!
Марк Ауффлик
3

Копирование имени файла в текущий буфер

Вот функция, которую я использую из блога Cameron Desautels, которая копирует текущее имя файла буфера и отображает его в минибуфере.

 
;; Источник: http://camdez.com/blog/2013/11/14/emacs-show-buffer-file-name/
(defun show-copy-buffer-file-name ()
  Msgstr "Показать полный путь к текущему файлу в минибуфере, а также скопировать его в список уничтожений".
  (Интерактивный)
  (let ((имя-файла (имя-буфера)))
    (если имя файла
        (progn
          (имя файла сообщения)
          (kill-new file-name))
      (ошибка «Буфер не посещает файл»))))

Переименование имени файла в текущем буфере

Магнар Свин реализовал функцию ниже в одном из своих блогов, которая удобно переименовывает текущий буфер за один раз. Это не то, что вы просили, но я подумал, что это может быть связано с вашим вариантом использования.

;; Источник: http://www.whattheemacsd.com/
(defun rename-current-buffer-file ()
  Msgstr "Переименовывает текущий буфер и файл, который он посещает."
  (Интерактивный)
  (пусть ((имя (имя буфера))
        (имя файла (имя-буфера-файла)))
    (если (нет (и имя файла (имя файла-файла-файла)))
        (ошибка «Буфер«% s »не посещает файл!»)
      (let ((new-name (read-file-name "Новое имя:" имя файла)))
        (if (get-buffer new-name)
            (ошибка «Буфер с именем«% s »уже существует!» new-name)
          (переименовать файл имя файла new-name 1)
          (переименовать буфер новое имя)
          (set-посещения-имя-файла новое-имя)
          (set-buffer-updated-p nil)
          (сообщение "Файл"% s "успешно переименован в"% s "."
                   имя (имя-файла-не-каталог новый-имя)))))))
Каушал Моди
источник
Решение Magnar Sveen удаляет исходный файл, и после этого будет только переименованный файл. Это полезно, но мне нужно сохранить старый файл и переименованный. Функция Cameron Desautel копирует имя файла со всем путем. Это довольно близко к решению, которое мне нужно. Знаете ли вы, как изменить эту функцию, чтобы она отображала только имя файла без пути? Тем не менее, большое спасибо.
Кекс Доза
1
@KeksDose просто изменить , (buffer-file-name)чтобы (file-name-nondirectory (buffer-file-name))в первой функции , чтобы получить имя файла каталог SANS.
Ниспио