Ответ 1
Выберите весь буфер с помощью C-x h, затем используйте M-x write-region
.
Если я использую C-x C-w (write-file)
для записи текущего содержимого буфера в новое место, то после этого мой буфер будет посещать новый файл вместо исходного. Иногда я хотел бы сохранить копию буфера в новое место, но затем продолжить редактирование в исходном местоположении.
Я знаю, что могу убить существующее имя файла из истории минибуфера (write-file)
, а затем сразу же вернуть в приглашение C-x C-f (find-file)
, чтобы повторно посетить исходный файл, и это обход, который я использую в данный момент. Однако это чувствует себя неэлегантно.
Я задавался вопросом, может ли (write-file)
принять префиксный аргумент какого-то типа, чтобы не посещать буфер, но это только влияет на подтверждение перезаписи.
Итак: есть ли более простой способ сохранить содержимое буфера в файле без изменения файла, который я посещаю?
Выберите весь буфер с помощью C-x h, затем используйте M-x write-region
.
Если вам требуется dired-x
по умолчанию или иначе сделать доступную функцию dired-jump
1 то следующее довольно просто:
C-x C-j C (введите новое имя) RET q
Что есть:
1C-h i g (dired-x) Optional Installation Dired Jump
RET
Если вы делаете это достаточно регулярно, чтобы это раздражало вас, вы могли бы определить эту функцию
(defun write-file-copy (filename)
(interactive "F")
(write-region (point-min) (point-max) filename))
и привяжите его к чему-то, что имеет смысл для вас.
Это основано на ответе 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)
После прочтения ответа phils (dired-jump)
, для людей, которые менее знакомы с Dired, мне пришел следующий подход:
M - !
cp FILE NEWNAME
RET
В качестве бонуса у вас есть доступ к табуляции, и вы уже находитесь в каталоге FILE
, поэтому печатать первое имя файла приятно и быстро.
Вы можете использовать write-file, который предназначен для этого: 'Cx Cw' name-of-file