问题描述

我的org配置文件里头,设置了变量org-todo-keywords的值。 当我打开我的agenda.org的时候,我运行C-c h v(即,查看变量),然后输入org-todo-keywords,发现和我在配置文件里头设置的值一样。 但是,当我通过C-c C-t去改变一个todo事项的状态的时候,发现还是只有tododone这两个状态(默认值,即我的org-todo-keywords里头的值没有生效)。 我希望C-c C-t去改变一个todo事项的时候,能使用到我org-todo-keywords变量里头的值。

我的emacs 是26.3,运行在macbook pro上

解决方案

通过分别在具体的org文件(agenda.org,xxx)里头运行org-mode-restart(按键M-x org-mode-restart)即可。即,重启buffer。

原因

参见这个回答的post

该post具体内容:

Org-mode caches various things on load. In this case org-todo relies on todo keyword state cached in org-todo-kwd-alist which is generated by org-set-regexps-and-options which is run when setting the mode to org-mode for the buffer. If some org-mode customization doesn't seem to be taking effect it's usually a good idea to refresh things by reloading the buffer. Either by saving, closing, and re-opening the file or reverting the file by C-x C-v [return] (find-alternate-file). I would personally consider this a bug. When emacs gets watchpoints (in v26.1 hopefully) minor caching issues like this should be easily addressed.

原因(中文)

原因是Org-mode会在加载之时,缓存很多信息。 而我们C-c C-t去改变一个todo事项状态的时候,只有默认的keyword(没有我们设置在org-todo-keywords)里头的原因是。在org-mode加载的时候,org-set-regexps-and-options运行起来去设置org-todo-kwd-alist的时候,可能此时我们的org-todo-keywords还没生效,所以使用了默认的keyword(只有tododone)。 然后等加载完成之后,我们才设置了想要的org-todo-keywords,从而导致缓存的信息(org-todo-kwd-alist)里头是默认的keywords。 所以我们通过org-mode-restart,重新跑一遍加载逻辑。此时org-set-regexps-and-options发现了我们设置的org-set-keywords,从而能正确。

不足之处

导致我们要到每一个org文件里头,去跑一遍org-mode-restart