使用腳本執行 emacsclient

使用腳本執行 emacsclient

我正在嘗試製作一個腳本來確定是否emacsclient應該使用-ncor運行-t。腳本是這樣的(基於這個版本):

#!/bin/sh 
if [ -z "$DISPLAY" ]; then 
    IS_GRAPHICAL=true 
else 
    IS_GRAPHICAL=$(emacs --batch -Q --eval='(if (fboundp '"'"'tool-bar-mode) (message "true") (message "false"))' 2>&1) 
fi 
if $IS_GRAPHICAL; then 
    emacsclient -a "" -nc "$@" 
else 
    emacsclient -a "" -t "$@" 
fi

然而,該emacs --batch -Q ...線路所花費的時間與使用裸實例一樣多emacs。如果我註解掉這一行,當在 tty 下執行時,除了乾淨的螢幕之外,我什麼也得不到。是否可以使檢測速度更快?

我已經使用 systemd 用戶單元啟動了 emacs 守護程式。我想要emacsclient

  • 停留在航廈(即,不要開啟 GUI 視窗)如果用檔案呼叫(例如由 呼叫git-commit)或圖形環境不存在時(例如在 tty 中呼叫)並繼續運行直到 exit ( C-x C-c)
  • 在沒有文件的情況下調用時打開一個 GUI 視窗(行為類似於裸emacs調用;當我使用它執行此操作時,emacsclient它告訴我需要輸入文件)並立即返回。

答案1

來自 Arch Wiki 的腳本

emacs該檢查的呼叫(fboundp 'tool-bar-mode)正在測試您的 Emacs 版本是否包含 GUI 支援。可以在沒有它的情況下建立 Emacs,以節省一點 RAM 和磁碟空間,但這種情況並不常見。除非您關心與缺乏 GUI 支援的 Emacs 版本的兼容性,否則請忘記這一點。

這樣你就剩下了

if [ -n "$DISPLAY" ]; then
  emacsclient -a "" -n -c "$@"
else
  emacsclient -a "" "$@"
fi

即使這種層級的複雜性只有在您希望呼叫emacsclient在開啟新的 GUI 視窗時立即返回時才是必要的。 (如果它在終端中運行,那麼它必須繼續運行,直到您使用完該終端為止。)由您決定是否喜歡這種行為。如果你不這樣做,那麼你可以簡單地運行

emacsclient -a "" "$@"

如果您無論如何都用您的會話啟動 Emacs,例如作為 systemd 單元,那麼您不需要告訴它emacsclient來啟動它。所以我們剩下

emacsclient "$@"

我無法進一步簡化。

您的附加要求

  • 如果使用檔案呼叫 (...) 或圖形環境不存在 (...),則留在終端機中 (...)
  • 在沒有檔案的情況下呼叫時開啟 GUI 視窗 (...) 並立即返回

為此,您需要測試腳本是否是使用參數呼叫的。我假設如果您傳遞任何emacsclient選項(例如--eval),那將被視為一個參數。

if [ $# -ne 0 ]; then
  emacsclient -nw "$@"
elif [ -n "$DISPLAY" ]; then
  emacsclient -c -n
else
  emacsclient -c
fi

1沒有 GUI 支援意味著您不需要安裝必需的庫。如果程式所包含的庫不存在,則程式emacs無法啟動,即使它不會在該特定會話中使用 GUI 功能。

相關內容