考虑到我的 *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/