emacs - 如果之前保存过桌面,则从 *scratch* 切换到上次查看的文件

标签 emacs

考虑到我的 *scratch* 缓冲区也是一个现有文件,有人可以帮我在打开 Emacs 时从桌面保存切换到上次查看的文件吗?

就初始缓冲区选择而言,*scratch* 缓冲区始终胜过桌面保存。

(setq initial-scratch-message nil)
;; (setq initial-buffer-choice "~/.0.data/.0.emacs/*scratch*")

(defun kill-default-scratch ()
    "Avoid having a buffer named `*scratch*<2>` when Emacs loads
    my preferred *scratch* file from a specified location -- however,
    yield to the last viewed file if it exists from desktop-save."
    (kill-buffer "*scratch*")
    (find-file "~/.0.data/.0.emacs/*scratch*") )

(add-hook 'after-init-hook 'kill-default-scratch)

(require 'saveplace)
(setq-default save-place t)
(setq save-place-file "~/.0.data/.0.emacs/.saved-places")

(desktop-save-mode 1)
(setq desktop-dirname           "~/.0.data/.0.emacs/"
    desktop-base-file-name      ".emacs.desktop"
    desktop-base-lock-name      ".lock"
    desktop-path                (list desktop-dirname)
    desktop-save                t
    desktop-files-not-to-save   "[*]bbdb[*]\\|[*]BBDB[*]\\|[*]TODO[*]" ;; "^$"  reload tramp paths
    desktop-load-locked-desktop nil )

(setq desktop-buffers-not-to-save
        (concat "\\("
                "^nn\\.a[0-9]+\\|\\.log\\|(ftp)\\|^tags\\|^TAGS"
                "\\|\\.emacs.*\\|\\.diary\\|\\.newsrc-dribble"
                "\\)$"))
    (add-to-list 'desktop-modes-not-to-save 'dired-mode)
    (add-to-list 'desktop-modes-not-to-save 'Info-mode)
    (add-to-list 'desktop-modes-not-to-save 'info-lookup-mode)
    (add-to-list 'desktop-modes-not-to-save 'fundamental-mode)

编辑:根据@juanleon提供的答案,我决定顺其自然,并使用emacs-startup-hook(其中在 after-init-hook 之后加载)。暂存缓冲区想要胜过 desktop.el,因此让它发挥作用,然后将其埋葬。为了处理 desktop.el 没有保存最后查看的文件的情况(即,因为它们在退出之前都已关闭),我埋葬了 *Messages* 缓冲区(if 它具有焦点)因此结果是自定义 *scratch* 缓冲区再次获得焦点。要从 desktop.el 保存功能中删除自定义 *scratch* 文件,我将 [*]scratch[*] 添加到列表中桌面文件不可保存。我正在使用 auto-save-buffers-enhanced 自动保存我的自定义 *scratch* 文件(设置为每次修改后 1 秒发生),并且该实用程序允许我排除用户- 使用 (setq auto-save-buffers-enhanced-exclude-regexps . . .) 定义的文件类型:https://github.com/kentaro/auto-save-buffers-enhanced/blob/master/auto-save-buffers-enhanced.el [注意:如果使用最新版本的 Emacs,则其中对 flet 的引用需要更改为 cl-flet。]

(setq initial-scratch-message nil)
(setq initial-buffer-choice t)

(require 'auto-save-buffers-enhanced)
(auto-save-buffers-enhanced t)
(setq auto-save-buffers-enhanced-save-scratch-buffer-to-file-p 1)
(setq auto-save-buffers-enhanced-exclude-regexps '("^not-save-file" "\\.ignore$" "\\.txt" "[*]TODO[*]" "\\.yasnippet" "\\.tex" "\\user_pref" "\\.org_archive" "\\.org" "\\.ppet"))

(require 'saveplace)
(setq-default save-place t)
(setq save-place-file "~/.0.data/.0.emacs/.saved-places")

(desktop-save-mode 1) ;; uses the after-init-hook
(setq desktop-dirname           "~/.0.data/.0.emacs/"
    desktop-base-file-name      ".emacs.desktop"
    desktop-base-lock-name      ".lock"
    desktop-path                (list desktop-dirname)
    desktop-save                t
    desktop-files-not-to-save   "[*]scratch[*]\\|[*]bbdb[*]\\|[*]BBDB[*]\\|[*]TODO[*]" ;; "^$"  reload tramp paths
    desktop-load-locked-desktop nil )
(setq desktop-buffers-not-to-save
        (concat "\\("
                "^nn\\.a[0-9]+\\|\\.log\\|(ftp)\\|^tags\\|^TAGS"
                "\\|\\.emacs.*\\|\\.diary\\|\\.newsrc-dribble"
                "\\)$"))
    (add-to-list 'desktop-modes-not-to-save 'dired-mode)
    (add-to-list 'desktop-modes-not-to-save 'Info-mode)
    (add-to-list 'desktop-modes-not-to-save 'info-lookup-mode)
    (add-to-list 'desktop-modes-not-to-save 'fundamental-mode)

(defun custom-scratch-setup ()
"Avoid having a buffer named `*scratch*<2>` when Emacs loads
my preferred *scratch* file from a specified location -- however,
yield to the last viewed file if it exists from desktop-save."
    (kill-buffer "*scratch*")
    (message "The default `*scratch*` buffer has been killed.")
    (find-file "~/.0.data/.0.emacs/*scratch*")
    (message "Finished loading the custom `*scratch*` file.")
    (bury-buffer)
    (message "The buffer *scratch* has been buried.")
    (if (eq (current-buffer) 
            (get-buffer "*Messages*") )
        (progn    (bury-buffer)
        (message "The buffer *Messages* has been buried."))) )
(add-hook 'emacs-startup-hook 'custom-scratch-setup)

最佳答案

我的猜测是 after-init-hook 在桌面完成加载其内容后运行(桌面使用该钩子(Hook))

因此,find-file 将在所有内容结束时运行,并且 find-file 恰好“解埋”文件的缓冲区(如果已加载)。如果您不希望它接管初始缓冲区选择,也不希望它成为初始缓冲区选择。

另一个选择是交换 after-init-hook 中的钩子(Hook)运行顺序。您可以通过使用“必需”的 Desktop.el 和/或使用 add-hook 的 arg APPEND 来实现这一点。如果您的函数在桌面函数之前运行,则 (desktop-read) 将优先于您的 find-file

关于emacs - 如果之前保存过桌面,则从 *scratch* 切换到上次查看的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17560937/

相关文章:

emacs - 如何获得 Emacs 的背景类型?例如 'light or ' 暗

Emacs Lisp : how to avoid inserting a duplicate list item?

emacs - 如何告诉 Emacs find-file 不要折叠 '//' 的路径

emacs - 删除返回文件名的后缀

python - 在 emacs 的 ipython 模式下,有没有办法执行当前行?

emacs - Orgmode 议程 View 中未正确显示类别

emacs - 如何在组织模式下设置 ODT 导出的页边距?

emacs - Emacs术语模式下的固定宽度

c - 在 Emacs 中单步运行和执行 C 程序

Netbeans Ant build.compiler.emacs