如何使用C-x k来杀死在服务器模式下打开的Emacs缓冲区?

时间:2009-01-13 01:42:33

标签: emacs

我使用windows批处理文件使用emacsclientw.exe在已经运行的Emacs实例中打开文件。但是,以这种方式打开的任何文件都是在服务器模式下打开的,这意味着我必须使用C-x#来杀死它,而不是通常的C-x k。如何更改此行为?

6 个答案:

答案 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有关于这个主题的几页 - KillKeyKillingBuffer - 这些都没有为我提供比上面更好的亮点(虽然KillKey的第一个功能也被使用了“服务器编辑” ...)。

答案 5 :(得分:0)

我不确定这是否适用于Windows,但在linux上,emacs -daemon非常棒。 有了它,您不必运行不同的程序,并且您的绑定是相同的。我想还有其他优点,但由于我永远无法学习那些emacsclient绑定,我从来没有真正使用它,也不能说。

我认为-daemon尚未发布,我使用的是CVS的23.0.60.1。