在Emacs中,我如何更改迷你缓冲区完成列表窗口?

7

我想为迷你缓冲区完成列表设置特定的窗口。目前,我的配置中有3个窗口:

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

在这种情况下,我想使用左下角的窗口来显示迷你缓冲区完成列表。
目前,它似乎随机选择一个窗口,大多数情况下喜欢使用最右边的窗口,但该窗口太窄了,无法显示完成列表,必须水平滚动,这很烦人。
此外,我正在使用一个名为revive.el的lisp脚本,当我加载Emacs时,从文件(~/.revive.el)中恢复我的窗口配置。

它似乎是最近最少使用的窗口... - Trey Jackson
嗯,我不太确定——对我来说似乎不是那么可预测的......有时候,它喜欢使用左下角,但会将其大小调整为屏幕高度的一半;这很烦人,因为我喜欢在左上角有很多编辑代码的空间。 - Nick Bolton
这并不是 OP 想要的,但可以通过使用 Tomohiro Matsuyama 的 popwin.el 让完成功能在一个专用窗口中显示:https://github.com/m2ym/popwin-el - Leo Alekseyev
3个回答

10

在尝试使用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。 - Svante
看起来 minibuffer-complete 在第一次调用时将变量设置为 nil。我不确定该变量如何自定义。 - Trey Jackson
哎呀,你指定的my-minibuffer-setup-hook函数对我来说似乎没有任何效果。 - Nick Bolton
自从您的更新之后,我可以确认它正在工作! :) 非常感谢,非常完美。 - Nick Bolton

1
一个稍微有点作弊的答案,但也许可以满足你的需求:
手动将左下角的窗口设置为 *Completions* 缓冲区。
C-x b *Completions* RET

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

其他可能性:

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

我已经尝试了两种方法,但似乎无法让它们记住要用于“Completions”缓冲区的窗口。不管怎样,还是谢谢! - Nick Bolton
哦,还有,是的,我知道更改窗口缓冲区是解决问题的一种方法 - 但正如你可能知道的那样,这只是暂时的。下次我在迷你缓冲区上按tab键时,它不会使用上次使用的窗口。非常令人沮丧。 - Nick Bolton

0

不如 Trey 的答案稳健,但似乎也以一种粗糙的方式工作。

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

仅当您不介意第三个窗口被锁定时,此方法才有效。不幸的是,它仍会尝试不时使用第一个窗口(这较不令人沮丧,但仍不理想)。

注意:我刚试过Trey的解决方案,现在它能用,所以我建议大家使用它。


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