Я хотел бы сделать, чтобы Emacs спросил меня, хочу ли я сохранить измененный буфер, когда тот буфер не связан с файлом. Для открытия нового буфера (не посещение файла), у меня есть следующая функция в моем .emacs файле:
;; Creates a new empty buffer
(defun new-empty-buffer ()
"Opens a new empty buffer."
(interactive)
(let ((buf (generate-new-buffer "untitled")))
(switch-to-buffer buf)
(funcall (and default-major-mode))
(setq buffer-offer-save t)))
Я думал, устанавливая "buffer-offer-save" к чему-то не, ноль будет, сделал прием. Но каждый раз, когда я уничтожаю буфер с "kill-this-buffer", он немедленно уничтожается, ничего не спрашивая.
Это происходит на GNU Emacs 23.1.1
Какие-либо идеи?
Спасибо, W
Отредактировано, чтобы добавить использование buffers-offer-save
. Примечание: переменная buffer-offer-save
используется только после выхода из Emacs .
Вы можете начать с этого кода и настроить его так, как хотите:
(add-to-list 'kill-buffer-query-functions 'ask-me-first)
(defun ask-me-first ()
"prompt when killing a buffer"
(if (or buffer-offer-save
(eq this-command 'kill-this-buffer)
(and (buffer-modified-p) (not (buffer-file-name))))
(y-or-n-p (format "Do you want to kill %s without saving? " (buffer-name)))
t))
После дальнейшего размышления это будет немного тяжеловесно, потому что вам предлагается ввести все буферы, которые будут уничтожены, и там Часто Emacs использует множество временных буферов. Если вы просто хотите, чтобы при попытке интерактивного уничтожения буфера (который не связан с файлом) отображался запрос.
Вы можете использовать этот совет, который подсказывает вам только тогда, когда вы в интерактивном режиме пытаетесь уничтожить буфер:
(defadvice kill-buffer (around kill-buffer-ask-first activate)
"if called interactively, prompt before killing"
(if (and (or buffer-offer-save (interactive-p))
(buffer-modified-p)
(not (buffer-file-name)))
(let ((answ (completing-read
(format "Buffer '%s' modified and not associated with a file, what do you want to do? (k)ill (s)ave (a)bort? " (buffer-name))
'("k" "s" "a")
nil
t)))
(when (cond ((string-match answ "k")
;; kill
t)
((string-match answ "s")
;; write then kill
(call-interactively 'write-file)
t)
(nil))
ad-do-it)
t)
;; not prompting, just do it
ad-do-it))
Изменение 'new-empty-buffer
, похоже, заставляет его работать так, как я задумал с помощью defadvice Трея.
;; Creates a new empty buffer (defun new-empty-buffer () "Opens a new empty buffer." (interactive) (let ((buf (generate-new-buffer "untitled"))) (switch-to-buffer buf) (funcall (and default-major-mode)) (put 'buffer-offer-save 'permanent-local t) (setq buffer-offer-save t)))
Это делает buffer-offer-save
постоянным локальным в нашем новом буфере, поэтому он не будет уничтожен остальными локальными переменными при переключении основных режимов.