我使用windows批处理文件使用emacsclientw.exe在已经运行的Emacs实例中打开文件。但是,以这种方式打开的任何文件都是在服务器模式下打开的,这意味着我必须使用C-x#来杀死它,而不是通常的C-x k。如何更改此行为?
答案 0 :(得分:7)
我的解决方案是将它(实际上是M-w)重新绑定到:
(lambda ()
(interactive)
(if server-buffer-clients
(server-edit)
(kill-this-buffer)))
[编辑:现在已经阅读了服务器编辑的代码,最好使用服务器完成(取决于你想要的)。 server-edit会将您切换到服务器编辑的缓冲区(如果仍然存在),但服务器完成只会切换到下一个缓冲区。您还可以使用server-done的输出来查看缓冲区是否实际被杀死(如果文件在调用emacsclient之前打开则不是这种情况)然后如果没有则将其终止。或者使用其他地方建议的server-kill-buffer。]
答案 1 :(得分:7)
以下是我在.emacs中添加的内容:
(add-hook 'server-switch-hook
(lambda ()
(local-set-key (kbd "C-x k") '(lambda ()
(interactive)
(if server-buffer-clients
(server-edit)
(ido-kill-buffer))))))
就像这个Cx k工作时常用的方式当我没有从emacsclient找到一个文件(对我来说就是ido-kill-buffer),如果我正在使用emacsclient,如果是客户端,Cx k会进行服务器编辑正在等待,否则运行ido-kill-buffer(如果我使用了emacsclient -n)。
答案 2 :(得分:5)
使用:
D:\> emacsclientw -n foo.txt
< - > -n说“没有等待”。这是关于RELEASE(以及许多以前的版本,IIRC)的2008-03-26的GNU Emacs 22.2.1(i386-mingw-nt5.1.2600)。
答案 3 :(得分:4)
你知道,我讨厌建议解决方法而不是真正的解决方案......但是在阅读了服务器代码之后,我对emacs如何确定缓冲区是服务器缓冲区感到困惑。
考虑到这一点,为什么不打开像:
这样的文件emacsclient --eval '(find-file "/path/to/file")'
这样emacs就不知道你的缓冲区是通过emacsclient打开的,这听起来就像你真正想要的那样。
编辑:
我对此并不满意,但似乎有效:
(global-set-key (kbd "C-x k") (lambda () (interactive) (server-kill-buffer (current-buffer))))
答案 4 :(得分:2)
好的,这对我有用:
(global-set-key (kbd "C-x k") '(lambda ()
(interactive)
(if server-buffer-clients
(server-done)
(kill-this-buffer))))
(这是来自IvanAndrus答案的代码,其中包含编辑和评论的明确更改,以及使用jrockway的键绑定。)
而且,是的 - 我正在重新绑定一个标准的键绑定。但它是一个功能替代品,而不是完全不同的东西(例如,用kill-buffer东西代替kill-ring-save)。
顺便说一下,EmacsWiki有关于这个主题的几页 - KillKey和KillingBuffer - 这些都没有为我提供比上面更好的亮点(虽然KillKey的第一个功能也被使用了“服务器编辑” ...)。答案 5 :(得分:0)
我不确定这是否适用于Windows,但在linux上,emacs -daemon非常棒。 有了它,您不必运行不同的程序,并且您的绑定是相同的。我想还有其他优点,但由于我永远无法学习那些emacsclient绑定,我从来没有真正使用它,也不能说。
我认为-daemon尚未发布,我使用的是CVS的23.0.60.1。