Emacs 中安靜地執行 async-shell-command

December 27, 2017

安靜地在 Emacs 中執行 async-shell-command 有兩種方式:


1. display-buffer-alist

如果你想要對所有的 async-shell-command 都安靜執行,可以透過:

(add-to-list 'display-buffer-alist
  '("\\*Async Shell Command\\*.*" display-buffer-no-window))

在 Spacemacs 中可以把上面兩行加入在 dotspacemacs/user-config 裡面

缺點是所有的 async shell command 都會被安靜執行,有時候有些 async shell command 我們還是希望跳出視窗提醒

例如執行一些執行 local server 的 command ,不然再開一個可能會開新的 port 所以我推薦第二個方法


2. call-process-shell-command

使用 call-process-shell-command 要留意指令後需要添加 nil 0 參數:

(call-process-shell-command
    (async-shell-command 
        ... ;; 做你想做的事情 
       ) nil 0)

這種方式對個別 async-shell-command 可以分別操作,但是缺點是他會問你要不要開新的 buffer

如果你是有透過 after-save-hook 之類的會高頻率地呼叫 asnc-shellc-ommand,那這個方法會很煩

可能就要選第一個方法


3. shell-command + kill-buffer

如果你的 shell-command 跑起來很快就結束,又會高頻率地呼叫到的話

可以考慮使用 shell-command 而非 async 然後搭配 kill-buffer 來解決一堆 shell command buffer 的問題

也就是說,把 call-process-shell-command 中換成:

(call-process-shell-command
    (shell-command 
        ... ;; 做你想做的事情 
       )
    (kill-buffer "*Shell Command Output*" nil 0)

這樣即可,就留意可能會頓一下因為是在執行 shell-command

Tags: config emacs spacemacs