【问题标题】:Emacs - Can't get buffer-offer-save workingEmacs - 无法让缓冲区提供保存工作
【发布时间】:2011-01-22 09:46:41
【问题描述】:

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

【问题讨论】:

  • 将缓冲区与文件相关联,new-empty-buffer 解决问题吗?

标签: emacs elisp emacs23


【解决方案1】:

编辑添加使用buffers-offer-save。注意:变量buffer-offer-save is only used upon exiting 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))

经过进一步思考,这有点笨拙,因为系统会提示您选择 all 被杀死的缓冲区,并且 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 解决问题吗?
  • @Cheeso 好吧,在new-empty-buffer 中这样做会将请求置于错误的一端,就像他创建新缓冲区时一样。也就是说,他可以修改new-empty-buffer 来设置一个标志,建议/功能可以关闭。我想我喜欢不使用new-empty-buffer 的解决方案。
  • @Cheeso 注意:我更新的解决方案做得更好,并关注new-empty-buffer - 我做了一些阅读(这对我来说是新的,有很多东西要学)。
  • @Trey 您的建议效果很好。我直观地了解了您的代码的作用,但我肯定会更详细地研究它。我正在使用 Emacs 迈出第一步,我很高兴。非常感谢。
  • 刚刚发现了一个奇怪的行为(虽然不知道它是否可以在其他安装中重现)。我用 M-x new-empty-buffer 打开一个新缓冲区,在上面粘贴一些文本,然后是 M-x 文本模式,然后是 kill-this-buffer。缓冲区在没有任何警告的情况下被终止。
【解决方案2】:

修改 '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 在我们的新缓冲区中成为永久局部变量,因此在切换主要模式时它不会与其他局部变量一起被杀死。

【讨论】:

    【解决方案3】:

    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缓冲区是否新建不提示。如果您使用 Elisp 的 kill-buffer,它不会提示。它不会在 Emacs 系统缓冲区(如 *Messages*)上提示。但是如果你创建了一个空缓冲区并在里面写了一些东西,它会提示。

    另见my answer on creating an empty buffer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2021-03-22
      相关资源
      最近更新 更多