EMACS-DOCUMENT

=============>集思广益

合理地在Emacs中使用分页符

今天我想说一说 GNU Emacs 的概念, 我是怎么使用页的,以及为什么我要使用页. 在我的经验看来页的作用经常被Emacs用户所忽视, 原因可能是都觉得它太丑了吧, 不过我会告诉你一个package可以美化它. 同时,我还会推荐你一个package可以实现很方便的在各页之间跳转.

1 A Crash Course Introduction to Pages

Emacs中的‘页’指的是那些被form-feed字符(即^L,或者说Ctrl+L字符)所分割的那些文本. 在Emacs中可以按下 C-q C-l 来输入. 其中 C-q 是告诉Emacs直接插入你接下来输入的键. 正常情况下按下 C-l 会运行命令 recenter-top-bottom. 因此我们不能通过直接按下 C-l 的方式插入form-feed字符. 不过 C-q C-l 则是告诉Emacs忽略 C-l 所绑定的命令,直接插入字面量^L, 而这个字符正是我门用来将文本分割成页的字符.

我们可以通过 C-x [C-x ] 来向上/向下翻页. 他们对应的命令分别是 backward-pageforward-page. 另外,按下 C-x C-p 可以选中我们当前页的所有内容.

关于页的介绍就差不多了. 下面来说说帮助我们在页之间跳转的那些package.

2 Why Use Pages?

我喜欢将内容按页分成几个章节,尤其在编程时更是如此. 比如我的工作室最近刚编写了一个名为 Chance 的库. 其源代码 就用分页符分成了几个部分,当然,这你在Github上是看不出来的;这些分页符看起来就像是一个空行而已,不行你可以看看第228行. 不过在Emacs上,分页符可以看起来像是这样的. emacs-pages.png

借助Steve Purcell那超赞的 page-break-lines package可以让丑陋的^L字符显示成这些漂亮的横线.

Chance 使用了 LDoc 来生成文档—LDoc类似于Javadoc的Lua版本. 在LDoc中,我们可以使用 @section 标注来将代码组织成相关的几块. 我在每个创建新 @section 的注释前都插入一个分页符,这样一来,源代码的各个块就与Emacs的各个页一一对应起来了.

如此,我就可以通过页在源代码的各个块之间跳转了. 我当然可以用前面提到过的 C-x [ / C-x ] 来跳转,但其实还有更好的方案….

3 A Nicer Way to Navigate Pages

我觉得用 helm-pages 在页之间跳转挺不错的. 当我在 Chance 的源代码中调用 helm-pages 后,看到的结果是这样的: emacs-helm-pages.png 它会列出每页的第一行内容,这样可以很容易的在代码的各部分之间进行跳转. Chance 的测试案例 也一样用分页符划分成了几部分, 用 helm-pages 来浏览的效果也不错. 而且每个page的第一行恰好是一个调用 describe() 的语句,这条语句说明了这部分代码测试的内容(我用Busted 来进行单元测试).

4 Conclusion

是的,这是一篇很多的文章,不过也确实没什么好说的了. 希望本文能告诉你如何将代码划分出多个页,同时如何在这些页之间进行快速的跳转. 如果你从未用过页,那么请尝试一下,也许你会像我一样,发现这真是组织文件内容的好工具.

Update (2015年12月15日): 强烈推荐阅读此文info by Artur Balabarba on page-breaks.