我有以下代码:
((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个意外行为
call-process
之前执行的switch-to-buffer-xxx
。如何让switch-to-buffer
先执行?答案 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
。