如何在启动时加载上次关闭时的多窗口布局?

ChaosMage
黑暗混沌大法师 2015-09-12 字数 99

如果上次关闭emacs的时候有多个子窗口,那么怎样才能在下次启动的时候恢复这些子窗口,并保持原来的布局?

Emacs Emacs编辑器
35 个回复
XeCycle
据说是小 X 2015-09-12

(info "(emacs) Saving Emacs Sessions")

or, just do not exit emacs

【 在 ChaosMage (黑暗混沌大法师) 的大作中提到: 】

: 如果上次关闭emacs的时候有多个子窗口,那么怎样才能在下次启动的时候恢复这些子窗口,并保持原来的布局?

ChaosMage
黑暗混沌大法师 2015-09-12

可以具体给一段.emcas的设置命令吗?

【 在 XeCycle (据说是小 X) 的大作中提到: 】

: (info "(emacs) Saving Emacs Sessions")

: or, just do not exit emacs

xuchunyang
xuchunyang 2015-09-12

Update:除了修改 init.el,之外还要手动运行一次 desktop-save-mode 或者 desktop-save 命令,不然第一次重启之后并不能恢复之前退出时的状态。

在 init.el 中添加:

(desktop-save-mode)

desktop.el 除了能还原 frame、window、buffer,默认还会保存很多其它的信息比如全局变量,有时候会造成麻烦。我在 OS X 下用的官方的 GUI Emacs,窗口最大化的状态没法保存,总是有空隙,需要再手动调节。

应该也有第三方的插件解决类似的问题。

ChaosMage
黑暗混沌大法师 2015-09-12

谢谢啊

你说的init.el就是.emcacs吗?

我在.emacs中加了(desktop-save-mode),不管用啊

还需要其他操作吗?

【 在 xuchunyang (xuchunyang) 的大作中提到: 】

: 在 init.el 中添加:

:   (desktop-save-mode)

: desktop.el 除了能还原 frame、window、buffer,默认还会保存很多其它的信息比如全局变量,有时候会造成麻烦。我在 OS X 下用的官方的 GUI Emacs,窗口最大化的状态没法保存,总是有空隙,需要再手动调节。

: ...................

xuchunyang
xuchunyang 2015-09-12

是的,用前者现在更好,理由可以参考 http://emacs.stackexchange.com/questions/1/are-there-any-advantages-to-using-emacs-d-init-el-instead-of-emacs

这句指令需要在一个完整的 Emacs Session 中被执行一次,刚刚添加完之后,第一次重启 Emacs(显然)不会有效,之后才会一直有效。当然你也可以手动执行 desktop-save 来保存状态。

【 在 ChaosMage 的大作中提到: 】

: 谢谢啊

: 你说的init.el就是.emcacs吗?

: 我在.emacs中加了(desktop-save-mode),不管用啊

: ...................

ChaosMage
黑暗混沌大法师 2015-09-12

我看了一下,其实session我早就装了,能够保存buffer,但是保存不了多窗口的位置。多次启动也没用。我是这么设置的:

(require 'session)

(add-hook 'after-init-hook 'session-initialize)

(setq desktop-path '("~/.emacs.d/"))

(setq desktop-dirname "~/.emacs.d/")

(setq desktop-base-file-name "emacs-desktop")

(desktop-save-mode t)

(setq desktop-restore-eager 5)

(setq desktop-lazy-verbose t)

【 在 xuchunyang (xuchunyang) 的大作中提到: 】

: 是的,用前者现在更好,理由可以参考 http://emacs.stackexchange.com/questions/1/are-there-any-advantages-to-using-emacs-d-init-el-instead-of-emacs

: 这句指令需要在一个完整的 Emacs Session 中被执行一次,刚刚添加完之后,第一次重启 Emacs(显然)不会有效,之后才会一直有效。当然你也可以手动执行 desktop-save 来保存状态。

xuchunyang
xuchunyang 2015-09-13

我没有说需要用到 session.el(一个第三方插件),用 Emacs 自带的 desktop.el 是可以的,方法前面已经说了,之外你还有很多 desktop-* 的配置,我不知道干嘛的(估计也用不到,没兴趣了解)。

P.S. 定制 Emacs 的时候,不要往自己的配置加入自己都看不懂的东西。

【 在 ChaosMage 的大作中提到: 】

: 我看了一下,其实session我早就装了,能够保存buffer,但是保存不了多窗口的位置。多次启动也没用。我是这么设置的:

: (require 'session)

: (add-hook 'after-init-hook 'session-initialize)

: ...................

ChaosMage
黑暗混沌大法师 2015-09-13

desktop.el可以保存和恢复窗口被分割的状态吗?也就是current-window-configuration所获得的状态信息。我知道怎么将这个状态信息保存到register中,但是我想知道怎样将这个状态信息保存到一个文件中,并且在启动emacs的时候加载这个信息。

【 在 xuchunyang (xuchunyang) 的大作中提到: 】

: 我没有说需要用到 session.el(一个第三方插件),用 Emacs 自带的 desktop.el 是可以的,方法前面已经说了,之外你还有很多 desktop-* 的配置,我不知道干嘛的(估计也用不到,没兴趣了解)。

: P.S. 定制 Emacs 的时候,不要往自己的配置加入自己都看不懂的东西。

xuchunyang
xuchunyang 2015-09-13

可以

【 在 ChaosMage 的大作中提到: 】

: desktop.el可以保存和恢复窗口被分割的状态吗?

ChaosMage
黑暗混沌大法师 2015-09-13

那用什么命令来实现呢?

单纯(desktop-save-mode)不行啊,启动的时候还不能恢复上次关闭时候的current-window-configuration,不管启动多少次都不行。

【 在 xuchunyang (xuchunyang) 的大作中提到: 】

: 标  题: Re: 如何在启动时加载上次关闭时的多窗口布局?

: 发信站: 水木社区 (Sun Sep 13 11:04:59 2015), 转信

: 【 在 ChaosMage 的大作中提到: 】

: : desktop.el可以保存和恢复窗口被分割的状态吗?

: 可以

: --

OrionNebula
nebula 2015-09-13

如果有临时buffer怎么办?比如你打开了很多term buffer,或者跟程序相关的buffer

如果是再次启动时,这些buffer就不存在了,这时候无法恢复原来的窗口啊

【 在 ChaosMage (黑暗混沌大法师) 的大作中提到: 】

: 如果上次关闭emacs的时候有多个子窗口,那么怎样才能在下次启动的时候恢复这些子

: 窗口,并保持原来的布局?

OrionNebula
nebula 2015-09-13

(add-to-list 'desktop-globals-to-save 'foo)

可以在desktop里保存foo变量

直接保存退出时的状态,可以设置

(setq desktop-restore-in-current-display t)

我现在在用revive.el,也可以保存窗口,主要是在不同的project跳来跳去比较方便

提供了两个函数 current-window-configuration-printable和restore-window-config

可以自己写函数保存不同的project分割

【 在 ChaosMage (黑暗混沌大法师) 的大作中提到: 】

: desktop.el可以保存和恢复窗口被分割的状态吗?也就是current-window-configurati

: on所获得的状态信息。我知道怎么将这个状态信息保存到register中,但是我想知道怎

: 样

: 将这个状态信息保存到一个文件中,并且在启动emacs的时候加载这个信息。

ChaosMage
黑暗混沌大法师 2015-09-14

多谢多谢,我要的就是这个

【 在 OrionNebula (nebula) 的大作中提到: 】

: (add-to-list 'desktop-globals-to-save 'foo)

: 可以在desktop里保存foo变量

: 直接保存退出时的状态,可以设置

: ...................

ChaosMage
黑暗混沌大法师 2015-09-14

有个问题就是,我将restore-window-configuration放在init文件里执行不成功,但是等emacs完全启动以后,再执行这个命令又可以成功了。

【 在 OrionNebula (nebula) 的大作中提到: 】

: (add-to-list 'desktop-globals-to-save 'foo)

: 可以在desktop里保存foo变量

: 直接保存退出时的状态,可以设置

: ...................

ChaosMage
黑暗混沌大法师 2015-09-14

你可不可共享一下你在init文件中对于window configuration加载的设置?

【 在 OrionNebula (nebula) 的大作中提到: 】

: (add-to-list 'desktop-globals-to-save 'foo)

: 可以在desktop里保存foo变量

: 直接保存退出时的状态,可以设置

: ...................

OrionNebula
nebula 2015-09-14

保存退出时候的状态,我没有用restore-win-config

我直接用的desktop设置

restore-win-config我是用来保存自己的多个project 布局

你的问题应该是需要在desktop完全load之后再执行命令,否则buffer和变量信息都没有

读入的话,你的命令也执行不了

试试 desktop-after-read-hook 或者 desktop-delay-hook

【 在 ChaosMage (黑暗混沌大法师) 的大作中提到: 】

: 你可不可共享一下你在init文件中对于window configuration加载的设置?

ChaosMage
黑暗混沌大法师 2015-09-14

试了desktop-after-read-hook和desktop-delay-hook,都不行

【 在 OrionNebula (nebula) 的大作中提到: 】

: 保存退出时候的状态,我没有用restore-win-config

: 我直接用的desktop设置

: restore-win-config我是用来保存自己的多个project 布局

: ...................

flonk
flonk 2015-09-14

一个声音高叫着,放弃吧:D

前面有个兄弟说过,你可以试一下不要退出Emacs,我觉得这个建议比较靠谱,Emacs是我见过能无问题运行时间最长的程序之一(只比Linux Kernel稍差一点:D)

我以前也把窗口设置保存下来,后来觉得比较鸡肋,就放弃了

【 在 ChaosMage (黑暗混沌大法师) 的大作中提到: 】

: 试了desktop-after-read-hook和desktop-delay-hook,都不行

OrionNebula
nebula 2015-09-14

你应该研究研究desktop.el...

我试了一下desktop-after-read-hook是可行的

但你需要关闭desktop-restore-in-current-display 和desktop-restore-frames

【 在 ChaosMage (黑暗混沌大法师) 的大作中提到: 】

: 试了desktop-after-read-hook和desktop-delay-hook,都不行