请问各路大神有没有办法固定window的数量以及布局,我希望布局像图片这样,不超过三个,如果有新窗口/buffer需要打开/显示,总是在window 3打开。窗口1固定显示treemacs的内容。
同样有这个问题,期待大佬解决
打开新的窗口和打开新的buffer是不同的命令,“我希望打开新的窗口/buffer时,都……”,这不是一个问题,因为Emacs收到指令时,已经人工narrow到【新窗口】,或者【新buffer】了。
if 你的问题是“我就是要不管我发出的是开新窗口还是buffer都导致一样的行为”,这就有点奇怪了,在两个操作中做个选择应该并不难。
else (你其实只是表述错误,其实问题是正常的“我知道window和buffer分别是干什么的,我想保持layout的时候我当然知道用switch-buffer
”)问题就不存在了,switch-buffer
无论多少次,都不会改变window layout。
edge case 你想问的是“怎样在我对window一顿胡乱操作之后恢复到之前的某个layout”,那么答案是,我个人喜欢用eyebrowse,此外还有persp-mode,其它答案应该在之前论坛里讨论过这个问题的帖子里有。
可以试试 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% 的那个窗口。
所有变量的使用说明:
emacs-purpose 可以利用一下,我搞了很久也没有满意。。。
如果2个窗口都是普通buffer的话,可以试一下eye browse mode
谢谢大家的解决方案,目前emacs-purpose暂时可以解决我的需求,但是有些小地方需要做一些调整,有空看看源码,自己按需求写一个符合自己的。