如何从 elisp 代码中的 make-process 或 start-process 中删除 'Process finished' 消息

How to remove 'Process finished' message from make-process or start-process in elisp code

我制作了一个小的 elisp 代码来处理环境模块 (http://modules.sourceforge.net/),如下所示:

(defun Modules-module (command)
  "foo"

  (interactive (list (read-string "Module cmd: " nil nil)))
    ;; clear cmd buffer, log buffer is replaced below

  (setq cmd-buffer (get-buffer-create "*modules-cmd*"))
  (setq log-buffer (get-buffer-create "*modules-log*"))

  (set-buffer cmd-buffer)
  (delete-region (point-min) (point-max))

  (set-buffer log-buffer)
  (delete-region (point-min) (point-max))

  ;; (start-process "Module" cmd-buffer "/usr/bin/tclsh" "/usr/share/Modules/default/libexec/modulecmd.tcl" "lisp" command)
  (make-process :name "Module" :buffer cmd-buffer :command (list "/usr/bin/tclsh" "/usr/share/Modules/default/libexec/modulecmd.tcl" "lisp" command) :stderr log-buffer)

  (set-buffer cmd-buffer)
  (beginning-of-buffer)
  (delete-matching-lines "Process")

  (set-buffer cmd-buffer)
  (if (> (buffer-size) 0)
      (eval-buffer)
    )
  )

结果已成功插入 cmd-buffer,但缓冲区在缓冲区末尾有消息 'Process Module finished',如下所示:

(setenv "LOADEDMODULES" "gcc/6.2.1")
(setenv "CXX" "g++")
(setenv "COMPILER_TYPE" "gcc")
(setenv "COMPILER_OF_TYPE" "Gcc")
(setenv "FC" "gfortran")
(setenv "COMPILER" "gnu")
(setenv "LOADEDMODULES_modshare" "gcc/6.2.1:1")
(setenv "FORTRAN_TYPE" "gfortran")

Process Module finished

由于'Process Module finished',(eval-buffer) 不起作用。

我加了 (设置缓冲区命令缓冲区) (缓冲区开始) (删除匹配行 "Process")

在 (eval-buffer) 语句之前但失败了。

我的想法是 1. 通过使用 (eval-region) 从缓冲区的开头到 Process finished 行之前的行。 要么 2. 删除 Process finished 行并使用 (eval-buffer)

不胜感激。

可能是这样的:

(defun Modules-module (command)
  (with-temp-buffer
    (shell-command
     (concat "/usr/bin/tclsh /usr/share/Modules/default/libexec/modulecmd.tcl lisp "
             (shell-quote-argument command))
     (current-buffer))
    (eval-buffer)))

此外,虽然这不是您实际问题的一部分,但对局部变量使用 let

(let ((cmd-buffer (get-buffer-create "*modules-cmd*")))
  (with-current-buffer cmd-buffer
    (eq cmd-buffer (current-buffer))))

make-process 是异步的,因此您需要等待它完成后再调用 eval-buffer。但至于你眼前的问题,这个字符串只是由默认进程哨兵插入的。

就这样

(let ((proc (make-process ...)))
  (set-process-sentinel proc #'ignore)
  ...)

甚至只是

(make-process ... :sentinel #'ignore)

应该摆脱它。