当我打开一个vterm 窗口的时候,再退出emacs总会有下面的提示
有没有什么方法可以检测到vterm内此时没有其他程序在运行的时候直接跳过这个提示。(defun vmacs-vterm-hook()
(let ((p (get-buffer-process (current-buffer))))
(when p (set-process-query-on-exit-flag p nil))))
(add-hook 'vterm-mode-hook 'vmacs-vterm-hook)
好像不行,这样的话即使里面有进程也还是直接退出了
之前也纠结过这个, 但是通过 vterm 的 elisp api 似乎没办法知道里面有没有进程.
想了想似乎可以通过 (process-id vterm--process)
拿到 vterm 的 pid, 然后用 ps
之类的查下看有没有子进程. 有点绕, 如果有更直接的办法就好了.
1 个赞
是个办法,我试试看
刚发现 elisp 原来是有 api 可以做这件事情的, 类似 (process-running-child-p (current-buffer))
就可以知道当前 term 是不是在跑子进程了 .
1 个赞
给段代码
1 个赞
前几天写了一个, 不过最后还是没在自己配置里用, 因为感觉用 advice 容易出 bug.
那个提示是在 save-buffers-kill-emacs
里面写死的, 没找到什么办法去配置 .
(require 'dash)
(defun vterm-without-subprocess-pred (buffer)
(with-current-buffer buffer
(and
(equal 'vterm-mode major-mode)
(get-buffer-process buffer)
(not (process-running-child-p buffer)))))
(defun skip-vterm-query-advice (f-kill-emacs &rest args)
(let* ((vterm-buffers-without-subp
(-filter 'vterm-without-subprocess-pred (buffer-list)))
(processes (-map 'get-buffer-process vterm-buffers-without-subp))
(old-flags (-map 'process-query-on-exit-flag processes))
(process-flag-alist (-zip processes old-flags)))
(-map (lambda (p)
(set-process-query-on-exit-flag p nil))
processes)
(apply f-kill-emacs args)
(-map (lambda (process-flag)
(set-process-query-on-exit-flag (car process-flag) (cdr process-flag)))
process-flag-alist)))
(advice-add 'save-buffers-kill-emacs :around #'skip-vterm-query-advice)
1 个赞
哈哈,我帮你当小白鼠,先试用一下