Emacs 和 Org mode 的启动优化?

Org mode 的 agenda file最好每次重起自动加载,否则执行 org-agenda 和 org-capture 都会有一秒多的延迟。Spacemacs好像就是在启动的时候载入这些文件的,所以加载时间特别久。

我目前的方案是

(use-package org
  :defer 4
  :config
  (mapc 'find-file-noselect (org-agenda-files))  
  ;; 所有的 .org 都在 org-agenda 目录里面,直接在启动4s之后全部加载
)

这么做有个优点就是不占启动时间,可以把启动的时间优化到1s以内。

有个明显的缺点,基本上启动之后有个明显的延迟,基本上只能在scratch里面编辑了

然后我找到了 async

但是 不知道怎么用,下面这个函数运行之后没有结果。。。

  (async-start
   (lambda ()
     (require 'org)  ;; 保证 org-agenda-files 可用
     (mapc 'find-file-noselect (org-agenda-files)))
   'ignore)

不知道该怎么实现?

async 不是这样用的,它另外启动一个 emacs 线程,和原来的线程没有任何关系的。比如你用 org asnyc 导出的时候,需要一个启动文件给另外的线程。

1 个赞

启动要2分钟的表示不差这点时间。

我觉得不能用 async 实现。因为它的原理是重开一个emacs 来在“后台”完成一些耗时工作,比如编译,收邮件。 这些后台的Emacs 和前台不共享变量,需要在启动时把必须的数据传递过去,然后一般也不需要传递结果给前台。所以应该没法用来大幅提升加载配置速度。

1 个赞

我用 systemd 在系统启动时运行 emacs daemon,然后用 emacsclient -c -n 启动,秒开,哈哈

我的配置还处于不断更新的状态,一直要重起

我觉得后台打开文件的时候不应该卡住画面啊,是我用的方法不对吗,find-file-noselect 之后画面确实卡住了

可以搞两个启动文件,两套配置,虽然有点折腾了。。。

这是emacs 如果空闲5min,则自动显示 org agenda buffer(空闲的意思是这段时间没有任何按键或鼠标事件) 你可以调整下 时间, 调整下是否repeat

它只是在emacs空闲多少秒的之后执行一个函数, 如果你打开emacs 马上就用它 ,那还是慢。

(run-with-idle-timer 300 t 'show-todo-list-after-init) ;idle 300=5*60s,show todo list
;(run-with-timer SECS REPEAT FUNCTION &rest ARGS)
;(run-with-idle-timer SECS REPEAT FUNCTION &rest ARGS)

(defun show-todo-list-after-init(&optional frame)
  (require 'org-agenda)
  (dolist (f org-agenda-files)
    (unless (file-exists-p f)
      (setq org-agenda-files (delete f org-agenda-files))))
  (when org-agenda-files
    (call-interactively 'org-todo-list)
    (switch-to-buffer "*Org Agenda*")))
3 个赞

你这个函数每5分钟执行一次,然后每次会跳出来一个窗口啊。。。

而且如果我没理解错的话,第一次执行还是会卡住的,等于一次性全部加载文件了

额,我去读了 run-with-idle-timer 的文档,你的方法是正确的。。又学到了一招。。