Emacs-Can';无法获得缓冲区提供保存工作

Emacs-Can';无法获得缓冲区提供保存工作,emacs,elisp,emacs23,Emacs,Elisp,Emacs23,我想让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)

我想让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)))
我认为将“缓冲区提供保存”设置为非零会成功。但是,每当我用“kill this buffer”杀死缓冲区时,它会立即被杀死,而无需任何请求

这发生在GNU Emacs 23.1.1上

有什么想法吗

谢谢, W

编辑以添加
缓冲区的使用,从而提供保存功能
。注意:变量

您可以从以下代码开始,并根据需要对其进行自定义:

(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
似乎可以让它像我对Trey的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))) ;; 创建新的空缓冲区 (卸载新的空缓冲区() “打开一个新的空缓冲区。” (互动) (let((buf(生成新缓冲区“无标题”)) (切换到缓冲区buf) (funcall(和默认主模式)) (放置“缓冲区提供保存”永久本地t) (setq缓冲区提供保存(t)))
这使得
buffer-offer-save
在我们的新缓冲区中成为永久本地变量,因此在切换主要模式时,它不会被其他本地变量杀死。

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))
如果新创建了
无标题
缓冲区,则不会提示。如果使用Elisp中的
kill buffer
,则不会提示。它不会在Emacs系统缓冲区上提示,如
*消息*
。但是,如果您创建了一个空缓冲区并在其中写入了一些内容,它将提示


另请参见。

新建空缓冲区
中将缓冲区与文件关联可以解决问题吗?@Cheeso好的,在
新建空缓冲区
中这样做会将请求放在错误的一端,就像他创建新缓冲区时那样。这就是说,他可以修改
新的空缓冲区
,以设置通知/功能可以关闭的标志。我想我喜欢使用
新空缓冲区的解决方案。
@Cheeso注意:我更新的解决方案做得更好,并且关注
新空缓冲区
-我对此做了一些阅读(这对我来说是新的,有很多东西需要学习)。@Trey你的建议非常有效。我直观地了解了您的代码的功能,但我肯定会更详细地研究它。我正在用Emacs迈出第一步,我很高兴。非常感谢。刚刚发现了一个奇怪的行为(但不知道它是否可以在其他安装中复制)。我用M-x新的空缓冲区打开一个新的缓冲区,在上面粘贴一些文本,然后使用M-x文本模式,然后杀死这个缓冲区。缓冲区在没有任何警告的情况下被终止。在
新建空缓冲区中,将缓冲区与文件关联可以解决问题吗?