如何获得明智的拆分窗口政策?


13

Emacs不断开发新的窗口,最近一直毁了我的一天。创建Windows时如何告诉emacs使用以下策略?

  • 偏好垂直分割
  • 当窗口少于80列时,停止垂直分割。
  • 当窗口少于60行时,停止水平分割。
  • 当我到达此6x6网格时,请在我的27英寸显示器上开始重复使用Windows!

另外,我希望窗口始终保持平衡,但是每次拆分都会使寡妇的大小保持不平衡。我宁愿有3个大小相等的窗口,而不是1个大窗口和两个小窗口!是否有此设置,还是放置平衡窗口建议的明智之地?


哪些操作正在创建拆分窗口?
Andrew Swann

我最近主要在进行Clojure编程,所以苹果酒命令如:苹果酒测试运行测试,苹果酒查找
变量

1
大多数人对打开源代码(例如苹果酒 -stuff)以对其进行自定义以满足他们的需求并不感兴趣。相反,他们会寻找简单的修复方法,例如自定义display-buffer-alist。其他人只是在事实发生后以编程方式对其进行修复-例如,delete-windowswitch-to-buffer,垂直/水平拆分等。并且,还有一些其他库可帮助管理窗口和/或还原为先前的布局。我更喜欢第一种选择-即修改源并使之绝对完美,但我是少数人。
法律列表

5
看一看在手册中关于窗口分割的部分- split-height-thresholdsplit-width-threshold- gnu.org/software/emacs/manual/html_node/emacs/...
lawlist

1
听起来您想定义一个自定义ACTION函数以与中的非常通用的CONDITION一起使用display-buffer-alist。请参阅display-bufferACTION函数的要求(以及标准函数的列表,可以检查的代码),但是它将负责以您希望的任何方式显示缓冲区(并且肯定可以在以后平衡窗口) 。
菲利浦斯,2016年

Answers:


2

我已经使用了很长时间了。您可能需要对其进行编辑以适应您自己的首选样式。

;; ------------------------------------------------------------------
;; display-buffer

;; The default behaviour of `display-buffer' is to always create a new
;; window. As I normally use a large display sporting a number of
;; side-by-side windows, this is a bit obnoxious.
;;
;; The code below will make Emacs reuse existing windows, with the
;; exception that if have a single window open in a large display, it
;; will be split horisontally.

(setq pop-up-windows nil)

(defun my-display-buffer-function (buf not-this-window)
  (if (and (not pop-up-frames)
           (one-window-p)
           (or not-this-window
               (not (eq (window-buffer (selected-window)) buf)))
           (> (frame-width) 162))
      (split-window-horizontally))
  ;; Note: Some modules sets `pop-up-windows' to t before calling
  ;; `display-buffer' -- Why, oh, why!
  (let ((display-buffer-function nil)
        (pop-up-windows nil))
    (display-buffer buf not-this-window)))

(setq display-buffer-function 'my-display-buffer-function)

2

有点晚了,但是因为我也在搜索这个,但是找不到一个好的解决方案:

您可以定义自己的split-window-sensibly功能。
为此,请将以下内容放入您的init.el

(setq split-height-threshold 120
      split-width-threshold 160)

(defun my-split-window-sensibly (&optional window)
    "replacement `split-window-sensibly' function which prefers vertical splits"
    (interactive)
    (let ((window (or window (selected-window))))
        (or (and (window-splittable-p window t)
                 (with-selected-window window
                     (split-window-right)))
            (and (window-splittable-p window)
                 (with-selected-window window
                     (split-window-below))))))

(setq split-window-preferred-function #'my-split-window-sensibly)

注意:阈值必须是允许的最小窗口的两倍,因为新窗口各自使用以前窗口大小的一半。
最后一行告诉emacs使用定义的split函数。


0

这将使您更喜欢垂直拆分

(setq split-width-threshold 1)

0

(setq split-height-threshold nil) (setq split-width-threshold 200)

  • 设置split-height-threshold为基本上从不希望水平拆分
  • 200 似乎数量足够多,即使在大型外部显示器上,Emacs最多也只会分裂一次。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.