有没有办法判断 shell buffer 中是否有命令或脚本正在运行

用了 process-send-string 函数在 shell buffer 中执行了一个脚本后,可以在程序中判断出这个 shell buffer 中的脚本或命令有没有执行完吗?

描述最好严谨&详细,必要时附图/代码。

我假设你说的 shell buffer 是 M-x shell 产生 buffer,而不是一个笼统的 shell 或 buffer 概念:

  1. M-x shell

  2. *shell* buffer 执行 M-: (car (process-command (get-buffer-process (current-buffer)))) 确定当前 shell 命令,我这边是:"/bin/bash"

  3. *shell* buffer 里执行 top 命令

  4. 执行 M-: (shell-command-to-string "pgrep top") 得到 “77586\n”,就是刚才启动的进程的ID

  5. 接着用这段代码应该能获取到ID:

    (process-running-child-p
     (car (seq-filter (lambda (it)
                        (string= "/bin/bash" ;; <-- 由第 2. 步得到
                                 (car (process-command it))))
                      (process-list))))
    ;; => 77586
    

UPDATE:

如果 buffer 名称是确定的:

(when-let (proc (get-buffer-process (get-buffer "*shell*<2>")))
  (process-running-child-p proc))
;; => 54152
1 个赞

我觉得他说的是

http://www.gnu.org/software/emacs/manual/html_node/elisp/Sentinels.html#Sentinels

如果不是 也可以用filter的吧

好的,非常感谢大佬指出的问题,下次我注意 :joy:

谢谢谢谢 :joy:

试试:

(defun earned::shell-busy-p ()
  (when (eq major-mode (quote shell-mode))
    (not
     (string-match
      comint-prompt-regexp
      (buffer-substring-no-properties (car comint-last-prompt) (cdr comint-last-prompt))))))