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

Idl*_*ool 10 emacs emacsclient

我使用启动 emacs 服务器

emacs --daemon
Run Code Online (Sandbox Code Playgroud)

然后使用打开文件

emacsclient filename.ext
Run Code Online (Sandbox Code Playgroud)

但第一个文件必须使用打开

emacsclient -c filename.ext
Run Code Online (Sandbox Code Playgroud)

为了创建一个新框架,以后可以在不使用-cemacsclient 的命令行标志的情况下由后续文件使用该框架。

我想自动化这个。“如果没有 emacs 框架,emacsclient 应该创建一个框架,否则它应该使用当前框架”。怎么做到呢?

Jim*_*ker 13

这就像 dimitri 的解决方案,但它处理 emacs 作为emacs --daemon. emacs --daemon制作一个隐藏窗口,导致xprop在检查现有窗口时给出误报。

#!/bin/bash

emacsclient -n -e "(if (> (length (frame-list)) 1) 't)" | grep -q t
if [ "$?" = "1" ]; then
    emacsclient -c -n -a "" "$@"
else
    emacsclient -n -a "" "$@"
fi
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 7

如果还没有框架,您可以先创建一个框架,然后在现有框架中打开文件。这是一个片段,如果现在在窗口显示上没有打开任何框架,它会在初始显示上创建一个框架。您可能希望通过多种方式进行调整,例如检查显示器上是否已经有一个带有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
Run Code Online (Sandbox Code Playgroud)


dim*_*tri 7

这是我在 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
Run Code Online (Sandbox Code Playgroud)