分享我重新设计的.emacs.d README - 既显示全部配置也能多文件管理

两周前我在论坛给大家分享了我入坑一个月左右的emacs配置:入坑EMACS快1个月了 这是我的.emacs.d 大家有没有什么改进的建议?那时我所有的init文件全部储存在README.org,而init.el只有一行,就是用org-babel-load-file读取README.org#+BEGIN_SRC emacs-lisp代码,和org-dotemacs有点儿像。 这个的好处是我所有的配置都能很直观的展示在.emacs.d的第一页,每次查看自己的配置时只需要从Github点开.emacs.d就行了。不需要花费太大的精力去研究init文件,既酷炫也非常方便阅读理解debug。但是弊端也很明显:

  1. 每次启动emacs时都需要花很长一段时间去加载org。

  2. 尽管README可以设计的比较易懂,但是所有的配置全部集中在一个文件里面,太长。

那条帖子里面有人提到Centaur后我才认识到原来还可以多文件管理,不过这个的弊端是文件找起来过于复杂过于繁琐,所以一直没有使用。我当时这么

和我目前90%代码集中于README的设计完全不一样,以及每次从github页面查看自己package的code的时候都得一个个点开的操作有点繁琐,不像现在这么直观又好玩了。

不过我一直都没停止关注这种管理文件的方式,毕竟启动效率很高。三天前我了解到org mode原来可以#+INCLUDE 别的文件里的部分代码(抱歉我是新人。。。)于是我尝试把配置转到其他文件里面,然后在README里面#+INCLUDE进来。结果Github上什么都没显示??? 这就很难受了,接着我尝试把org文件转成Markdown然后再传Github,这次解决了,不过org mode内置的转Markdown把elisp代码转成普通文本,没有syntax highlight是真的丑。。。

当然这是一个小问题,更重要的问题是#+INCLUDE只能选择:lines "a-b"。假如我在一个文件里面更改了一点配置,每一行都得重写,这个工作量就大了。于是我做了点research,然后发现有位大神在网上分享了一个实时更新INCLUDE行的办法,Updating org-mode #+INCLUDE: statements on the fly 我抄过来后稍微改了一点点东西,变成现在这样:Update Org Mode Include Automatically

现在差不多了,以下是操作详情:

  1. 多文件管理,所有配置全部放到elisp/文件夹。
  2. 复制这段函数
  3. 每一段配置前后都加上;; 开始行;; 结束行 。记住这两行注释必须取文件别的地方没有出现过的独特string。在多文件管理的情况下,每个文件相对较小,取个独特的名字还是比较容易的吧。

举例: https://github.com/MatthewZMD/.emacs.d/blob/master/elisp/init-doom.el#L47

  1. org文档取什么名字都可以,现在在文件最上边加上#+EXPORT_FILE_NAME: README 这样导出来的Markdown名字是README.md
  2. 在org文档里面以前放BEGIN_SRC emacs-lisp的地方全部改成 #+INCLUDE: "~/.emacs.d/elisp/文件名.el" src emacs-lisp :range-begin "开始行" :range-end "结束行"

举例:

** Doom Theme
   #+INCLUDE: "~/.emacs.d/elisp/init-doom.el" src emacs-lisp :range-begin "DoomThemes" :range-end "-DoomThemes"

DoomThemes就是我的开始行-DoomThemes就是我的结束行DoomThemes这段string在文件别的地方都没有出现,以确保decide-line-range函数可以找到目标代码。

  1. 这时先保存.el文件,然后再保存.org文件,就会发现#+INCLUDE后面会自动生成:lines "##-##",这就是update-includes函数的效果了。 每次更改.el文件的内容后再去org文档保存一次,这样update-includes才会自动更新:lines。切记必须去org文档重新保存,就算你不需要更改org文档,也要加个空格去个空格重新保存,不然update-includess`不会自动更新…
  2. 如果你使用toc-org ,需要根据这个issue 的第三条解决方案在org文档里加上#+OPTIONS: toc:nil 以及在目录行改用:TOC_2_org:而不是普通的:TOC:,不然导出Markdown会报错。
  3. 为了解决elisp syntax highlight的问题,建议使用ox-gfm,Github Flavored Markdown exporter for Org Mode。每次更改完org文件别忘了M-x org-gfm-export-to-markdown 将org导成README.md
  4. 现在只需要把cursor置于#+INCLUDE上面输入C-c '就可以更改该.el文件了

以上就是全部步骤了,这虽然不是很高级,只是一个小小的trick。但就如我在标题所说,这种方法既能维持README.org显示全部init配置,也可以采取多文件管理方式,效果还是非常不错的。而弊端就是,太麻烦了……

我花了两天时间才把我的M-EMACS的README全部改成这种样式,我比较强迫症,改得比较细致…大家可以参考参考,也欢迎提出建议 :wink:

5 个赞

复制这段函数,能否借鉴el2org

emacs-helper,就是用el2org组织的,和你现在的配置格式有点像。

interesting. 这个有点厉害

话说, org 不是可以用 tangle 把代码都导出来嘛…

就乃原来的来说,如果原来的是 #+begin_src elisp 乃可以在 README.org 顶端加上

#+PROPERTY: header-args:elisp :tangle (concat (file-name-directory (buffer-file-name)) "init.el")

C-c C-v t 生成 init.el,这样就不用每次重新读取了. 这也是我的做法 GitHub - nasyxx/emacs.d: My emacs configuration Nasy Emacs 配置

另外,用 #+include 的时候, GitHub 上没有显示的一个解决方案是, 把乃原来的 README.org 改名,然后 export 为一个新的 README.org 就行( tangle 的时候,也要用 export 出来的 org file.

1 个赞

但是这样不能多文件管理了

可以的啊… export 为 org ,这样带着 #+include 里的内容,然后再 tangle 那个 export 出来的 org file

我懂你意思了,这样也可以,不过我感觉会把已经很复杂的结构继续复杂化…