2017-12-27 325 views
2

我想写一个命令,会导致Emacs切换到一个新的缓冲区,并执行一些操作(在这种情况下,执行一个shell命令)写输出到缓冲区。emacs elisp切换到缓冲区,并按照

(defun test-func() 
    (interactive) 
    (let ((bname "*temp*") 
     (default-directory "/home/me")) 
    (with-output-to-temp-buffer bname 
     (switch-to-buffer bname) 
     (shell-command "ls -l" bname)))) 

在这种情况下,它“工作”,除非在命令完成执行之前它不切换缓冲区。我想立即切换,然后在运行时跟随输出。有没有办法做到这一点?

回答

1

您需要在switch-to-buffer之后明确呼叫redisplay以使其可见。

请注意,ls是一个相当“快”的命令,它不可能显示零碎。你可能想尝试像

while true; do 
    date 
    sleep 10 
done 

一个shell脚本并运行是异步的(或者使用async-shell-command或添加&到命令行的末尾)。

还要注意对shell-command帮助说:

在elisp的,你经常会得到更好的通过调用call-processstart-process直接,因为它提供了更多的控制权,也不强制使用一个外壳的服务(需要引用参数)。

+0

是的,它切换到缓冲区,但缓冲区不会更新,直到shell命令完成...也许有一种不同的方式叫出来。 – MichaelB

+0

@MichaelB:使用'&',看编辑。 – sds

+0

看起来像重新显示,然后启动过程可以做到这一点。 – MichaelB