禁止通过窗口管理器关闭按钮关闭最后一个 Emacs 窗口

禁止通过窗口管理器关闭按钮关闭最后一个 Emacs 窗口

我喜欢将 Emacs 作为登录脚本的一部分启动并使其在我的登录会话期间(通常为数周)运行。

我有调用 emacs-client 的脚本,它将允许我使用文件管理器或 Windows 资源管理器来定位文件并右键单击在 Emacs 中编辑它们。

我经常打开很多 emacs 窗口(框架),并且我喜欢通过单击X右上角的 MS-Windows 或 KDE 按钮来关闭它们。

问题是,如果该窗口是最后一个窗口,这将关闭 emacs,从而丢失各种有趣的历史信息。

我使用的一个解决方法C-x 5 0是不允许我关闭最后一帧,但这通常不如使用鼠标方便

有谁知道如何配置 Emacs 以便它可以拦截最后一帧的窗口关闭按钮来请求确认或者干脆禁止它?

在 MS-Windows 上,如果 emacs 仍在运行,则不允许关闭最后一个窗口可能会导致注销挂起,但我并不太担心这一点。

答案1

我能想到两种方法,但我相信还有更多。单击删除框架按钮(Windows 上右上角的 [X])时调用的函数是handle-delete-frame。您可以建议该命令,也可以用其他命令将其替换为处理该单击的函数。

建议如下:

    (defadvice handle-delete-frame(围绕 my-handle-delete-frame-advice 激活)
      “删除最后一帧前请确认”
      (let ((frame (posn-window (event-start 事件)))
            (numfrs (长度 (可见帧列表))))
        (when (or (> numfrs 1) (y-or-np "真的退出 Emacs 吗?"))
          广告做)))

替换它:

    (defun my-handle-delete-frame(事件)
      “删除最后一帧前请确认”
      (交互式“e”)
      (let ((frame (posn-window (event-start 事件)))
            (numfrs (长度 (可见帧列表))))
        (cond ((> numfrs 1) (删除框架框架 t))
              ((y-or-np "真的退出 Emacs 吗?") (save-buffers-kill-emacs)))))

    (定义键特殊事件映射 [删除框架]'我的句柄删除框架)

不要做两个都这些;只做其中之一。

答案2

你应该使用 emacs 守护进程:以以下方式启动 Emacs

       emacs -d

然后 Emacs 将在后台启动,等待 emacsclient 打开新窗口。Emacs 守护进程不会在最后一个窗口关闭时关闭。

答案3

并且,这里有一个更新,它使用了 Drew 的“my-handle-delete-frame”功能,以便删除原始版本中必需的“真正杀死 emacs”弹出窗口,并允许在单击“X 按钮”时简单地退出。

;; The function that is called when you click the delete-frame button
;; (upper-right corner [X] on Windows) is handle-delete-frame. You can advise
;; that command or you can replace it with a function that handles that click
;; via some other command. Therefore, whenever the 'X button' is now clicked
;; the event now is handled here, and invokes kill-emacs, which replaced
;; previous code. The user no longer has to deal w/'Really exit emacs' pop-up.
  (defun exit-emacs-via-del-frm (event)
      "No longer ask for confirmation before deleting the last frame; simply exit"
      (interactive "e")
      (let ((frame   (posn-window (event-start event)))
            (numfrs  (length (visible-frame-list))))
            (kill-emacs) ) )

    (define-key special-event-map [delete-frame] 'exit-emacs-via-del-frm)

相关内容