2017-12-27 1071 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