我正在寻找在shell模式下启动emacs的方法,我希望客户端连接到封闭的emacs实例,因此我不需要切换到运行服务器的实例来编辑文件。 / p>
我觉得它是可行的,因为magit已经做了类似这样的事情:提交消息由emacsclient编辑,并且总是在封闭的实例中打开。我甚至不需要明确启动服务器!
我的主要用法是从shell模式执行git commit。我不能依赖magit,因为我必须使用一些带有特殊命令的自定义git版本。无论如何,我认为这样做很酷。
更新:
我在这里发现了魔术函数magit-with-emacsclient
:
https://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
答案 0 :(得分:4)
我已将负责客户端 - 服务器交互的代码拆分为单独的库with-editor
。它是git-modes的下一个分支的一部分。一旦我将其下一个分支合并到master中,Magit就会开始使用它。你应该研究它而不是magit本身的旧实现,因为它将所有与此相关的东西放在一个地方,因为它在很多方面也得到了改进。例如。它在使用tramp时也有效。
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中执行某些操作,例如启动服务器。