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

时间:2009-05-22 23:09:41

标签: emacs elisp

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

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

在这种情况下,我想使用左下角窗口显示迷你缓冲区完成列表。

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

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

3 个答案:

答案 0 :(得分:9)

在开始尝试使用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*来实现,或者,如果已经显示了2个或更多窗口,则使用左下角窗口显示*Completions*

答案 1 :(得分:1)

可能会做出你想做的事情,这是一个有点作弊的答案:

使用

手动将左下窗口设为* Completions *缓冲区
C-x b *Completions* RET

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

其他可能性:

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

答案 2 :(得分:0)

不像Trey的回答那么强大,但似乎也粗暴地运作。

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

这仅在您不介意锁定第3个窗口时才有效。不幸的是,它仍然会不时尝试使用第一个窗口(这不太令人沮丧,但仍然是不可取的)。

注意:我刚试过Trey的解决方案,现在就可以了,所以我建议人们使用它。