Emacs - Не может получить работу buffer-offer-save

Я хотел бы сделать, чтобы 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

10
задан Nick Dandoulakis 1 March 2010 в 18:03
поделиться

2 ответа

Отредактировано, чтобы добавить использование 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))
2
ответ дан 4 December 2019 в 04:01
поделиться

Изменение '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 постоянным локальным в нашем новом буфере, поэтому он не будет уничтожен остальными локальными переменными при переключении основных режимов.

1
ответ дан 4 December 2019 в 04:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: