一些有关Emacs桌面保存的问题:如何将其更改为保存在~/.emacs.d/.emacs.desktop中。

23
我在 init.el 中有这个设置。
(desktop-save-mode 1)

这个方法很不错,但我想知道:

  • 如何将.emacs.desktop文件保存到~/.emacs.d而不是~/中?

  • 如何停止询问是否保存(只在重新启动后第一次关闭emacs时出现,从那时起它默认为是,这正是我想要的)

3个回答

46
我使用以下代码,对我来说效果很好:

;; 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的评论。


1
非常感谢您,亲切的先生 :) 它运行得非常好。我做了两个添加:(您能否告诉我它们是否明显错误?)desktop-files-not-to-save "*magit" ;忽略 magit 文件,并且 (add-hook 'auto-save-hook (lambda () (desktop-save-in-desktop-dir))) - tobeannounced
自动保存钩子看起来不错。desktop-files-not-to-save需要是一个正则表达式,所以那看起来不对。如果你要匹配以“magit”结尾的东西,那么使用".*magit$" - phils
由于这个答案的年代久远,最后一段似乎不再准确。至少在Emacs 25.1.1中,启用desktop-save-mode会设置一个空闲计时器,每5秒钟调用desktop-auto-save - GDP2
1
在Emacs 25中,将变量desktop-auto-save-timeout设置为n秒将确保每隔n秒保存一次桌面文件。例如(setq desktop-auto-save-timeout 15)。默认值为30秒。 - n1k31t4

3

如何将 .emacs.desktop 文件保存到 ~/.emacs.d 而不是 ~/?

自定义 desktop-dirname 变量。

如何停止它询问我是否要保存?

自定义 desktop-save 变量。


谢谢,我尝试添加了这个但没有成功:(desktop-save-mode t) (setq desktop-dirname "~/.emacs.d/") - tobeannounced
@tobeannounced:customize并不等同于setq。请阅读变量的帮助文档。 - jfs
1
设置 desktop-dirname 似乎不够用;直到我 同时 更改了 desktop-path,才让它正常工作 :/ self.herp_derp() - allyourcode

0

想要分享一下我的会话是如何组织的。

要求:

  1. 从终端发送文件到自定义emacs会话
  2. 从终端恢复会话
  3. 保存会话

解决方案:

  1. 安装包(插件)workgroups2 -> https://github.com/pashinin/workgroups2

  2. 将以下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.shem_start_foo_2.shem_start_foo_3.shem_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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接