你如何将emacs中的进程作为函数返回值?

时间:2011-06-09 20:47:48

标签: emacs

我正在尝试编写需要将数据发送到外部进程的emacs工具,我的示例是REPL作为劣质lisp的一部分。

如何将流程的输出作为emacs函数返回?

我想要像:

(defun get-data () 
  (process-send-string (get-process) "foo command")
  (get-data-output-from-process (get-process)))

我尝试过使用process-send-string和accept-process-output-proc,但输出总是被发送到inferior-lisp。我想要一些东西将数据返回到被调用的函数,以便我可以操作数据。如果可能的话,我也不想将输出复制到劣质lisp缓冲区。

2 个答案:

答案 0 :(得分:2)

通常,您希望了解正在运行EMACS subprocesses. getting information from a subprocess有几个有用的功能。

以下是call-process的示例:

;; results go into current buffer
(call-process "pwd" nil t)
/nishome/crmartin  ; there's the results
0                  ; return value is value from exit
(call-process "false" nil t)
1                  ; false(1) always returns non-0
;; results go into a buffer named "bletch", creating it if needed.
(call-process "pwd" nil "bletch" t)
0

要尝试此操作,请将elisp代码键入 scratch 并使用C-j运行。

答案 1 :(得分:0)

我能让这个工作的唯一方法是将结果存储在全局中,然后将其传回函数中。

 (defvar ac-dj-toolkit-current-doc nil "Holds dj-toolkit docstring for current symbol")

 (defun dj-toolkit-parse (proc text)
   (setq ac-dj-toolkit-current-doc text)
   text)

 (defun dj-toolkit-doc (s)
   (let ((proc (inferior-lisp-proc)))
     (process-send-string (inferior-lisp-proc)
             (format "(clojure.repl/doc %s)\n"
                 s))
     (set-process-filter proc 'dj-toolkit-parse)
     (accept-process-output proc 1)
     (set-process-filter proc nil)
     ac-dj-toolkit-current-doc))