一些 emacs 桌面保存问题:如何将其更改为保存在 ~/.emacs.d/.emacs.desktop

Posted

技术标签:

【中文标题】一些 emacs 桌面保存问题:如何将其更改为保存在 ~/.emacs.d/.emacs.desktop【英文标题】:Some emacs desktop-save questions: how to change it to save in ~/.emacs.d/.emacs.desktop 【发布时间】:2010-12-18 08:51:33 【问题描述】:

我的 init.el 中有这个设置

(desktop-save-mode 1)

这很好用,只是我想知道:

如何更改它以将 .emacs.desktop 文件保存到 ~/.emacs.d 而不是 ~/

如何阻止它询问我是否要保存(仅在我重启后第一次关闭 emacs 时发生,从那时起它假定是,这是我一直想要发生的)

【问题讨论】:

【参考方案1】:

我使用以下对我有用的东西:

;; 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 在这方面的贡献。

【讨论】:

非常感谢您,先生 :) 效果非常好。我做了两个补充:(你能告诉我它们是否明显错误吗?) desktop-files-not-save "*magit" ;忽略 magit 文件,以及 (add-hook 'auto-save-hook (lambda () (桌面保存在桌面目录))) 自动保存挂钩看起来不错。 desktop-files-not-to-save 需要是正则表达式,所以看起来不对。如果您匹配以“magit”结尾的内容,请使用".*magit$" 由于这个答案的年龄,最后一段似乎不再准确。至少从 Emacs 25.1.1 开始,启用 desktop-save-mode 会设置一个空闲计时器,每 5 秒调用一次 desktop-auto-save 在 Emacs 25 中,将变量 desktop-auto-save-timeout 设置为 n 秒将确保每 n 秒保存一个桌面文件。例如。 (setq desktop-auto-save-timeout 15)。默认值为 30 秒。【参考方案2】:

如何更改它以保存 .emacs.desktop 文件到 ~/.emacs.d 而不是 ~/

自定义desktop-dirname变量。

我怎样才能阻止它问我是否 想保存

自定义desktop-save变量。

【讨论】:

为此干杯,我尝试添加这个没有运气:(desktop-save-mode t) (setq desktop-dirname "~/.emacs.d/") @tobeannounced:customize等同于setq。阅读变量的帮助。 设置 desktop-dirname 似乎不够;在我更改桌面路径之前,我无法让它工作:/ self.herp_derp()【参考方案3】:

想分享我的会议是如何组织的。

要求:

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

解决方案:

    安装包(插件)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

函数 nk-server-start 在 emacs 启动时被调用。 它有一个参数 - 会话名称。

我们可以通过从终端运行以下命令来启动 emacs-session 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

【讨论】:

以上是关于一些 emacs 桌面保存问题:如何将其更改为保存在 ~/.emacs.d/.emacs.desktop的主要内容,如果未能解决你的问题,请参考以下文章

如何使用vba在excel2010中将保存类型从excel工作簿更改为excel 97-2003?

在 C++ 中,主函数是编程的入口点,我如何将其更改为其他函数?

Python如何检查列表中的项目是不是为浮点数,如果是,将其更改为字符串? [复制]

我如何在 openSUSE 的桌面上创建/保存一些东西

从视频中提取图像,将其更改为灰度并找出差异

在 Emacs 中保存窗口配置