我使用以下方式启动 emacs 服务器
emacs --daemon
然后使用打开文件
emacsclient filename.ext
但第一个文件必须使用
emacsclient -c filename.ext
为了创建一个新的框架,该框架稍后可以被后续文件使用,而无需使用-c
emacsclient 的命令行标志。
我想自动执行此操作。“如果没有 emacs 框架,emacsclient 应该创建一个框架,否则它应该使用当前框架”。该怎么做?
答案1
这类似于 dimitri 的解决方案,但它处理了 emacs 启动的情况emacs --daemon
。emacs --daemon
创建一个隐藏窗口,导致xprop
在检查现有窗口时给出误报。
#!/bin/bash
emacsclient -n -e "(> (length (frame-list)) 1)" | grep -q t
if [ "$?" = "1" ]; then
emacsclient -c -n -a "" "$@"
else
emacsclient -n -a "" "$@"
fi
答案2
如果还没有框架,您可以先创建一个框架,然后在现有的框架中打开文件。如果窗口显示上现在没有打开任何框架,则以下代码片段会在初始显示上创建一个框架。您可能希望以多种方式对其进行调整,例如使用 检查显示上是否已经有框架x-display-list
。您需要(require 'cl)
在您的 `.emacs 中。这可能需要进行一些调整才能在 Windows 或 Aqua 上运行。
emacsclient -e '(unless (find-if (lambda (f)
(let ((p (frame-parameters f)))
(assq '\''window-system p)))
(frame-list))
(make-frame-on-display (getenv "DISPLAY")))'
emacsclient filename.ext
答案3
这是我在 Linux 下使用的 emacs-client.sh 脚本,可以执行您要求的操作:
#!/bin/sh
xprop -name emacs >/dev/null 2>/dev/null
if [ "$?" = "1" ]; then
emacsclient -c -n -a "" "$@"
else
emacsclient -n -a "" "$@"
fi
答案4
我的解决方案是启动守护进程后强制创建框架:
function em() {
emacs --bg-daemon --display=:0
# Forces emacs to notice I'm using X as well.
emacsclient --create-frame --display=:0 --no-wait
}
然后我就不再需要使用--create-frame了。