Emacs Lisp执行顺序和异步调用过程

Emacs Lisp执行顺序和异步调用过程,emacs,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") )) 有两种意想不到的行为 查看始终在切换到缓冲区xxx之前执行的调用进程。如何使切换到缓冲区先执行? 在执行上述代码时,我的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")
  ))
有两种意想不到的行为

查看始终在切换到缓冲区xxx之前执行的调用进程。如何使切换到缓冲区先执行? 在执行上述代码时,我的emacs会挂起2秒钟,有没有办法让调用进程异步运行? 顺便说一句,在Emacs中,是否有elisp代码的内置格式

切换到缓冲区 使用现有宏。例如,下面的代码将切换到缓冲区,并在必要时创建它并在其中写入内容。当前缓冲区窗口中的所有代码。。。在选定缓冲区处于活动状态且可见的上下文中执行

(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仅用于全局变量声明,如顶级语句。您很少不需要在函数中放置defvar

(setq buffer-name "*mongo-dev*")
您想要做的是一个局部绑定,缓冲区名称符号用作let主体内的局部变量

是同步的,您还有其他选择,但这太宽泛,无法在这里详细说明。参见手册

顺便说一句,在Emacs中,是否有elisp代码的内置格式


是的,.

感谢您的代码审查和建议,现在我的问题得到了很大的解决!至于代码格式,我没有在emacs lisp模式下找到该命令,而是使用了elisp-format.el,结果是可以接受的。对于那些仍然对问题1感到困惑的人,一种解决方法是在切换到缓冲区其他窗口后添加redisplay t。。。。但是@coredump为这种情况提供了更通用的解决方案。
(setq buffer-name "*mongo-dev*")
(let ((buffer-name "*mongo-dev*"))
  (switch-to-buffer-other-window buffer-name)
  (call-process "sleep" nil buffer-name  nil "2"))