如何从 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)
应该摆脱它。
我制作了一个小的 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)
应该摆脱它。