从原始缓冲区调度Emacs帮助窗口

5
每当我在emacs中使用apropos、describe-key或其他帮助函数时,它都会在我的另一个窗口显示帮助信息。为了摆脱它,我必须切换窗口/缓冲区去那里,输入"q",然后再切换回我的原始工作缓冲区。
有没有一种方法可以通过代码来实现这个功能呢?我知道如何使用save-excursion、switch buffers等命令,但我不知道如何在我处于另一个缓冲区时向minibuffer/emacs发送"q"。谢谢。

帮助缓冲区如下所述具有help-window-select。一般而言,您可能会对shackle包(https://github.com/wasamasa/shackle)感兴趣。 - jpkotta
3个回答

5

如果您想要的是自动选择帮助窗口,那么help-window-select变量可能正是您需要的。如果将其值设置为true (setq help-window-select t),则通过其中一个帮助命令打开帮助窗口时,它将自动被选中。然后,您可以按q退出并返回到原始缓冲区。还有许多其他选项,因此您也应该检查这些选项。

对于使用display-buffer的apropos窗口或任何其他窗口,您可以使用以下方法。

(add-to-list 'display-buffer-alist
         '("*Apropos*" display-buffer-same-window))

display-buffer-same-window是多个选项之一;它在当前窗口打开缓冲区。查看display-buffer函数的文档可以找到其他可能的选项。


非常感谢您快速、准确地回复!我们已经完成了一半的工作。设置变量确实解决了describe-key的问题,但对于Apropos显示来说并没有用。我查看了等效的apropos变量(describe-variable apropos),但它们中没有一个看起来像帮助窗口选择。有什么想法吗? - Kevin
抱歉回复晚了,我编辑了我的答案并提供了一些关于apropos缓冲区的信息。我使用类似的命令在同一个窗口中打开shell,而不是在另一个窗口中。希望能够帮到你。 - Jules
谢谢Jules。我想最好覆盖当前的缓冲区,因为这样调度起来更容易。比起去那里打字然后再退出来,这样做更好。再次感谢您。 - Kevin
@Kevin 对,我也有同感。如果你找到了更好的方法,记得要告诉我啊! - Jules

1

我建议在你的初始化文件中添加(winner-mode 1),然后使用C-c<left>调用winner-undo(如果需要,可以重复执行)以返回先前的窗口配置。


是的,谢谢你的提示。我已经有了胜利者模式。(但奇怪的是,很少使用它,因为旧习惯难改...)在Emacs中,有很多缓冲区/窗口魔法发生。我不知道为什么Apropos不算作帮助窗口——它以相同的方式分派(使用q)。哦,好吧。我现在有一个可行的方案,所以转向其他事情。 - Kevin
好的,apropos-modehelp-mode是不同的主要模式。它们都派生自special-mode(提供该键绑定)。 - phils
个人经验可能有所不同,但我强烈建议您更加熟悉使用winner-undo(如果需要,可以将其绑定到更简单的键序列)。我发现它是解决各种类似问题的通用解决方案,同时也非常方便地撤消我有意进行的窗口更改。 - phils

1
这是我对这个问题的解决方案。我将此命令绑定到C-c q
(defvar my/help-window-names
  '(
    ;; Ubiquitous help buffers
    "*Help*"
    "*Apropos*"
    "*Messages*"
    "*Completions*"
    ;; Other general buffers
    "*Command History*"
    "*Compile-Log*"
    "*disabled command*")
  "Names of buffers that `my/quit-help-windows' should quit.")

(defun my/quit-help-windows (&optional kill frame)
  "Quit all windows with help-like buffers.

Call `quit-windows-on' for every buffer named in
`my/help-windows-name'.  The optional parameters KILL and FRAME
are just as in `quit-windows-on', except FRAME defaults to t (so
that only windows on the selected frame are considered).

Note that a nil value for FRAME cannot be distinguished from an
omitted parameter and will be ignored; use some other value if
you want to quit windows on all frames."
  (interactive)
  (let ((frame (or frame t)))
    (dolist (name my/help-window-names)
      (ignore-errors
        (quit-windows-on name kill frame)))))

有趣的解决方案——不是用“q”与缓冲区交互,而是与Emacs交互并说“杀掉所有这些家伙”。而且还具有可扩展性,这很好。感谢您贡献代码。 - Kevin

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