emacsclient:如果框架不存在,则创建一个框架

emacsclient:如果框架不存在,则创建一个框架

我使用以下方式启动 emacs 服务器

emacs --daemon

然后使用打开文件

emacsclient filename.ext

但第一个文件必须使用

emacsclient -c filename.ext

为了创建一个新的框架,该框架稍后可以被后续文件使用,而无需使用-cemacsclient 的命令行标志。

我想自动执行此操作。“如果没有 emacs 框架,emacsclient 应该创建一个框架,否则它应该使用当前框架”。该怎么做?

答案1

这类似于 dimitri 的解决方案,但它处理了 emacs 启动的情况emacs --daemonemacs --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了。

相关内容