Emacs - Не могу получить работу с буфером-предложением-сохранением - PullRequest
10 голосов
/ 01 марта 2010

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

Ответы [ 3 ]

2 голосов
/ 01 марта 2010

Отредактировано для добавления использования 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))
1 голос
/ 12 декабря 2014

buffer-offer-save просить о выходе из Emacs, но не о закрытии буфера вручную, не имеет смысла, так почему бы не «расширить» его обязанности?

(defadvice kill-buffer (around kill-buffer-ask activate)
  "If `buffer-offer-save' is non-nil and a buffer is modified,
prompt before closing."
  (if (and buffer-offer-save (buffer-modified-p))
      (when (yes-or-no-p "The document isn't saved. Quit? ")
        ad-do-it)
    ad-do-it))

Не будет запрашиваться, если буфер untitled был создан заново. Он не подскажет, используете ли вы kill-buffer от Elisp. Он не запрашивает системные буферы Emacs, такие как *Messages*. Но он подскажет, если вы создали пустой буфер и что-то в него записали.

См. Также мой ответ о создании пустого буфера .

1 голос
/ 03 марта 2010

Модификация 'new-empty-buffer, кажется, заставляет его работать так, как я и предполагал с помощью устройства Трея.

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

...