Make*Buffer List*始终以水平分割显示

tij*_*agi 7 emacs

我知道Emacs试图成为知识分子并根据窗口的哪个维度更大来打开辅助缓冲区,因此如果当前宽度大于高度,它可能出现在垂直分割窗口中,否则会出现在水平分割中.

但是我更喜欢它总是在水平分割中打开该列表,因为当缓冲区被放置在垂直分割中时,我看不到长路径.我怎样才能做到这一点?

phi*_*ils 5

我相信你有水平/垂直分割术语从前面(我永远不会记得哪个是哪个),但是由于你的目标是保留原始窗口的宽度,我强迫垂直分割.

C-hf split-window-sensibly RET.它告诉你该怎么做:

You can enforce this function to not split WINDOW horizontally,
by setting (or binding) the variable `split-width-threshold' to
nil.  If, in addition, you set `split-height-threshold' to zero,
chances increase that this function does split WINDOW vertically.
Run Code Online (Sandbox Code Playgroud)

所以作为一个永久的设置:

(setq split-width-threshold nil)
(setq split-height-threshold 0)
Run Code Online (Sandbox Code Playgroud)

对于特定功能,您可以建议该功能(但请参阅下面的编辑2!):

(defadvice list-buffers (around list-buffers-split-vertically)
  "Always split vertically when displaying the buffer list.
See `split-window-sensibly'."
  (let ((split-width-threshold nil)
        (split-height-threshold 0))
    ad-do-it))
(ad-activate 'list-buffers)
Run Code Online (Sandbox Code Playgroud)

编辑:实际上,在这种情况下,我怀疑你只关心交互式案例,在这种情况下,最好定义一个函数并重新映射绑定:

(defun my-list-buffers-vertical-split ()
  "`list-buffers', but forcing a vertical split.
    See `split-window-sensibly'."
  (interactive)
  (let ((split-width-threshold nil)
        (split-height-threshold 0))
    (call-interactively 'list-buffers)))

(global-set-key [remap list-buffers] 'my-list-buffers-vertical-split)
Run Code Online (Sandbox Code Playgroud)

编辑2: Stefan指出,在display-buffer-alist没有建议功能的情况下促进这些事情(当然,避免不必要的建议总是一件好事).我相信我们仍然需要自定义操作,所以:

(defun my-display-buffer-pop-up-same-width-window (buffer alist)
  "A `display-buffer' ACTION forcing a vertical window split.
    See `split-window-sensibly' and `display-buffer-pop-up-window'."
  (let ((split-width-threshold nil)
        (split-height-threshold 0))
    (display-buffer-pop-up-window buffer alist)))

(add-to-list 'display-buffer-alist
             '("\\*Buffer List\\*" my-display-buffer-pop-up-same-width-window))
Run Code Online (Sandbox Code Playgroud)