使用脚本运行 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 功能。

相关内容