Как я могу "Сохранить как..." в Emacs без посещения нового файла?

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

Я знаю, что могу убить существующее имя файла из истории минибуфера (write-file), а затем сразу же вернуть в приглашение C-x C-f (find-file), чтобы повторно посетить исходный файл, и это обход, который я использую в данный момент. Однако это чувствует себя неэлегантно.

Я задавался вопросом, может ли (write-file) принять префиксный аргумент какого-то типа, чтобы не посещать буфер, но это только влияет на подтверждение перезаписи.

Итак: есть ли более простой способ сохранить содержимое буфера в файле без изменения файла, который я посещаю?

Ответ 1

Выберите весь буфер с помощью C-x h, затем используйте M-x write-region.

Ответ 2

Если вам требуется dired-x по умолчанию или иначе сделать доступную функцию dired-jump 1 то следующее довольно просто:

C-x C-j C (введите новое имя) RET q

Что есть:

  • Перейдите к устаревшему, с указанием файла, который вы пришли из
  • Скопировать этот файл
  • Выход завершен, возвращается в буфер файлов

1C-h i g (dired-x) Optional Installation Dired Jump RET

Ответ 3

Если вы делаете это достаточно регулярно, чтобы это раздражало вас, вы могли бы определить эту функцию

(defun write-file-copy (filename)
  (interactive "F")
  (write-region (point-min) (point-max) filename))

и привяжите его к чему-то, что имеет смысл для вас.

Ответ 4

Это основано на ответе Inaimathi и моем комментарии к этому, а также некоторые дополнительные настройки:

  • Предложите текущее имя файла для редактирования по умолчанию, так как лично я часто хочу изменить его, и это немного раздражает, не имея его там для начала.
  • Не перезаписывайте существующий файл, не спрашивая пользователя, и никогда не перезаписывайте текущий файл буфера.
  • Если регион активен, напишите область; иначе напишите весь (расширенный) буфер.
(defun my-write-copy-to-file ()
  "Write a copy of the current buffer or region to a file."
  (interactive)
  (let* ((curr (buffer-file-name))
         (new (read-file-name
               "Copy to file: " nil nil nil
               (and curr (file-name-nondirectory curr))))
         (mustbenew (if (and curr (file-equal-p new curr)) 'excl t)))
    (if (use-region-p)
        (write-region (region-beginning) (region-end) new nil nil nil mustbenew)
      (save-restriction
        (widen)
        (write-region (point-min) (point-max) new nil nil nil mustbenew)))))

(global-set-key (kbd "C-c w") 'my-write-copy-to-file)

Ответ 5

После прочтения ответа phils (dired-jump), для людей, которые менее знакомы с Dired, мне пришел следующий подход:

M - ! cp FILE NEWNAME RET

В качестве бонуса у вас есть доступ к табуляции, и вы уже находитесь в каталоге FILE, поэтому печатать первое имя файла приятно и быстро.

Ответ 6

Вы можете использовать write-file, который предназначен для этого: 'Cx Cw' name-of-file