我正在尝试编写一个命令,该命令将导致Emacs切换到新的缓冲区并执行一些操作(在这种情况下,执行shell命令)将输出写入缓冲区。
(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))))
在这种情况下,它“工作”,只是在命令执行完毕之前它不会切换缓冲区。我想立即切换,然后按照输出运行。有没有办法做到这一点?
答案 0 :(得分:1)
您需要在redisplay
之后明确致电switch-to-buffer
以使其可见。
请注意,ls
是一个相当“快速”的命令,并且不太可能显示零碎。您可能想尝试像
while true; do
date
sleep 10
done
并以异步方式运行(使用async-shell-command
或将&
添加到命令行的末尾。)
另请注意shell-command
的帮助说:
在Elisp中,通常可以通过致电
call-process
或更好地为您提供服务 直接start-process
,因为它提供了更多控制,并且没有强制使用shell(需要引用参数)。