Lisp执行顺序和异步调用进程

时间:2018-04-25 12:59:14

标签: emacs

我有以下代码:

((lambda()
   (defvar buffer-name)
   (setq buffer-name "*mongo-dev*")
   (switch-to-buffer-other-window buffer-name)
   (call-process "sleep" nil buffer-name  nil "2")
  ))

有2个意外行为

  1. 查看始终在call-process之前执行的switch-to-buffer-xxx。如何让switch-to-buffer先执行?
  2. 执行上面的代码时,我的emacs会挂起2秒,是否有办法让调用进程异步运行?
  3. 在BT中,在Emacs中,是否有内置的elisp代码格式?

1 个答案:

答案 0 :(得分:1)

切换到缓冲区

使用现有的宏。例如,以下内容切换到缓冲区(并在必要时创建它)并在其中写入内容。 (with-current-buffer-window ...)内的所有代码都在所选缓冲区处于活动状态且可见的上下文中执行。

(with-current-buffer-window "*mongo-dev*" nil nil
  (insert "Hello"))

以上是一个宏,它在被评估之前被扩展为代码。在代码上调用macroexpand-all(注意引用'),您可以看到代码转换的结果:

(macroexpand-all '(with-current-buffer-window "*mongo-dev*" nil nil
                   (insert "Hello")))

(let* ((buffer (temp-buffer-window-setup "*mongo-dev*"))
       (standard-output buffer)
       window
       value)
  (save-current-buffer
    (set-buffer buffer)
    (setq value (progn (insert "Hello")))
    (setq window (temp-buffer-window-show buffer nil)))
  (if (functionp nil)
      (funcall nil window value)
    value))

生成进程并使用缓冲区查看其输出

这是一项常见任务,您可能希望使用以下内容:

(start-process-shell-command "my-process"
                             "*mongo-dev*"
                             "ls -la /usr/bin")

您的代码

(defvar buffer-name)

defvar仅用于全局变量声明,如顶级语句。您很少(从不)需要在函数中放置defvar

(setq buffer-name "*mongo-dev*")

您想要做的是一个本地绑定("缓冲区名称"符号用作let主体内的局部变量。)

(let ((buffer-name "*mongo-dev*"))
  (switch-to-buffer-other-window buffer-name)
  (call-process "sleep" nil buffer-name  nil "2"))

call-process是同步的,你还有其他选择,但这里的内容太宽泛了。见手册。

  在BT中,在Emacs中,是否有内置的elisp代码格式?

是的,emacs-lisp-mode