Emacs: записать буфер в новый файл, но оставить этот файл открытым - PullRequest
8 голосов
/ 02 марта 2011

Я хочу сделать в Emacs следующее: сохранить текущий буфер в новый файл, но также оставить текущий файл открытым. Когда я делаю C-x C-w, то текущий буфер заменяется, но я хочу оставить оба буфера открытыми. Возможно ли это без повторного открытия исходного файла?

Ответы [ 4 ]

12 голосов
/ 02 марта 2011

Не думаю, что что-то встроено, но достаточно просто написать:

(defun my-clone-and-open-file (filename)
  "Clone the current buffer writing it into FILENAME and open it"
  (interactive "FClone to file: ")
  (save-restriction
    (widen)
    (write-region (point-min) (point-max) filename nil nil nil 'confirm))
  (find-file-noselect filename))
7 голосов
/ 02 марта 2011

Вот фрагмент, который у меня был некоторое время, чтобы сделать это

;;;======================================================================
;;; provide save-as functionality without renaming the current buffer
(defun save-as (new-filename)
  (interactive "FFilename:")
  (write-region (point-min) (point-max) new-filename)
  (find-file-noselect new-filename))
3 голосов
/ 05 декабря 2012

Мне показалось полезным объединить ответы Скотта и Криса выше.Пользователь может вызвать save-as и затем ответить «y» или «n», когда будет предложено переключиться на новый файл.(В качестве альтернативы пользователь может выбрать желаемую функцию с помощью имени функции «сохранить как и переключать» или «сохранить как не но переключить», но для этого требуется больше нажатий клавиш. Эти имена все еще доступны для вызова другимифункции в будущем, однако.)

;; based on scottfrazer's code
(defun save-as-and-switch (filename)
  "Clone the current buffer and switch to the clone"
  (interactive "FCopy and switch to file: ")
  (save-restriction
    (widen)
    (write-region (point-min) (point-max) filename nil nil nil 'confirm))
  (find-file filename))

;; based on Chris McMahan's code
(defun save-as-but-do-not-switch (filename)
  "Clone the current buffer but don't switch to the clone"
  (interactive "FCopy (without switching) to file:")
  (write-region (point-min) (point-max) filename)
  (find-file-noselect filename))

;; My own function for combining the two above.
(defun save-as (filename)
  "Prompt user whether to switch to the clone."
  (interactive "FCopy to file: ")
  (if (y-or-n-p "Switch to new file?")
    (save-as-and-switch filename)
    (save-as-but-do-not-switch filename)))
2 голосов
/ 02 марта 2011
C-x h

выбирает весь буфер, затем

M-x write-region

записывает область (весь буфер в этом примере) в другой файл.

Редактировать: эта функция делает то, что вам нужно

(defun write-and-open ( filename )
  (interactive "GClone to file:")
  (progn
    (write-region (point-min) (point-max) filename )
      (find-file filename  ))
      )

Это немного грубо, но измените по своему желанию.

Интерактивный код «G» запрашивает имя файла, которое входит в аргумент «имя файла».

Перетащите это в ваш .emacs и вызовите с помощью M-x write-and-open (или определите последовательность клавиш).

...