我知道在我调用(start-server)现有的Emacs会话后,我可以使用emacsclient -c(在同一台计算机上)创建连接到该服务器的新帧,这样创建的每个新帧emacsclient都可以访问同一组共享状态(例如缓冲区) ).
我发现的大多数文档都集中在"让我快速访问我的本地Emacs"用例,所以有两件事我还没有看到任何细节:
可以emacsclient -c访问由其他用户启动的Emacs服务器,还是仅通过硬连线检测我自己的用户启动的会话?
Emacs服务器(直接或间接)是否支持远程连接?也就是说,有没有办法设置Emacs(可能涉及SSH),允许远程机器emacsclient -c上的调用访问我的Emacs服务器的本地状态?
(如果你还没有猜到,我最终想要做的是结合上面的两种技术来提供基本的协作编辑支持.)
这是一个现实世界的问题,所以这就是我正在使用的:
su或ssh).如果它有所不同,机器在私有LAN上,安装(并运行)OpenSSH客户端和服务器,并且所有用户都可以连接到(他们自己的帐户)所有机器,但它们没有共享文件系统.
那么,有没有人知道Emacs服务器是否可以
编辑
正如在rwb的回答中所评论的那样,很明显,通过运行emacsclient -c在本地打开的新窗口实际上是由远程 Emacs服务器进程创建的.也就是说,emacsclient只是触发服务器中的相关行为.这会导致显示设置不正确的一些问题,因为服务器通常无法访问本地桌面(请参阅下文).但是,如果我使用以下命令序列,我现在可以连接到远程Emacs会话:
在一个终端中,1.22.333.44IP地址在哪里remotehost:
ssh -t -X remotehost \
"emacs -nw --eval
'(progn (setq server-host \"1.22.333.44\" server-use-tcp t) (server-start))'"
Run Code Online (Sandbox Code Playgroud)
然后在另一个(在同一台机器上):
scp remotehost:.emacs.d/server/server /tmp/server-file
DISPLAY=localhost:10 emacsclient -c -f /tmp/server-file
Run Code Online (Sandbox Code Playgroud)
该emacsclient命令使远程Emacs服务器(它找到其中的详细信息/tmp/server-file …
在我用emacsclient打开一些东西后,当我杀死那个缓冲区(Cx k)时,我得到一个确认对话框:
Buffer `blah' still has clients; kill it? (yes or no)
Run Code Online (Sandbox Code Playgroud)
但是当我杀死直接从Emacs打开的缓冲区时,我没有.有没有办法在emacsclient打开它们时不能获取它们?
启动Emacs时,将评估init.el(或.emacs.el).但是,在启动emacsclient时,不会评估类似的lisp代码.
每次打开新的emacsclient时,如何获得要评估的lisp文件?
(这对于特定于帧的自定义很方便.)
我假设答案是使用一些钩子,但我似乎无法找到正确的钩子使用.
我期待着你的回答.
我总是将emacs作为守护进程运行,但是当我想要做出类似的东西时
sudo emacsclient /etc/make.conf
Run Code Online (Sandbox Code Playgroud)
我不能这样做,因为root正在使用另一个emacs,我真的不想运行2个守护进程或等待通常的emacs加载简单文件.
我需要一些解决方案emacsclientsudo /etc/make.conf:)用用户emacs客户端编辑系统文件.
我一直在使用Magit,并且在提交时,它曾经简单地拆分窗口并允许我在同一个emacs会话中提交,但我似乎已将此行为更改为以下内容:
现在,当我提交我的分阶段更改时,一个新的emacs客户端启动,需要一段时间才能加载,最后让我写下我的提交消息.然后我运行Cc Cc来提交.当我关闭此客户端时,提交会完成.
如何强制magit在同一个emacs会话中运行提交而不打开一个全新的客户端?

我使用emacs守护进程来保存我的emacs会话,即使我必须重新启动运行我的X服务器的机器,或者如果我想从另一台机器访问同一会话.这非常有效但是在恢复会话时我非常希望只运行"emacsclient --create-frame --no-wait"来连接守护进程而无需打开新文件.没有指定文件名,它不会让我逃脱.
我已经尝试使用--eval来执行一个函数而不是打开一个文件,但是当评估完成时窗口就会消失.
(Emacs 23.1通过Debian GNU/Linux 5.0上的backports.)
运行emacsclient后如何始终如一地控制窗口焦点?
目前,焦点取决于我是否已经运行emacs服务器.当emacsclient调用另一个编辑器时,焦点将转移到新的emacs窗口.当emacsclient连接到现有的emacs服务器时,焦点不会移位(即它停留在我的putty客户端上).
我想一直关注emacs窗口,因为我打开文件后通常会去emacs.
任何帮助将不胜感激!
笔记
版本信息
emacs: 21.4.1
emacsclient: 21.4
client os: Windows XP Service Pack 3
x server: Exceed 11.0.0.0
Run Code Online (Sandbox Code Playgroud)
我的.bash_profile的相关部分
# a wrapper is needed to sandwich multiple command line arguments in bash
# 2>/dev/null hides
# "emacsclient: can't find socket; have you started the server?"
emacs_wrapper () {
if [ 0 -eq $# ]
then
emacsclient -n -a emacs ~/notes.txt 2>/dev/null &
else
emacsclient -n -a emacs $* &
fi
}
alias x="emacs_wrapper"
Run Code Online (Sandbox Code Playgroud)
另外,在我的.emacs结束时,我有
(server-start)
Run Code Online (Sandbox Code Playgroud)
我目前的解决方法是一个简单的autohotkey脚本,它专注于我的第一个Exceed窗口
^+x:: …Run Code Online (Sandbox Code Playgroud) 如何在不杀死服务器/守护进程的情况下关闭emacsclient框架?
执行C-x C-c或C-x 5 0在gui中将退出帧和服务器(以及其他客户端),而这只是在从终端完成时退出当前帧.
(Ps:我的emacs版本是24.2,gtk.我试过没有init-file看看它是否来自我的配置,但结果是一样的)
这是一个相当基本的问题,但是在emacs的单独框架(make-new-frame)中打开新文件或在emacsclient实例中打开文件之间的实际区别是什么?我可以看到,如果您正在通过终端工作,差异很明显......但emacsclient是否还可以将(buffer-menu)或ido-mode访问的缓冲区列表限制为在该特定emacsclient实例中打开的缓冲区?
我试图在Emacs中找到一个钩子,它应该在emacs服务器正常关闭之前启动.我尝试使用elisp之类的kill-emacs-query-functions,kill-emacs-hook,server-done-hook:
(add-hook 'server-done-hook
'(lambda ()
(savehist-save)
)
)
Run Code Online (Sandbox Code Playgroud)
...但是当操作系统关闭时,它们都不会被调用,因此不会保存历史记录.
也许有人可以暗示一下?
PS我在Gentoo Linux上,emacs-vcs-23.2.9999包,仅限终端.为了测试所需的行为,使用start-stop-daemon实用程序停止Emacs.