【问题标题】:Create or reuse existing Emacs GUI frame创建或重用现有的 Emacs GUI 框架
【发布时间】:2012-04-01 22:05:21
【问题描述】:

假设 Emacs 服务器正在运行,我希望 emacsclient <file> 在没有现有框架时创建一个新框架(如 -c),或者在有框架时重用现有框架。换句话说,我只在没有现有框架时才想要-c。这可能吗?

【问题讨论】:

  • 这不就是省略-c 吗?这意味着一个简单的emacsclient yourfile.ext 应该在现有框架中打开,如果有,则应该创建一个。

标签: emacs


【解决方案1】:

我用一组 shell 脚本解决了我的问题。

my_emacs

#!/bin/sh
emacs24-x $@ 1> /dev/null 2> /dev/null &

您可能需要将 emacs24-x 更改为指向 X11 emacs 的内容。

my_emacsclient

#!/bin/sh
emacsclient $@ 1> /dev/null 2> /dev/null || my_emacs

通过 ~/bin 等将这两个文件添加到您的 PATH 中。

在我的 .emacs 中,我还添加了以下几行

(load "server")
(unless (server-running-p) (server-start))

同时更改一些环境变量并可选地添加别名

export ALTERNATE_EDITOR="my_emacs"
export EDITOR="my_emacsclient -n"
export SUDO_EDITOR="my_emacsclient"
...
alias e="$EDITOR"

当您在 shell 中运行 e 时,它应该创建或重用现有的 GUI 框架。此外,运行e <filename> 会在框架中打开该文件;您还可以将其他标志(如-n)传递给e

对于其他应用程序(比如您的文件管理器)中的相同行为,您还应该将 Emacs .desktop 文件(对我来说是 /usr/share/applications/emacs24.desktop)更改为运行 my_emacs

通过基于 Debian (?) 的发行版中的替代系统将 emacs 更改为 my_emacsclient 也是一个好主意。

【讨论】:

  • 对于任何可能使用我的设置的人。它并不完美,并且有一些继承缺陷。例如,如果您在没有启动 Emacs 时尝试sudo -e <filename>,它将失败。当 Emacs 已经启动时,也只需调用 e 创建一个新框架,而不是提升现有框架。我会尽力解决这个问题并通知您。
【解决方案2】:

emacsclient <file> 做你想做的事。

如果你只是想打开一个框架而不指定文件,那么你需要使用-c

【讨论】:

  • 不完全是。当不存在 GUI 框架时,emacsclient <file> 在终端框架中打开。
【解决方案3】:

如果还没有 GUI 框架,您可能想尝试使用 `emacsclient --display "$DISPLAY" " 来强制创建 GUI 框架。

【讨论】:

  • 嗯,还是不适合我。它为我打开了一个终端框架。
  • @Renke:echo "DISPLAY=$DISPLAY" 告诉你什么?
  • DISPLAY=:0.0 正如我猜的那样。
  • @Renke:呃!你是对的,我看到“emacs --daemon”有同样的问题。看起来像 server.el 中的一个普通错误。
【解决方案4】:

这是我的解决方案:

在您的 emacs 启动文件(例如:~/.emacs/init.el)中,确保您有以下几行:

;; start emacs server, if it's not already running:
(require 'server)
(unless (server-running-p) (server-start))

然后,将以下内容添加到您的 ~/.bashrc 文件中:

function e()
{
   emacsclient "$@" -a "emacs"
}

要建立基线,请确保退出所有 emacs 实例并终止 emacs 守护程序(如果您当前正在运行它)。

然后,从命令行“获取”~/.bashrc 文件:

source ~/.bashrc

最后,使用 'e' 编辑文件:

e Foobar.java &
e notes.txt &

【讨论】:

    【解决方案5】:

    因此需要考虑三种状态:

    1. 守护程序未运行:启动 emacs 并创建一个新框架。
    2. 守护程序正在运行,但没有附加客户端:创建一个附加到守护程序的新框架。
    3. 客户端已附加到守护程序:在现有框架中打开文件。

    我的 ~/.zshrc 的这一部分对我有用:

    emacs_start_or_attach () {
        if ! pgrep emacs &> /dev/null 2>&1
        then
            emacsclient -a '' -c $@ &
            return 0
        fi
    
        if pgrep emacsclient &> /dev/null 2>&1
        then emacsclient $@ &
        else emacsclient -c $@ &
        fi
    }
    
    alias emacs=emacs_start_or_attatch
    export EDITOR=emacs_start_or_attatch
    

    如果您愿意,您还可以在系统启动时启动 emacs 守护程序和/或让 emacs 在初始化时启动守护程序(如果它没有运行)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 2020-04-09
      相关资源
      最近更新 更多