如何防止Emacs的dired将窗口分割成两个以上?

10
在Emacs dired缓冲区中,如果我将光标移到文件名上并按下 o 键来执行 dired-find-file-other-window ,dired成功地产生了所需的效果:在一个次要窗口中打开该文件。
但是,如果我再将光标移到第二个文件名上然后再次按下 o ,dired会再次分割当前框架并在第三个窗口中打开该文件。
如何指示dired重用第二个窗口,以便在一个框架中最多有两个窗口?

1
我没有看到这种行为,无论是使用原始的dired.el还是使用dired+.el。如果你使用emacs -Q启动Emacs时没有发生这种情况,请递归地进行二分法调试以找到引起这种行为的代码。通过注释掉你初始化文件的 1/2、3/4、7/8 等部分来实现这一点。您可以使用 comment-region 命令来注释和(使用 C-u)取消注释区域。 - Drew
第二个窗口中使用 aRET 代替 o 怎么样? - Rangi Lin
2个回答

7

尝试通过修改split-width-threshold的值来解决相同的问题,但发现当监视器配置更改时,它经常停止工作。最终编写了一个有关window-splittable-p的建议。

(setq split-width-threshold (- (window-width) 10))
(setq split-height-threshold nil)

(defun count-visible-buffers (&optional frame)
  "Count how many buffers are currently being shown. Defaults to selected frame."
  (length (mapcar #'window-buffer (window-list frame))))

(defun do-not-split-more-than-two-windows (window &optional horizontal)
  (if (and horizontal (> (count-visible-buffers) 1))
      nil
    t))

(advice-add 'window-splittable-p :before-while #'do-not-split-more-than-two-windows)

为什么count-visible-buffers需要对缓冲区进行mapcar?考虑到一个窗口一次只能显示一个缓冲区,计算window-list不就足够了吗? - BiagioF

5
split-height-threshold的值提高到不会再次分割的程度。
如果Emacs认为这样分割更聪明,您可能还需要提高split-width-threshold
关于评论中的问题:
我认为选择的值取决于窗口显示的行数。假设显示了40行,则剩下20行。然后,15的“split-height-threshold”应该防止进一步分割。防止进一步的并排拆分应该也可以起作用,只需考虑所显示的列即可。
顺便说一句,希望有一种动态调整它的方法。

我找到了有问题的代码:(setq split-width-threshold 0),我用它来强制Emacs分割框架,创建两个并排的窗口而不是一个窗口在另一个上面。现在我的新问题是,如何强制Emacs将框架分割成并排的窗口,而不使其生成超过2个? - incandescentman
我应该选择什么值? - incandescentman
(setq split-width-threshold 75) 对我来说似乎是有效的。 - incandescentman

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