在我用 emacsclient 打开某些东西后,当我杀死那个缓冲区(Cx k)时,我得到一个确认对话框:
Buffer `blah' still has clients; kill it? (yes or no)
但是当我杀死直接从 Emacs 打开的缓冲区时,我没有。有没有办法在 emacsclient 打开它们时不获取它们?
在我用 emacsclient 打开某些东西后,当我杀死那个缓冲区(Cx k)时,我得到一个确认对话框:
Buffer `blah' still has clients; kill it? (yes or no)
但是当我杀死直接从 Emacs 打开的缓冲区时,我没有。有没有办法在 emacsclient 打开它们时不获取它们?
另一个选项是使用-n
选项 withemacsclient
以便它在退出之前不等待文件被编辑。
例如:
emacsclient -n myfile.txt
这对我有用:
(remove-hook 'kill-buffer-query-functions 'server-kill-buffer-query-function)
有关使用 Emacsclient 博客条目的更多信息。
您可以设置键盘命令Cx 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
)没有帮助,但通过尊重某些 shell 脚本所期望的 Emacs 客户端行为,它应该是安全的。
这是 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.
无论出于何种原因,我必须在 emacs23 上手动启动 remove-hook 解决方案,可能是因为在加载 .emacs 之后加载了服务器的某些部分。在 (remove-hook ...) 之前向我的 .emacs 添加一个虚拟 (server-start) 行没有帮助。所以我选择了以下原则性较低的解决方案:
(defalias 'server-kill-buffer-query-function '(lambda () t))