将框架中的所有Emacs窗口设置为给定宽度

将框架中的所有Emacs窗口设置为给定宽度,emacs,elisp,Emacs,Elisp,我正在尝试编写一个函数,使Emacs框架中的所有窗口都有120个字符宽。到目前为止,我有: (defun standard-width () "makes the widht of the window 120, our coding standard" (interactive) (delete-other-windows) (set-frame-width (selected-frame) 120 ) ) 但是,我希望这项工作不需要删除其他窗口调用。不幸的是,没有这个调

我正在尝试编写一个函数,使Emacs框架中的所有窗口都有120个字符宽。到目前为止,我有:

(defun standard-width ()
  "makes the widht of the window 120, our coding standard"
  (interactive)
  (delete-other-windows)
  (set-frame-width (selected-frame) 120 )
  )

但是,我希望这项工作不需要
删除其他窗口
调用。不幸的是,没有这个调用,总的帧宽度是120,在窗口之间共享。如何使总框架宽度(水平方向上的最大窗口数)*120

我不知道有什么简单的方法可以做到这一点。我将使用
(windowtree(selected frame))
,解析返回值以找到水平布局的最大窗口数的行,并使用计数计算帧宽度,希望窗口能够正确缩放。如果窗口不能正确缩放,那么我会尝试使用
window.el
中定义的
window resize
函数分别调整它们的大小(在设置帧宽度之后)

窗口树
的返回值格式可在中找到

按照以下函数的思路进行操作:

(defun horizontal-window-count (tree) 
  (if (atom tree)
      1
    (if (car tree)
        (apply 'max (mapcar 'horizontal-window-count (cddr tree)))
      (apply '+ (mapcar 'horizontal-window-count (cddr tree))))))

您将其用作
(水平车窗计数(汽车(车窗树))
。代码可能会被简化,可能会有一些问题,但我的lisp也不是很流利。

这会将框架大小设置为窗口数*120,但“水平窗口数”的含义需要更大的定义

(set-frame-width (selected-frame) (* 120 (length (window-list))))

目前的解决方案是其丑陋的荣耀

(defun horizontal-window-count (tree) 
  (if (atom tree)
      1
    (if (car tree)
        (apply 'max (mapcar 'horizontal-window-count (cddr tree)))
      (apply '+ (mapcar 'horizontal-window-count (cddr tree))))))
(defun horz-count ()
  (horizontal-window-count (car (window-tree))))
(defun standard-width ()
  "makes the widht of the window 120, our coding standard"
  (interactive)
  (set-frame-width (selected-frame) (* 120 (horz-count)))
  )

这很有帮助。不过,我使用elisp的经验仅限于设置值和绑定键,因此我无法完全做到这一点。我想现在是学习的时候了。我在答案中添加了一个代码示例来计算
root
部分
windowtree
中的水平窗口。谢谢,这很有效。也许这不是我见过的最漂亮的东西,但它确实起到了作用。我指的是屏幕水平方向上的最大窗口数。因此,例如,如果框架被划分为多个窗口,一个窗口在另一个窗口之上,我不希望总宽度为240。