在使用vterm的时候emacs退出时的情况

当我打开一个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 之类的查下看有没有子进程. 有点绕, 如果有更直接的办法就好了.:expressionless:

1 个赞

是个办法,我试试看

刚发现 elisp 原来是有 api 可以做这件事情的, 类似 (process-running-child-p (current-buffer)) 就可以知道当前 term 是不是在跑子进程了 :joy:.

1 个赞

给段代码 :stuck_out_tongue_winking_eye:

1 个赞

前几天写了一个, 不过最后还是没在自己配置里用, 因为感觉用 advice 容易出 bug. 那个提示是在 save-buffers-kill-emacs 里面写死的, 没找到什么办法去配置 :thinking:.

(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 个赞

哈哈,我帮你当小白鼠,先试用一下