【问题标题】:In Emacs, how do I change the minibuffer completion list window?在 Emacs 中,如何更改 minibuffer 完成列表窗口?
【发布时间】:2009-05-22 23:09:41
【问题描述】:

我想为 minibuffer 完成列表设置一个特定的窗口。目前,我在此配置中有 3 个窗口:

 ______
|    | |
|____| |
|____|_|

在这种情况下,我想使用左下角的窗口作为 minibuffer 完成列表。

目前,它似乎是一个随机的窗口,并且大多数时候它喜欢使用最右边的窗口,它太薄而无法显示完成列表而不必水平滚动,这很烦人。

另外,当我加载 Emacs 时,我正在使用一个名为 revive.el 的 lisp 脚本从文件 (~/.revive.el) 中恢复我的窗口配置。

【问题讨论】:

  • 它似乎是最近最少使用的窗口...
  • 嗯,我不确定 - 这对我来说似乎不是那么可预测...有时,它喜欢使用左下角,但它会将其大小调整为屏幕高度的一半;这很烦人,因为我喜欢在左上角有很多空间来编辑代码。
  • 注意 OP 想要什么,但是可以使用 Tomohiro Matsuyama 的 popwin.el 使完成缓冲区出现在​​专用窗口中:github.com/m2ym/popwin-el

标签: emacs elisp


【解决方案1】:

在开始尝试使用minibuffer-scroll-window 的路径之后(事实证明这不是用户可自定义的)。我试过这种方法:

(add-to-list 'special-display-buffer-names '("*Completions*" my-display-completions))

(defun my-display-completions (buf)
  "put the *completions* buffer in the right spot"
  (let ((windows (delete (minibuffer-window) (window-list))))
    (if (eq 1 (length windows))
        (progn 
          (select-window (car windows))
          (split-window-vertically)))
    (let ((target-window (window-at 0 (- (frame-height) 2)))
          (pop-up-windows t))
      (set-window-buffer target-window buf)
      target-window)))

通过将唯一的窗口一分为二并在底部窗口中显示*Completions*,或者,如果已经显示了两个或更多窗口,则使用左下角的窗口显示*Completions*

【讨论】:

  • 也许你需要使用 setq-default 而不是 setq。
  • 看起来 minibuffer-complete 在第一次调用时将变量设置为 nil。我不确定如何自定义该变量。
  • 嗯,您指定的 my-minibuffer-setup-hook 函数似乎对我没有任何作用。
  • 自从您更新后,我可以确认它正在工作! :) 非常感谢,非常完美。
【解决方案2】:

一个有点作弊的答案,可能做你想做的事:

使用手动将左下方窗口设置为 *Completions* 缓冲区

C-x b *Completions* RET

当光标在该窗口中处于活动状态时。然后,每当 minibuffer 必须显示一些完成时,它应该总是使用这个特定的窗口。但是,这将依赖于该缓冲区始终保持打开和可见 - 可能不是您想要的?

其他可能性:

  1. 查看“Icicles”是否有帮助 - 例如它提到“有很多 Icicles 功能可以增强‘*Completions*’的显示和行为”。
  2. Minibuffer Commands That Do Completion 可能有用吗?

【讨论】:

  • 我都试过了,但我似乎无法让他们记住要用于 Completions 缓冲区的窗口。还是谢谢!
  • 哦,另外,是的,我知道更改窗口的缓冲区是解决问题的一种方法 - 但您可能知道,它是暂时的。下次我在 minibuffer 上按 tab 时,它不会使用上次使用的窗口。非常令人沮丧。
【解决方案3】:

不像 Trey 的回答那样健壮,但似乎也以粗略的方式工作。

; Go to the 3rd window, and make it dedicated.
(other-window 2)
(set-window-dedicated-p (selected-window) 1)

这仅在您不介意第三个窗口被锁定时才有效。不幸的是,它仍然会不时尝试使用第一个窗口(这不那么令人沮丧,但仍然不受欢迎)。

注意:我刚刚尝试了 Trey 的解决方案,现在效果很好,所以我建议人们使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2023-04-01
    • 2021-12-13
    • 2014-01-28
    • 2013-10-23
    • 2011-06-26
    • 2012-08-18
    相关资源
    最近更新 更多