我正在嘗試製作一個腳本來確定是否emacsclient
應該使用-nc
or運行-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 功能。