【问题标题】:emacs dispatch help window from original bufferemacs 从原始缓冲区调度帮助窗口
【发布时间】:2016-07-30 02:28:47
【问题描述】:

每当我在 emacs 中执行 apropos、describe-key 或其他一些帮助功能时,它都会在我的其他窗口中显示帮助。为了摆脱它,我必须更改窗口/缓冲区到那里,输入“q”,然后改回我原来的工作缓冲区。

有没有办法在代码中以某种方式做到这一点?我知道如何保存偏移、切换缓冲区等,但是当我在另一个缓冲区结束时,我不知道如何将“q”发送到 minibuffer/emacs。谢谢

【问题讨论】:

  • 帮助缓冲区有help-window-select,如下所述。不过总的来说,您可能对 shackle 包感兴趣 (github.com/wasamasa/shackle)。

标签: emacs


【解决方案1】:

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

对于 apropos 窗口或任何使用 display-buffer 的窗口,您都可以使用。

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

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

【讨论】:

  • 感谢您快速、准确的回复!我们已经成功了一半。设置变量确实可以解决 describe-key 的问题,但不能解决 Apropos 显示的问题。我检查了等效的 apropos 变量(describe-variable apropos),但它们都不像帮助窗口选择。想法?
  • 抱歉延迟重播,我用一些关于 apropos 缓冲区的信息编辑了我的答案。我使用类似的命令在与当前相同的窗口中打开 shell,而不是在不同的窗口中。希望对您有所帮助。
  • 谢谢朱尔斯。我想最好让它覆盖我当前的缓冲区,因为这样很容易分派。比必须去那里输入 q 更好...再次感谢您。
  • @Kevin 是的,我也是这么想的,如果你能找到更好的方法,我很想知道!
【解决方案2】:

我建议将(winner-mode 1) 放入您的init 文件中,然后使用Cc 调用winner-undo(如有必要,可重复)返回到以前的窗口配置。

【讨论】:

  • 好的,谢谢你的提示。我已经有了胜利者模式。(但奇怪的是,几乎从不使用它,因为 ctrl-x o 的旧习惯很难改掉......)在 Emacs 的引擎盖下有很多缓冲区/窗口魔法。我不知道为什么 Apropos 不能算作帮助窗口——它以相同的方式发送(带有 q)。那好吧。我有一些现在可以工作的东西,等等。
  • apropos-modehelp-mode 是不同的主要模式。但是,它们都派生自 special-mode(它提供了该键绑定)。
  • YMMV,但我只能建议您更习惯于使用winner-undo(如果有帮助的话,也许可以将其绑定到更简单的按键序列)。我发现它绝对是无价之宝,因为它是解决与此类似的各种问题的通用解决方案,并且可以方便地恢复我有意进行的窗口更改。
【解决方案3】:

这是我对这个问题的解决方案。我将此命令绑定到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 对话并说“杀死所有这些家伙”。而且还可以扩展,这很好。感谢您贡献代码。
猜你喜欢
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多