如何去除杀死emacsclient缓冲区的提示?

24

我使用emacsclient打开文件后,当我关闭这个buffer(C-x k)时,会弹出确认对话框:

Buffer `blah' still has clients; kill it? (yes or no)

但是,当我关闭直接从Emacs打开的缓冲区时,这种情况就不会发生。是否有一种方法可以在emacsclient打开它们时不获取它们?


请注意,当您使用emacsclient编辑文件时,Emacs会告诉您使用C-x#来告诉服务器您何时完成文件的编辑。如果您这样做(而不是使用C-x k),则不会询问您是否要保存文件。 - phils
5个回答

22
另一个选择是使用emacsclient-n选项,这样它在退出之前不必等待文件被编辑。
例如:
emacsclient -n myfile.txt

谢谢!相比其他解决方案,它对我有好处,因为当缓冲区被杀死时,它不会关闭框架,在这种情况下,emacsclient使用“-c”选项创建了一个新的框架。 - rafak
3
请注意:如果您有一个程序正在等待文件完成编辑,那么“-n”(“--no-wait”)不是您想要的选项。 - Sam Hasler

21

这个对我有用:

(remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)

使用Emacsclient博客文章中有更多信息。


我不知道是否适合我点赞这个答案,但据我所知它是正确的,所以 :-) - ShreevatsaR
4
如果使用emacsclient的"ALTERNATE_EDITOR"行为启动了Emacs,则此方法将无效...在这种情况下,您可以执行以下操作: (defun server-remove-kill-buffer-hook () (remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)) (add-hook 'server-visit-hook 'server-remove-kill-buffer-hook) 这段代码的作用是取消 Emacs 客户端使用emacsclient时出现的一个提示对话框。如果您使用的是“ALTERNATE_EDITOR”行为来打开 Emacs,则会发生这种情况。 - Woodrow Douglass
1
我会小心地移除钩子。从文件“server.el”中:在杀死服务器缓冲区之前询问。有人建议释放其客户端,但我认为这很危险--客户端将继续使用该文件中磁盘上的任何内容。-- rms. - mzuther

1
你可以设置键盘命令C-x k,这样它就可以将客户端缓冲区标记为已完成并杀死普通缓冲区
我毫不羞愧地从Emacs Wiki中的 Emacs Client条目中窃取了这段代码片段。
(add-hook 'server-switch-hook
      (lambda ()
        (when (current-local-map)
          (use-local-map (copy-keymap (current-local-map))))
        (when server-buffer-clients
          (local-set-key (kbd "C-x k") 'server-edit))))

虽然这不能帮助解决其他杀死缓冲区的方式(例如M-x list-buffers),但它应该在尊重Emacs客户端行为方面保持安全,以满足一些shell脚本的期望。
这里是您的Emacs发行版中文件server.el的摘录,可能会对我所说的有所启示:
;; When you finish editing a Server buffer, again call server-edit
;; to mark that buffer as done for the client and switch to the next
;; Server buffer.  When all the buffers for a client have been edited
;; and exited with server-edit, the client "editor" will return
;; to the program that invoked it.

后面有一个明确的警告,不应该杀死缓冲区,而是释放它(至少我是这样理解的):

;; Ask before killing a server buffer.
;; It was suggested to release its client instead,
;; but I think that is dangerous--the client would proceed
;; using whatever is on disk in that file. -- rms.

0

如果你正在使用C-x #退出客户端返回终端,我有一些技巧可以避免提示:

(defun cxa/yes-never-no (&rest _args)
  "Override `y-or-n-p' to always retrun t."
  t)

(defun cxa/yes-then-restore (orig-fun &rest args)
  "Make `y-or-n-p' always return t before ORIG-FUN, and restore after applied ARGS."
  (advice-add 'y-or-n-p :override 'cxa/yes-never-no)
  (apply orig-fun args)
  (advice-remove 'y-or-n-p 'cxa/yes-never-no))

(advice-add 'server-done :around 'cxa/yes-then-restore)

0
无论出于何种原因,在emacs23上我必须手动启动remove-hook解决方案,可能是因为某些服务器的部分在加载.emacs之后才加载。在(remove-hook ...)之前向我的.emacs添加一个虚拟的(server-start)行并没有帮助。因此,我选择了以下不太规范的解决方案:
(defalias 'server-kill-buffer-query-function '(lambda () t))

1
你应该能够使用(eval-after-load "server" '(remove-hook ...))来处理加载顺序问题(尽管如果服务器库尚未加载,则一旦它加载,您的别名就会被覆盖,因此可能是其他东西在您之后干扰了钩子?) - phils
@phils 看起来没有用,如果我通过emacsclient -t(export ALTERNATE_EDITOR=)启动emacs。 - netawater
嗯,确实。我看到(至少在24.5中)该函数仅在server-start期间添加,因此在库加载后无法立即删除。看起来您可以在server-start上使用after-advice,或者使用server-visit-hook(在这种情况下,代码可能会重复运行,但在这种情况下不是问题)。 - phils

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接