一般配置写长了都会有很多的子文件出来,那么在不考虑可读性的前提下子文件的数量应该怎么决定?
另外有两种极端情况:所有的设置都在一个文件里 和 为每一个feature/package单独建一个文件会对Emacs的性能或者别的什么方面产生影响吗?
一般配置写长了都会有很多的子文件出来,那么在不考虑可读性的前提下子文件的数量应该怎么决定?
另外有两种极端情况:所有的设置都在一个文件里 和 为每一个feature/package单独建一个文件会对Emacs的性能或者别的什么方面产生影响吗?
我觉得不考虑他人可读性是个伪命题……过一段时间以后你自己的代码也会变陌生。
我个人觉得子文件不要过多。在buffer(一个文件)里跳转要比在各种文件里跳转轻松愉快很多。
你想保证代码结构整齐的话我推荐outshine(加强版outline),基本上是一个代码文件用的org-mode,你可以用分号的数量标示comment header,也可以像org-mode一样折叠展开:
模块的内部实现可以复杂,但是对外提供的接口最好尽量简单。所以把有点关系的都放一个文件吧。
对 Emacs 配置几乎只用一个文件: init.el
。对 Emacs 的扩展,比较有用的,我会写成 Package 单独维护,否则就放到 ~/.emacs.d/lisp/
下。「配置」指设置快捷键之类的,「扩展」则跟写新 Package 差不多,这两者区别明显。我的 init.el
比较大(4000 行),用 use-package 配合上 Imenu 来快速定位一个 Package / Feature / Whatever 的配置。
以下目前的 ~/.emacs.d
的结构,乱七八糟的文件都有,但其实算得上是 Emacs 「配置」几乎只有 init.el
。
~/.emacs.d $ git tree
.
├── Makefile
├── README.md
├── VimGolf.org
├── bin
│ ├── cowsay
│ ├── cowsay-cli
│ ├── csv-to-org-table
│ ├── el2sh
│ ├── hello
│ └── org-capture
├── early-init.el
├── eintr.org
├── el-search.org
├── emacs-and-emacs-lisp.org
├── etc
│ └── yasnippet
│ └── snippets
│ ├── fundamental-mode
│ │ ├── chrome
│ │ └── date
│ ├── minibuffer-inactive-mode
│ │ ├── dir
│ │ └── file
│ └── org-mode
│ ├── el
│ ├── example
│ ├── ipython
│ ├── python
│ ├── quote
│ └── src
├── init.el
├── lisp
│ ├── ace-link-notmuch.el
│ ├── annotate-word.el
│ ├── chunyang-buffers.el
│ ├── chunyang-chinese.el
│ ├── chunyang-comment.el
│ ├── chunyang-dired.el
│ ├── chunyang-edit-minibuffer.el
│ ├── chunyang-elisp.el
│ ├── chunyang-eshell-ext.el
│ ├── chunyang-fun.org
│ ├── chunyang-git.el
│ ├── chunyang-github.el
│ ├── chunyang-lib.el
│ ├── chunyang-linux.el
│ ├── chunyang-mac.el
│ ├── chunyang-macros.el
│ ├── chunyang-mail.el
│ ├── chunyang-misc.el
│ ├── chunyang-org.el
│ ├── chunyang-package.el
│ ├── chunyang-picture.el
│ ├── chunyang-shell.el
│ ├── chunyang-simple.el
│ ├── cowsay.el
│ ├── dmenu.el
│ ├── echo.el
│ ├── eim.el
│ ├── eval-before-load.el
│ ├── explain-command.org
│ ├── explain-crontab.el
│ ├── flycheck-languagetool.el
│ ├── helm-joe.el
│ ├── helm-mdfind.el
│ ├── ls-tree.el
│ ├── mark-align.el
│ ├── nian.el
│ ├── number-word.el
│ ├── ob-eshell.el
│ ├── pin.el
│ ├── progress-bar.el
│ ├── racket-ext.el
│ ├── recentb.el
│ ├── sml-eldoc.el
│ ├── symbolic-link-on-save.el
│ └── vm.el
├── misc
│ ├── Restart-Emacs.applescript
│ ├── chunyang-clocking-task.1m.sh
│ ├── emacs.sh
│ └── include-code-prettify.html
├── module
│ ├── Makefile
│ └── taglib-core.c
└── pcase.org
10 directories, 76 files
~/.emacs.d $
也就是照Spacemacs那套思路了?
比如common-lisp配置和SLIME配置放一起,smex配置和ivy配置放一起……总之能被归类的统统归类在一个文件下,实在不能归类了再开单独的文件,尽量避免出现一个文件就两行代码的情况?
我自己的配置来源于purcell/emacs.d, 最近闲的没事干就在做压缩文件数量的事情,所以就有了这个问题。
我还没到写package的境界……还是用一大堆别人写的packages攒……
但是我同意你的观点,如果一段代码已经不是在“配置”什么已有的东西,那么就应该写成package。
管理的时候,文件划分越清晰越好。执行的时候,文件越少越好。
少 既 是 多
outshine 支持其他语言吗?
同 Steve Purcell, 他好认真,有一次问他一个问题,回复的相当详尽。
文件数量确实需要权衡,不是越多越好,也不是越少越好。
之前很长时间(至少5年)我都只有一个.emacs
文件,后来改为了init.el
。当时没有那么多好的 package用也还好,后来发现越来越大越来越复杂,甚至有了跨平台需求,这时候就开始考虑分文件了,一是为了方便管理,二是为了跨平台和配置需求。再后来采用了use-package
方案,进一步简化了配置,着重平衡了速度和功能之间的矛盾,这就是Centaur Emacs
的由来。
支持,不过和emacs lisp里的语法不一样,emacs lisp ;;;
到 ;;;;;;
的语法是为了支持以前的outline。其他语言是用注释里用星号,比如python # *
到 # *****
。
啊,是可以的。
不过我发现如果注释是在某个函数里面那么就行不通了。
别的没试过,emacs lisp里是可以的