7

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

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

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

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

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

4

3 回答 3

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*.

于 2009-05-22T23:44:56.033 回答
1

一个稍微作弊的答案,可能会做你想做的事:

使用手动使左下角窗口成为 *Completions* 缓冲区

C-x b *Completions* RET

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

其他可能性:

  1. 看看“ Icicles ”是否有帮助 - 例如,它提到“有很多 Icicles 功能可以增强 '*Completions*' 的显示和行为”。
  2. 完成完成的 Minibuffer 命令可能有用吗?
于 2009-05-24T05:15:57.450 回答
0

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

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

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

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

于 2009-05-26T15:31:12.340 回答