仅当emacsclient没有框架时,才创建框架


11

emacsclient -a '' -n仅在还没有框架时,如何才能创建一个新框架?

-c标志的问题是它每次都会创建一个新的帧。没有它的问题是,如果没有打开的框架,它将在命令行中打开。

如果可以从外壳检查是否有打开的Emacs框架,则可以-c根据需要进行调用,无论是否调用它,都可以得到所需的行为。我试过了:

$ emacsclient -a '' --eval '(frames-on-display-list)'
(#<frame F1 0xba2740>)

我总是得到相同的结果。

我可以使用临时文件或pgrep,但是这些方法很容易出错。

这类似于此问题,但不是重复的,因为OP对在调用之前必须打开框架感到满意emacsclient


1
superuser.com/questions/358037/…与相同的问题elispbash以及sh答案。
康斯坦丁·莫连科

Answers:


3

我最终基于制作了这个脚本

#!/bin/bash -e

if [[ "$DISPLAY" ]]; then
        frame=`emacsclient -a '' -e "(member \"$DISPLAY\" (mapcar 'terminal-name (frames-on-display-list)))" 2>/dev/null`
        [[ "$frame" == "nil" ]] && opts='-c' # if there is no frame open create one
        [[ "${@/#-nw/}" == "$@" ]] && opts="$opts -n" # don't wait unless we've asked to run in a terminal
else
        opts='-nw'
fi

exec emacsclient -a '' $opts "$@"

如果没有显示,则以打开-nw。如果$DISPLAY设置为if,它将在该显示中查找帧以查看是否需要制作新帧。

编辑:我已经对其进行了修改,以便您可以手动指定-nw是否要在终端中打开(即使有显示)。


1
次要nitpick: $@ 应加引号
dshepherd

0

您可以使用:

emacsclient -s server_name -e '(+ 1 0)' >/dev/null 2>&1

检查Emacs服务器"server_name"是否已经在运行。如果该命令返回退出代码0,则它正在运行。如果是这样,只需使用emacsclient命令:

emacsclient -s server_name -n file_name.txt

如果未运行,则可以打开新的Emacs服务器,例如:

emacs --eval '(setq server-name "server_name")' --eval '(server-start)' file_name.txt &

但是这样一来,一旦关闭外壳,您将杀死服务器,对吗?必要emacsclient -a ''时启动emacs --daemon,即使关闭外壳,该启动也将持续。
spelufo

@spelufo不能通过杀死shell杀死服务器。注意&命令末尾的;这意味着将服务器作为后台进程运行。
HåkonHægland2015年

哪个将其派生到当前shell的背景。当您拿回外壳时,它不会被杀死,但是当您完全关闭该外壳时,它会被杀死C-d
spelufo

即使关闭所有终端,守护程序也会继续运行。如果server-start将服务器作为守护进程启动,它将仅继续运行。如果以这种方式启动emacs,然后关闭所有emacs和终端,然后打开一个新终端并运行,您会得到什么pgrep emacs
spelufo

@spelufo实际上它仍然在运行C-d。我现在gnome-terminal在Ubuntu 14.10上使用过此方法。.我想您是在关闭所有Emacs框架后指的是正在运行的实例吗?然后,这将需要一个守护进程是..
哈康Hægland
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.