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

时间:2017-03-15 13:08:52

标签: emacs process environment-modules

我制作了一个小的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

由于'处理模块已完成',(eval-buffer)不起作用。

我补充说     (set-buffer cmd-buffer)     (开始-的缓冲液)     (删除匹配行“处理”)

在(eval-buffer)语句之前

但失败了。

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

任何建议都很感激。

2 个答案:

答案 0 :(得分:3)

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

所以只是

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

甚至只是

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

应该摆脱它。

答案 1 :(得分:1)

可能是这样的:

(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))))