「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 功能,或者关注于当前工作。
![](https://cdnfile.sspai.com/attachment/origin/2017/01/18/364370.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
![](https://cdnfile.sspai.com/attachment/origin/2017/01/18/364371.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1)
或者关注于某一标签,从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 写作,就已经开始走偏了,进入到混乱及不优雅。不是不可以实现,而是由于其本身的设计,实现起来会花费更多的时间。
根据工作的重点,去使用合适的工具。
(如果你喜欢这篇文章,我们鼓励你在文末点赞和评论,这会成为 征文活动 最后评奖的参考之一)