(desktop-save-mode 1)
这个方法很不错,但我想知道:
如何将.emacs.desktop文件保存到~/.emacs.d而不是~/中?
如何停止询问是否保存(只在重新启动后第一次关闭emacs时出现,从那时起它默认为是,这正是我想要的)
;; Automatically save and restore sessions
(setq desktop-dirname "~/.emacs.d/desktop/"
desktop-base-file-name "emacs.desktop"
desktop-base-lock-name "lock"
desktop-path (list desktop-dirname)
desktop-save t
desktop-files-not-to-save "^$" ;reload tramp paths
desktop-load-locked-desktop nil
desktop-auto-save-timeout 30)
(desktop-save-mode 1)
实际上,我设置了(desktop-save-mode 0)
然后使用M-x my-desktop
来启动:
(defun my-desktop ()
"Load the desktop and enable autosaving"
(interactive)
(let ((desktop-load-locked-desktop "ask"))
(desktop-read)
(desktop-save-mode 1)))
但这是因为我的会话经常超过100个文件,大多数是通过tramp进行的,所以我更喜欢将其加载变成手动任务,并且不要破坏桌面文件 :)
我建议查看Emacs Wiki: http://www.emacswiki.org/emacs/DeskTop
有一些对默认功能非常有用的增强功能。特别是,我建议添加某种自动保存桌面的方法,因为如果您的系统在Emacs运行了几天并且在此期间未保存桌面,则这真的很烦人。
自从Emacs 24.4以来,默认情况下会定期自动保存桌面文件。请参阅desktop-auto-save-timeout
变量(我也已将其添加到上面的块中)。感谢GDP2和Dexter Morgan的评论。
如何将 .emacs.desktop 文件保存到 ~/.emacs.d 而不是 ~/?
自定义 desktop-dirname
变量。
如何停止它询问我是否要保存?
自定义 desktop-save
变量。
customize
并不等同于setq
。请阅读变量的帮助文档。 - jfs想要分享一下我的会话是如何组织的。
要求:
解决方案:
安装包(插件)workgroups2 -> https://github.com/pashinin/workgroups2
将以下Lisp代码添加到您的~/.emacs.d/init.el或~/.emacs中:
->
(setq server-socket-dir "~/.emacs-local/server")
(defun nk-server-start (custom-server)
; (nk-server-start "abe")
(setq server-name custom-server)
(server-start) ; run emacs server
(setq wg-session-file (concat "~/.emacs-local/sessions/" custom-server))
; (setq wg-session-file "~/.emacs-local/sessions/foo")
(workgroups-mode 1)
(wg-switch-to-workgroup custom-server)
)
; Run file in specific server (foo)
; emacsclient -n callback.sh -s ~/.emacs-local/server/foo
; Show server name in title bar
(setq frame-title-format '("" "%b @ " server-name))
; https://www.emacswiki.org/emacs/FrameTitle
; ;; What to do on Emacs exit / workgroups-mode exit?
(setq wg-emacs-exit-save-behavior 'save) ; Options: 'save 'ask nil
(setq wg-workgroups-mode-exit-save-behavior 'save) ; Options: 'save 'ask nil
当Emacs启动时,将调用函数nk-server-start
。它有一个参数-会话名称。
我们可以通过从终端运行以下命令来启动Emacs会话foo
:
setsid emacs --eval '(nk-server-start "foo")' &
foo
,我们需要运行以下命令:setsid emacsclient -n -s ~/.emacs-local/server/foo file.txt >> /dev/null &
当我们关闭会话时,所有缓冲区、设置等都保存在文件~/.emacs-local/sessions/foo
中。
下次运行命令setsid emacs --eval '(nk-server-start "foo")' &
时,所有缓冲区将被恢复。
因为命令很长,我很懒 :) 所以我编写了一些脚本,并将它们添加到我的$PATH
中,以便于操作:
em_start_foo.sh
- 运行会话,仅用于启动会话。
#!/bin/bash
setsid emacs --eval '(nk-server-start "foo")' &
em_foo.sh
- 将文件添加到会话
#!/bin/bash
setsid emacsclient -n -s ~/.emacs-local/server/foo "$@" >> /dev/null &
现在我们只需要从终端运行:
$ em_start_foo.sh # start foo session
$ em_foo.sh file_1.txt # open file_1.txt in foo session
$ em_foo.sh file_2.txt file_3.txt # open file_2.txt and file_3.txt in foo session
当然可以同时运行多个会话。
假设我们还创建了脚本 em_start_foo_2.sh
,em_start_foo_2.sh
,em_start_foo_3.sh
,em_start_foo_3.sh
(当然在某个地方的 $PATH
中)
然后我们可以这样做:
$ em_start_foo.sh # start foo session
$ em_start_foo_2.sh # start foo_2 session in separate emacs
$ em_foo.sh file_1.txt # open file_1.txt in foo session
$ em_foo_2.sh a.txt b.txt # open a.txt and b.txt in foo_2 session
$ em_start_foo_3.sh # start foo_3 session
$ em_foo_3.sh tmp.txt # open tmp.txt in foo_3 session
##### Close emacs foo_2 from gui - session is automatically saved ###
$ em_start_foo_2.sh # start foo_2 session with all buffers restored
包workgroups2
真的很棒!
我的emacs初始化文件带有会话选项,可以在此链接中找到:https://github.com/nexayq/dot_files/blob/master/emacs/dot_emacs_d/init.el
desktop-files-not-to-save
需要是一个正则表达式,所以那看起来不对。如果你要匹配以“magit”结尾的东西,那么使用".*magit$"
。 - philsdesktop-save-mode
会设置一个空闲计时器,每5秒钟调用desktop-auto-save
。 - GDP2desktop-auto-save-timeout
设置为n秒将确保每隔n秒保存一次桌面文件。例如(setq desktop-auto-save-timeout 15)
。默认值为30秒。 - n1k31t4