我正在尝试制作一个脚本来确定是否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 功能。