窗口布局固定样式

请问各路大神有没有办法固定window的数量以及布局,我希望布局像图片这样,不超过三个,如果有新窗口/buffer需要打开/显示,总是在window 3打开。窗口1固定显示treemacs的内容。 layout

1 个赞

同样有这个问题,期待大佬解决

https://www.gnu.org/software/emacs/manual/html_node/elisp/Side-Windows.html

1 个赞

打开新的窗口和打开新的buffer是不同的命令,“我希望打开新的窗口/buffer时,都……”,这不是一个问题,因为Emacs收到指令时,已经人工narrow到【新窗口】,或者【新buffer】了。

if 你的问题是“我就是要不管我发出的是开新窗口还是buffer都导致一样的行为”,这就有点奇怪了,在两个操作中做个选择应该并不难。

else (你其实只是表述错误,其实问题是正常的“我知道window和buffer分别是干什么的,我想保持layout的时候我当然知道用switch-buffer”)问题就不存在了,switch-buffer无论多少次,都不会改变window layout。

edge case 你想问的是“怎样在我对window一顿胡乱操作之后恢复到之前的某个layout”,那么答案是,我个人喜欢用eyebrowse,此外还有persp-mode,其它答案应该在之前论坛里讨论过这个问题的帖子里有。

1 个赞

可以试试 display-buffer-alist
举个例子

(setq display-buffer-alist
      '(("^\\*Flymake diagnostics"
	 (display-buffer-reuse-window
	  display-buffer-in-side-window)
	 (reusable-frames . visible)
	 (side            . bottom)
	 (window-height   . 0.33))))

上面的是把 buffer 名字里带 “Flymake diagnostics” 字样的放在窗口的下面(window-height 是窗口占得比例。),占据 33% 的样子,这个字符支持正则表达式,可以以此类推在设置一个放左边的。

如果想要放在下面的不止一个的话可以使用 dolist,像下面这样。

(dolist (buffer '("^\\*Flymake diagnostics"
                  "^\\*Flycheck errors\\*$"
                  "^\\*Compile"
                  "^\\*Completions\\*$"
                  "^\\*compilation\\*$"
                  "^\\*Async Shell Command\\*$"))
  (add-to-list 'display-buffer-alist
               `(,buffer
                 (display-buffer-reuse-window
                  display-buffer-in-side-window)
                 (reusable-frames . visible)
                 (side            . bottom)
                 (window-height   . 0.33))))

所有设置过的都会共用一个 window,不会乱开新的。比如,你原本开了一个 buffer 名为 Flymake diagnostics 的窗口,后面又想打开一个名为 Compile 的窗口,名为 Compile 的buffer 会复用名为 Flymake diagnostics 的窗口,即位于下方占据窗口比例 33% 的那个窗口。

所有变量的使用说明:

3 个赞

emacs-purpose 可以利用一下,我搞了很久也没有满意。。。

如果2个窗口都是普通buffer的话,可以试一下eye browse mode

谢谢大家的解决方案,目前emacs-purpose暂时可以解决我的需求,但是有些小地方需要做一些调整,有空看看源码,自己按需求写一个符合自己的。