【问题标题】:How to remove the prompt for killing emacsclient buffers?如何去除杀掉emacsclient缓冲区的提示?
【发布时间】:2008-11-06 09:39:15
【问题描述】:

使用 emacsclient 打开某些内容后,当我终止该缓冲区 (C-x k) 时,我会看到一个确认对话框:

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

但是当我杀死直接从 Emacs 打开的缓冲区时,我没有。有没有办法在emacsclient打开时不获取?

【问题讨论】:

  • 请注意,当您使用 emacsclient 编辑文件时,Emacs 会告诉您使用 C-x # 告诉服务器您何时完成了文件。如果你这样做(而不是C-x k),你就不会被问到这个问题。

标签: emacs emacsclient


【解决方案1】:

另一个选项是将-n 选项与emacsclient 一起使用,这样它就不会在退出之前等待文件被编辑。

例如:

emacsclient -n myfile.txt

【讨论】:

  • 谢谢!它比其他解决方案(对我来说)有好处,在缓冲区被杀死时不关闭帧,在这种情况下,emacsclient 使用“-c”选项创建了一个新帧。
  • 注意:-n (--no-wait) 不是你想要的,如果你有一个等待文件完成编辑的程序。
【解决方案2】:

这对我有用:

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

有更多关于Using Emacsclient blog entry的信息。

【讨论】:

  • 我不知道是否适合我赞成这个答案,但据我所知它是正确的,所以:-)
  • 如果 emacs 是使用 emacsclient 的“ALTERNATE_EDITOR”行为启动的,这将不起作用......在这种情况下,你可以这样做 (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)
  • 我会小心点移除挂钩。来自文件“server.el”: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.
【解决方案3】:

您可以设置键盘命令 C-x k 以便将客户端缓冲区标记为完成并终止普通缓冲区

我无耻地从 Emacs Wiki 的 Emacs Client 条目中窃取了这段代码 sn-p:

(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.

【讨论】:

    【解决方案4】:

    无论出于何种原因,我必须在 emacs23 上手动启动 remove-hook 解决方案,可能是因为在加载 .emacs 之后加载了服务器的某些部分。在 (remove-hook ...) 之前向我的 .emacs 添加一个虚拟 (server-start) 行没有帮助。所以我选择了以下原则性较低的解决方案:

    (defalias 'server-kill-buffer-query-function '(lambda () t))
    

    【讨论】:

    • 您应该能够使用(eval-after-load "server" '(remove-hook ...)) 来处理加载顺序问题(尽管如果服务器库尚未加载,那么您的别名在加载后应该会被破坏,所以也许有别的东西在搞乱之后的钩子??)
    • @phils 似乎没有使用,如果我通过 emacsclient -t (export ALTERNATE_EDITOR=) 启动 emacs。
    • 嗯,没错。我看到(肯定是在 24.5 中)该功能仅在 server-start 期间添加,因此在库加载后不会立即删除。看起来您可以在 server-start 上使用 after-advice,或者使用 server-visit-hook(在这种情况下代码可能会重复运行,但在这种情况下这不是问题)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    相关资源
    最近更新 更多