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