emacs如何记忆和切换窗口布局?

希望能达到这种效果:

我在一个窗口中编辑代码,左右分割。左边一个文件,右边是另一个文件。或者还有上下分割。。这是布局1. 另一个窗口中编辑配置文件。同样上下或者左右分割了窗口。这是布局2. 我需要在这两个布局之间换来换去。所以,我希望这两个布局是被记住的而且可以切换。

目前非常近似的解决办法:

用ivy-push-view。几乎80%达到了这个效果。问题是比如:布局1已经保存,左边的窗口打开的是a.c,编辑了a.c 并且从a.c跳转到了a.h。这时候我切换到布局2,又切换回布局1的时候。会重新回到保存布局1的状态(左边窗口开着的是a.c)。但是我希望的效果是布局1始终保留最后的编辑状态。ivy-push-view无法达到这个要求。

目前我自己的解决办法:

我用tmux开多个pane作为布局。在pane中开emacsclient。这样在不同pane之间切换。是会保留布局和最终编辑状态的。

不知道emacs本身有没有什么办法能解决这个问题?

也许可以试试 workgroups2 或者 rotate

(current-window-configuration) 获取当前窗口布局
(set-window-configuration)  设置当前窗口布局

这两个函数就够了,比如在两个窗口布局之间切换

(defvar window-conf nil)

(defun my/toggle-window()
  (interactive)
  (let ((next-window-conf window-conf))
    (setq window-conf (current-window-configuration))
    (if next-window-conf
        (set-window-configuration next-window-conf)
      (message "Remembered current window configuration"))
    ))

使用自带的 tab-bar-mode,然后开两个 tab,这两个 tab 对应的是你所说的两种窗口的布局。

ps:emacs 自带的有两种 tab 模式,一种是 tab-line 是类似 vscode 之类的一个 buffer 一个 tab,tab-bar-mode 是 类似 vim 的一组窗口布局是一个 tab。

(tab-bar-history-foward)(tab-bar-history-backward) 可以在该 tab 的窗口布局之间前进和回退,类似winner-mode。

1 个赞

我的方法是用自带的tab-bar 在一个window中来回切换buffer,然后用perspective-el 记住整个frame的window布局。

https://depp.brause.cc/eyebrowse/

应该符合你的诉求。

我这里找不到current-window-configuration那两个函数。

找不到是什么意思,这两个函数是内置的,不会找不到的

刚才M-x执行,没找到。得绑定到快捷键?

1 个赞

上面那段代码你执行了吗,把报错贴出来才知道什么问题

我添加到 init.el中重启了。 M-x 有 my/toggle-window 这个函数。但是没有 (current-window-configuration) 获取当前窗口布局 (set-window-configuration) 设置当前窗口布局 这两个函数

我先试试tabbar。。。 看顺手不。

刚才试了一下,貌似是我要的效果,我研究一下怎么弄得快一点。用tmux的pane新建,关闭,切换,还是非常快的。

绑几个快捷键的事情。

试了一下。目前tabbar是要的效果。但是操作起来还是不如我之前的tmux方式快。但好歹不依赖tmux了。

另外GitHub - knu/elscreen: elscreen patched to work with recent Emacs 也可以解决这个问题,但它用起来稍微有点问题。就是在一个screen中切换buff的时候,会跳到另一个screen中。

你用 evil 吗 这个是我的 tab-bar 的快捷键。 用起来和 tmux 我觉得效率没啥区别,都是按三个键


    (general-create-definer my/tab-map
        :prefix "SPC TAB"
        :non-normal-prefix "M-SPC TAB"
        :prefix-map 'my/tab-map)

    (my/tab-map
        :states '(motion insert normal)
        :keymaps 'override
        "" '(:ignore t :which-key "Tab")
        "n" #'tab-bar-new-tab
        "c" #'tab-bar-close-tab
        "o" #'tab-bar-close-other-tabs
        "]" #'tab-bar-switch-to-next-tab
        "[" #'tab-bar-switch-to-prev-tab
        "{" #'tab-bar-history-back
        "}" #'tab-bar-history-forward
        "b" #'tab-bar-move-window-to-tab
        ;; move current window to a new tab (break current tab)
        "l" #'tab-bar-move-tab ;; move tab to the right
        "h" #'tab-bar-move-tab-backward ;; move tab to the left
        "g" #'tab-bar-change-tab-group ;; make group
        "TAB" #'tab-bar-switch-to-tab
        "1" (my/tab-bar-go-to-tab-macro 1)
        "2" (my/tab-bar-go-to-tab-macro 2)
        "3" (my/tab-bar-go-to-tab-macro 3)
        "4" (my/tab-bar-go-to-tab-macro 4)
        "5" (my/tab-bar-go-to-tab-macro 5)
        "6" (my/tab-bar-go-to-tab-macro 6)
        "7" (my/tab-bar-go-to-tab-macro 7)
        "8" (my/tab-bar-go-to-tab-macro 8)
        "9" (my/tab-bar-go-to-tab-macro 9))

然后 window 有关的窗口创建和移动,evil 有自带的 evil-window-map;我把它绑定到了 SPC w 上来 invoke。

利用系统自带的window-configuration-to-register 不可以么?

current-window-configuration应该不是interactive,M-x中不会出现

可以用api也可以用第三方插件。楼上很多人推荐的都不错。不重复了。第三方插件的特色是可以恢复一些特殊的buffer并执行一些额外的功能。如能恢复之前的pdf的特定页。

按键多少问题不大。也可能是因为刚试用的缘故。用习惯了估计也就不会觉着慢了。