子文件的数量是越多越好还是越少越好?

一般配置写长了都会有很多的子文件出来,那么在不考虑可读性的前提下子文件的数量应该怎么决定?

另外有两种极端情况:所有的设置都在一个文件里为每一个feature/package单独建一个文件会对Emacs的性能或者别的什么方面产生影响吗?

我觉得不考虑他人可读性是个伪命题……过一段时间以后你自己的代码也会变陌生。

我个人觉得子文件不要过多。在buffer(一个文件)里跳转要比在各种文件里跳转轻松愉快很多。

你想保证代码结构整齐的话我推荐outshine(加强版outline),基本上是一个代码文件用的org-mode,你可以用分号的数量标示comment header,也可以像org-mode一样折叠展开:

2 个赞

模块的内部实现可以复杂,但是对外提供的接口最好尽量简单。所以把有点关系的都放一个文件吧。

对 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 $
2 个赞

也就是照Spacemacs那套思路了?

比如common-lisp配置和SLIME配置放一起,smex配置和ivy配置放一起……总之能被归类的统统归类在一个文件下,实在不能归类了再开单独的文件,尽量避免出现一个文件就两行代码的情况?

我自己的配置来源于purcell/emacs.d, 最近闲的没事干就在做压缩文件数量的事情,所以就有了这个问题。

我还没到写package的境界……还是用一大堆别人写的packages攒……

但是我同意你的观点,如果一段代码已经不是在“配置”什么已有的东西,那么就应该写成package。

管理的时候,文件划分越清晰越好。执行的时候,文件越少越好。

少 既 是 多

outshine 支持其他语言吗?

我是这样组织的,因为最初学习的时候是 Steve Purcell 的配置,所以风格比较近似,只不过,后来我加了 use-package 和 evil.

:joy: 同 Steve Purcell, 他好认真,有一次问他一个问题,回复的相当详尽。

文件数量确实需要权衡,不是越多越好,也不是越少越好。 之前很长时间(至少5年)我都只有一个.emacs文件,后来改为了init.el。当时没有那么多好的 package用也还好,后来发现越来越大越来越复杂,甚至有了跨平台需求,这时候就开始考虑分文件了,一是为了方便管理,二是为了跨平台和配置需求。再后来采用了use-package方案,进一步简化了配置,着重平衡了速度和功能之间的矛盾,这就是Centaur Emacs的由来。

支持,不过和emacs lisp里的语法不一样,emacs lisp ;;;;;;;;; 的语法是为了支持以前的outline。其他语言是用注释里用星号,比如python # *# *****

啊,是可以的。

不过我发现如果注释是在某个函数里面那么就行不通了。

别的没试过,emacs lisp里是可以的