在emacs中启动emacsclient(就像magit一样)

时间:2014-07-10 17:33:30

标签: emacs emacsclient

我正在寻找在shell模式下启动emacs的方法,我希望客户端连接到封闭的emacs实例,因此我不需要切换到运行服务器的实例来编辑文件。 / p>

我觉得它是可行的,因为magit已经做了类似这样的事情:提交消息由emacsclient编辑,并且总是在封闭的实例中打开。我甚至不需要明确启动服务器!

我的主要用法是从shell模式执行git commit。我不能依赖magit,因为我必须使用一些带有特殊命令的自定义git版本。无论如何,我认为这样做很酷。

更新:

我在这里发现了魔术函数magit-with-emacsclienthttps://github.com/magit/magit/blob/master/magit.el#L1979

任何有关将该函数转换为可作为git默认编辑器的shell脚本的帮助将不胜感激!如果我可以使它工作,我也会尝试发布代码。

更新2:

这是我的解决方案。它需要事先使用套接字名称中的pid启动服务器,然后将$EDITOR设置为emacsclient连接到该服务器。

将它放在你的init.el

; start a server with a pid
(require 'server)
(defun server-start-pid ()
  (interactive)
  (when (server-running-p server-name)
    (setq server-name (format "server%s" (emacs-pid)))
    (when (server-running-p server-name)
      (server-force-delete server-name)))
  (server-start))

并在server-start-pid

中启动编辑器之前运行shell-mode

将此脚本emacsclient-pid放入PATH。它递归地找到父进程,直到找到emacs实例并在右侧套接字上调用emacsclient

#! /usr/bin/python
import os, sys
import psutil

def get_pid(name):
    pid = os.getppid()
    while True:
        proc = psutil.Process(pid)
        if name in proc.name():
            break
        pid = proc.ppid()
    return pid

if __name__ == '__main__':
    pid = get_pid("emacs")
    # pass the argument to emacsclient
    args = ' '.join(sys.argv[1:])
    cmd = "emacsclient -s server{pid} {args}".format(**globals())
    print cmd
    os.system(cmd)

并将其放入.bashrc

if [[ $EMACS"x" == tx || $TERM"x" == dumbx ]]; then
    export PAGER=/bin/cat
    export EDITOR='emacsclient-pid'
else
    export PAGER=/usr/bin/less
    export EDITOR='emacs -q -nw'
fi

1 个答案:

答案 0 :(得分:4)

我已将负责客户端 - 服务器交互的代码拆分为单独的库with-editor。它是git-modes的下一个分支的一部分。一旦我将下一个分支合并到master中,Magit就会开始使用它。你应该研究它而不是magit本身的旧实现,因为它将所有与此相关的东西放在一个地方,因为它在很多方面也得到了改进。例如。它在使用tramp时也有效。

除了magit之外,

with-editors可以被其他包使用。这就是为什么我把它拆分成一个单独的库/包的原因之一。但是我还没有实现magit实际上不需要的部分。例如。它提供的功能也可以与shell-command一起使用,请参阅https://github.com/magit/git-modes/pull/96

类似的东西也可能适用于shell模式。从很快的角度来看,我认为在这种情况下需要建议的功能是comint-exec。我很可能不会很快解决这个问题,但最终我会回到这一点。同时自己看看那个图书馆。但是,如果没有elisp的知识以及emacs如何处理子进程,理解它的作用并不容易。我在这里给你的唯一建议是阅读github上with-editor存储库中magit/git-modes所涉及的问题。

聚苯乙烯。将其转换为shell脚本将不起作用,因为在启动子进程之前必须在Emacs中执行某些操作,例如启动服务器。