「2016 与我的数字生活」年度征文入围作品
今年,我们在 2016 年度盘点 中举办了一次大型年度征文活动,鼓励大家围绕「数字生活」为主题,回顾刚刚过去的 2016 年。我们给予最开放的选题、最自由的投稿方式、有史以来最丰厚的 奖品,以及跨越春节的两个月充足时间,等你参与。你可以 点此查看 活动规则和奖品清单。
本文是「2016 与我的数字生活」征文活动的第 6 篇入围作品,我们会在两个月的活动期内,不定期从收到的投稿中挑选发布优秀的文章。所有经此发布的文章,即为已入围征文活动。本文仅代表作者本人观点,少数派仅对标题和排版略作调整。
纯文本是最简单的文件。字符构成了它的全部,字符构成也是纯文本的唯一。纯文本中没有格式、没有层次级别。但同时,作为最简单的文件,任何的编辑器都可以编辑。虽然非常简单,但是不代表它可以做到的功能就简单。
第一步,标记增强
不同于富文本,纯文本是没有格式的,只有字符本身。
作为纯文本增强的实验,第一步,从中选取一些字符。这些字符将作为更高等级的公民,作为标记符提供额外的信息。
现在开始第一步,加入第一个符号 -
。例如,我们约定,以 -
开头的行,会成为无序列表的一个项目。类似于:
- Google Pixel Phone
- iPhone 7 128GB Jet Black
- DJI Osmo Mobile
- DJI Phantom 3
现在看起来仅仅是更加规整。不过,效率工具 TaskPaper 可以为这样简单的纯文本赋予生机。
刚刚那段文本在 TaskPaper 里面打开,就变成了单独的一个个待办事项。点击可以完成,拖动可以移动位置。就好像刚刚的那个纯文本,现在变成了一个全功能的待办事项工具。
下面,我们将超越一个待办事项工具,提供一些高级的任务管理功能。
TaskPaper 完整的 基本语法 其实并不复杂:
:
结尾的可以作为一个 project,整理待办事项。@
开头的可以添加标签。而标签可选加入值。
标签可以作为分类的标志,归纳待办项目。选择标签,可以 Focus 同标签内容
还可以方便地实现想要的功能。例如,我们定制一个表示已完成的过滤器,只需一条逻辑语句。
not @done except @done//*
简单的内容构造出了无限大的内容。TaskPaper 不是给你一个解决方案,而是给你一个解决平台。每个人可以通过自己的需要构造自己的使用方式。
上为 TaskPaper, 下为文本原貌
还记得这一套背后是什么?仅仅是那段简单的纯文本。
Inbox:
- Google Pixel Phone @done
- iPhone 7 128GB Jet Black @priority(3)
- DJI Osmo Mobile
- DJI Phantom 3
进一步丰富
纯文本发送邮件的时代,为了满足格式排版的需求,就自发地加入了各种符号组织文本结构。例如,*
看起来很像是 bullet,那个无序列表前面的小黑点,于是就被拿来在正文中使用。
再后来就是一个集大成者,也就是 Markdown 的设计。拥有了 Markdown,我们将纯文本变得富文本那样格式丰富,同时保持易用。
这时,纯文本可以拿来做更加复杂的工作。
结构获得生产力
拥有格式标记、层级标记的纯文本标记语言 Markdown,可以让纯文本的写作快捷连贯,可以很容易将脑海中的结构表达于文本中。但是编辑器还没有利用组织结构提供编辑优势,段落排列、章节排列这样的结构化编辑,甚至是一些高级编辑器才提供的功能。
FoldingText 就是注重结构的一款 Markdown 编辑器。
曾经有人为 FoldingText 写了一篇 评价,评论 FoldingText 为「伪装成 Markdown 编辑器的 outliner」。说出了 FoldingText 的特点,FoldingText 将整个文档以树状结构组织,看重了文档背后的结构逻辑。
之后的主要操作也是面向这个逻辑,也就是说,纯文本不再是孤立的那一堆字符了。FoldingText 很看重对结构的处理,文档在其内部是规整的层次化方式面对。很多主要操作在于按照层次结构的移动。
Folding 功能,按照结构层次折叠起来。方便用于 focus 功能,或者关注于当前工作。


或者关注于某一标签,从FoldingText 的层面,纯文本文档不再是死板的,而是拥有层次结构的。
扩展获得生产力
Markdown 扩展
Markdown 设计很简单,但是流行却超乎意料。但是 Markdown 的保持精简同时,也放弃了一些功能。所以用起来总会觉得缺失了一点。
为了满足需求,许多的 Markdown 的修改、扩展诞生。GFM(GitHub Flavored Markdown)就是面向 Github 使用场景本身,修改了一点语法的 Markdown。还可以增加语法来实现更多的功能。CriticMarkup 希望为 Markdown 加入审阅语法,增强文档协作功能。
Ulysses 让 Markdown 写作本身专业更多,加入更多功能实现的 Markdown XL。扩展了很多功能,例如插入视频、脚注。
纯文本本来就是自由的,自从诞生就没有标准
这个意思。而无论使用什么方式,都不用担心用编辑器 A 修改后编辑器 B 就不可以使用,其本身就是开放的。所以,每个人可以根据自己的喜好去任意改变自己的文档。并且,不论用哪种方式折腾,都不会损害这个文本,因为其本质还是字符,区别只是使用者希望怎样面对。
从 FoldingText 说起
FoldingText 的作者就是 TaskPaper 的作者,他在介绍中分享了他开发 FoldingText 的心得。作者最初的目标,是仅仅使用纯文本,去完成他所有的日常工作,在十年期间一直为此做出努力和尝试。FoldingText 是 TaskPaper 的继任者1,完成 Markdown 编辑器功能、保留 TaskPaper 已有功能基础上,加入了 Calc、Todo、Schedule、Stopwatch 模式,让它能够做做更多工作。同样的普通的纯文本,用 FoldingText 打开之后就拥有了神奇的作用。
Calc 用于计算。计算结果可以显示一旁。
Example.calc
1.2 / (2.3 + 0.7)
a = 5.08 cm + 1 inch
a to inch
sin(45 deg) ^ 2
f(x, y) = x ^ y
f(2, 3)
Todo 用于规划日程。列表变得活起来,让文本作为待办事项管理工具。
Example.todo
- todo one
- todo two
Mix in notes as you see fit.
- todo three @done
例如,完成一个待办事项,会让其自动加入标签 @done。标签可以加入值,例如完成的待办事项被加入了带完成时间的标签 @done(2016-12-30)
Schedule 用于流程时间规划。FoldingText 会在相应时间点推送提醒。
Demo.schedule
Wait for 1 second
Wait for 3 seconds
Done in 1 second more
而 Stopwatch 用于计时器计时。
Example.stopwatch
- 2 minutes
- 20 seconds
父辈的优点,均可以继承
Markdown 是 HTML 的子集,原本设计中,Markdown 的标记符号可以被方便地检索并且替换成 HTML 标签。虽然说现在 Markdown 很少专门做这个工作,但是 Markdown 编辑器通常都支持插入 HTML。
也就是说,HTML 的内容可以被继承,被利用。比如,原版 Markdown 不支持删除线。对删除线有需求,可以混合 html 标签写在其中。类似于<del>word</del>
。
而 Web 技术这些年的发展成果,都可以让 Markdown 享受到。
开始有人对加入公式有需求,mathjax 是为 HTML 中的公式准备的解决方案。对代码高亮有需求,highlight.js 是为上百种编程语言语法高亮设计的。flowchart,sequence digram 为流程图、时序图准备的。
现在的很多Markdown编辑器看起来功能很丰富,但是本质上也是靠上述这些已有的开源解决方案来实现的。例如马克飞象、Marked 等软件本身其实是给了集成化的解决方案。
熟练使用这些丰富的扩展,是提高 Markdown 功能的重要方式。例如,参考 Ulysses 官方博客的一个 Tip,关于在文档中加入插入公式功能,方便科研人员写作。观察第二种方式,关于使用 MathJax 在 HTML 文档中加入公式功能。
需要引入一段代码
<script type="text/x-mathjax-config">MathJax.Hub.Config({tex2jax: {inlineMath:[['$','$']]}});</script>
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
这段代码的作用,其实是使用了一个 Mathjax 的 CDN,相当于在 HTML 中引入了 Mathjax 的功能 javascript 来提供丰富功能,然后导出效果就出现了公式的加入。
纯文本的 Markdown 就像是一个胶水,灵活,扩展性强。
想象力有多大,就可以让它扩展到多强。可以放开想象,思考一下其他可能
- 纯文本制作幻灯片
- 纯文本转换 HTML5 页面
- 类似 Excel 的表格统计
- 以及更多...
文本的流动
自从计算机诞生,世界上的程序就是大多为了和纯文本打交道。使用纯文本,所有的发展成果都可以继续使用。
例如,Linux 的 diff
可以比较文本区别的软件,大概和 Unix 的诞生一样早了。但是你仍然可以照样拿它来比较你的纯文本文档。比如,这个 Markdown 的文档。
再比如,开发者常用的一个代码版本控制、分布式协作的工具
git
。可以直接将其拿来管理你的文档库,然后可以做版本控制、文档协作。听起来有点不可思议,但是又很直接优雅。因为源代码文件与你的 Markdown 文档一样都是纯文本,如果这个功能想要使用,非常直观,直接用就好。
pandoc
是一个格式转换的瑞士军刀。本身开源免费。因此,几乎市面上全部的 Markdown 编辑器的格式转换功能,都是直接用 pandoc 实现的。
这时候可以发现一个适用于纯文本的方法论,就是不在于工具的功能丰富,每个工具只需要实现一个具体功能,复杂功能不过是将不同工具结合成工作流,让文本在其中流动即可。
工作流复用
当同样的工作序列被重复太多次,重复相同步骤不够优雅。因此,尽量将重用的工作流打包成一个可复用动作集合。所以,优秀的效率工具都会支持脚本扩展。例如 OmniFocus、Devonthink Pro。支持 Apple Script 脚本甚至是一个需要额外付费的高级功能,贵并且有学习门槛,为那些对效率高要求的极客打造。Mac 上的 Apple Script 是个有趣的脚本执行环境。许多应用都会可能内建支持,详细的可以打开 Script Editor 的字典查看。
虽然算是「编程」,但是门槛远比想象中要低。只需要将其当作工作的组合即可,用起来会像 iOS 上的 Workflow 一样直观。其中的每个动作,其实是应用提供的 API,调用即可。
FoldingText 是一个很好的案例。它提供了足够好的扩展性,很容易用 Apple Script 或者 JavaScript 编写插件,帮助自己工作流复用。
例如,需要一个归档已完成事项的功能。由几个动作构成。
- 从节点中寻找带有 @done 标签的项目
- 在底部新建一个名为 Archive 的标题
- 将这些已完成的一起移动 Archive 标题下,作为 Archive 的子节点
很容易将这套动作做为一套插件,方便使用。
FoldingText 让使用者面对自己工作更加主动。不需要一个个软件尝试,看看能不能完成自己工作,或者去等一个开发者给自己加上这个功能。FoldingText 直接提供一个图灵完备的平台,也就是说,几乎可以做想做的任何计算。
更多的可以去了解 Wiki 以及官方论坛。
TaskPaper
FoldingText
还可以关注那些积极贡献的效率极客。例如,RobTree 贡献了许多的,长期活跃在各大效率应用中,贡献许多 OmniFocus、DevonThink 脚本。
iOS 上,Editorial 支持了 TaskPaper 语法。甚至加上了许多有用的扩展。例如 @done 标签被蓝色高亮,@flagged 标签被红色高亮。拖动可以改变项目顺序。
对于工作流复用,Editorial 更加直白。直接用图灵完备的编程语言 Python 来实现。构造了一个 Python 执行环境在一个简单的文本编辑器里面。用 Python 来制作工作流。
一个写字的地方,突发奇想需要个 GTD 工具那样的 Focus 功能。那么自己随手写一个吧。
图中 Focus 了已完成 @done
插件扩展本身有使用门槛,但是门槛一点都不高。只需要最基本的面向过程的编程即可。。开发一个插件的结果通常是事半功倍的。
平凡的工具提供了插件机制,也就是提供了一个图灵完备的平台来处理文本。换个说法,在理论上,任何需要的功能,都是可以在这个基本的编辑器里完成。每个人使用只需要各取所需即可。
不知是否有所耳闻,在计算机发展中有两个传说一样的纯文本编辑器。编辑器之神 Vim,神之编辑器 Emacs。因为其优秀的插件扩展机制一直到现在还充满生命力。
上为 Vim,下为 Emacs
插件到底可以多么有想象力呢?比如,曾经有人用 Emacs 煮咖啡。
比想象中更广泛的应用
纯文本就像是白纸,怎么使用都不会错。如果喜欢 Markdown 的标记符号,那么直接拿来与工作合并即可,就像科学计算的 jupyter 做的那样,其笔记格式——jupyter notebook 可以混合 Markdown 笔记、代码块。在 jupyter 中可以方便地执行交互里面的代码。
如图所示,左边是交互使用的效果,右边是源文件本身。出乎意料的是,存储源文件不过只是一个混合了扩展 Markdown 的纯文本。Markdown 的精髓被作为一个部件来使用。
纯文本的本质
纯文本一直让人痴迷的一点是,其本身是和平台无关。纯文本的工作遵循一个重要的原则,代码和数据的分离。将信息和工作软件的解耦合,没有对工具的依赖,符合自己数据持久化的要求。
工作方式完全可以按照自己的喜好,换个软件不会让数据不可读写。
比如,Mou 彻底失败之后,不代表之前用 Markdown 写的文章就丢失了,可以马上换一个更合适的工具继续全部工作。
比如,手机上我用 Ulysses 写作,为了在电脑上同步工作,不代表我需要电脑上再购买一个 Ulysses,因为我的数据和工具是解耦的,文件同步即可
比如,某天 Markdown 突然不存在了,但是我可以直接用记事本一类的编辑器直接把文件打开,数据仍然存在。
但是,假如某天假如某一天 Office 突然消失了,那么 docx 格式就没有办法打开了,数据也就丢失了2。
打开一个复杂文档,真正关注的是其中的什么?长期习惯了面对复杂文档,但是可能大部分时间,真正关注的只是其中的文字。
例如,当我仅仅想要随手写点东西时候,我不希望第一步是没有目的地去设置文字以外的内容,我根本不想管到底是宋体还是黑体,四号还是小五,版面是 A4 还是 A5。这时候我想要关注的,仅仅是文字本身。
不要完全用纯文本工作
当然,我并不是否认富文本的意义。而是给日常的文档工作,一点额外的思路。纯文本工作,或者 Markdown 写作,本身并不是万灵药。如果工作仅仅关注文字以及结构本身,那么 Markdown 为次提供了一个刚好够用的 sweet point。
但是,当纯文本不能完成工作时候,或者完成起来让人觉得麻烦,那么这时候请及时退出,而不是浪费时间在那些「奇技淫巧」上。
例如,当正文需要两种字体时候,继续盲目坚持纯文本以及 Markdown 写作,就已经开始走偏了,进入到混乱及不优雅。不是不可以实现,而是由于其本身的设计,实现起来会花费更多的时间。
根据工作的重点,去使用合适的工具。
(如果你喜欢这篇文章,我们鼓励你在文末点赞和评论,这会成为 征文活动 最后评奖的参考之一)
喜欢少数派?欢迎关注我们的微博:@少数派sspai ,微信公众号: sspaime
少数派( http://sspai.com )