10

我想让 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

4

3 回答 3

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))
于 2010-03-01T18:32:28.080 回答
1

修改'new-empty-buffer似乎使它按照我对 Trey 的错误建议的意图工作。

;; 创建一个新的空缓冲区
(defun new-empty-buffer ()
 “打开一个新的空缓冲区。”
 (交互的)
 (let ((buf (generate-new-buffer "untitled")))
   (切换到缓冲区缓冲区)
   (funcall(和默认主要模式))
   (put 'buffer-offer-save '永久本地 t)
   (setq buffer-offer-save t)))

这使得buffer-offer-save在我们的新缓冲区中成为永久局部变量,因此在切换主要模式时它不会被其他局部变量杀死。

于 2010-03-03T11:57:07.860 回答
1

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*. 但它会提示您是否创建了一个空缓冲区并在其中写入了一些内容。

另请参阅我关于创建空缓冲区的回答

于 2014-12-12T15:03:11.803 回答