为什么你应该试试一句话换一行

2022-06-23

在举起你的火把之前……这里说的不是最终的带格式文本,而是在写作阶段的 Markdown 版本中这么做。数字也很重要:你应该换并且只换一(1)行。

我去年偶然意识到这个小技巧,之后一直受用,只是担心过于琐碎和个人化,便未单独介绍。但最近发现类似主张至少在十年前便已出现,至今不时被重提(见文末延伸阅读),知名作者 Derek Sivers 本周还在发文提倡;便有动力拿出来做些分享和注解。

用 Markdown 写作的朋友都知道,Markdown 文件中的两个换行,在生成的 HTML 结果中会产生一个新的段落。那么,一个换行符会产生什么呢? 答案是只会变成一个空格

事实上,不仅那个换行符自己会变成空格,任何紧邻它前后的空格和制表符(tab)——不管是一个还是一百个——都会被一起清理,压缩到只剩一个空格。在 HTML 语境下,这称为「空白字符压缩」(whitespace collapse),在渲染段内文本这种行内格式化上下文(inline formatting context)时,属于默认做法。

技术上的描述听起来有点无聊,但如果在写作过程中巧妙地利用这一点,就可以带来极大的自由。

因为,这意味着你可以像写大纲和写诗一样来写文章;换言之,随意在段落内部回车和缩进,而不会影响到最终渲染结果。1

不过,由于空白字符压缩是基于西文环境开发的规则,如果在中文写作使用本文方法,需要在最后统一清理一下句号后多余的空格,对此全局查找替换即可;虽然多出一步,但相对于益处来说是可以接受的。

下图是一个直观的演示:

在左侧的源文件中,分割线上下的版本有明显差异:

  • 上面是语文课本里的原版,只在分段时用了换行;
  • 下面则是本文所建议的「写一句换一行」风格,还通过行首的空格,为具有从属关系的分句设置了缩进。

从右侧的预览可以看出,这两种写法产生的结果没什么区别,但后一种却有一些潜在的好处。回想写作过程,不难发现这种做法则更符合思考的节奏。一句话就是一个事实、一个观点;写完后按回车的动作,则自带一种确认和前进的隐喻。遇到从句较多、逻辑艰涩的场合,多出的留白和层次结构还能起到视觉上的辅助作用,有助于理清思路,避免左右互搏、顾前忘后。

这种做法的好处甚至不限于写文章,在工作中也可以用到。比如,如果你有幸……帮马斯克搞钱,也许这就能帮你避免近视度数加深:

其实,不少有经验的写作者本来就有类似习惯,只是一般会用第三方的大纲、思维导图等工具整理好思路,再导出为 Markdown 加工。但既然 Markdown 本身就能当作「草稿纸」来用,连导入导出的过程都省去了,何乐而不为呢?

除了方便谋篇布局,Sivers 的文章还提到了一些额外的好处,这里就直接复述:

  • 方便单独审视每个句子,删减无用废话;
  • 方便控制句子的长短变化,让行文有节奏感;
  • 方便上下移动句子,特别是批量移动;
  • 方便关注句子首尾措辞,让开头更有力、收尾更有余韵。

如果你有一定编程基础,相信更能理解这种做法的价值:在很多语法中,换行和缩进都不影响编译结果(没有针对 Python 和 YAML 的意思……),但确实会有约定俗成的语法风格,其目的就是让代码结构清晰、易于阅读。诸如代码格式器(formatter)、美化器(beautifier)等辅助工具,也是通过添加和调整换行和空格来发挥功能的。

此外,如果你对操作效率有较高要求,「一句换一行」更能锦上添花。因为从古老的 ed 开始,文本编辑器骨子里就更擅长以行为单位的操作;越顺应这种特点、积极分行,也就越能充分发挥编辑器的功能。

首先,在 VS Code 等大多数现代编辑器中,缩进的行会自动添加视觉辅助线,展示上下级从属关系;还可以通过行号旁边的箭头按钮,与上一层级折叠在一起。

其次,编辑器一般都支持用快捷键上下移动行,可以让你手不离键盘就调整句子顺序,省下大量剪切粘贴的功夫。一些常见编辑器的相关快捷键如下表所示:

编辑器 快捷键
BBEdit Control - /
Obsidian macOS: Option - /
Windows: Alt - /
Sublime Text macOS: Control - Command - /
Windows: Ctrl - Shift - /
Ulysses Control - Command - /
VS Code macOS: Option - /
Windows: Alt - /

对于 Mac 用户而言,即使编辑器本身不支持用快捷键上下移动行(如浏览器中、iA Writer、Typora 等),别忘了 macOS 各处通用的经典 Emacs 快捷键:

  • Control - A 移动到行首;
  • Control - K(kill)剪切从光标位置直到行尾的文本;
  • 在合适位置用 Control - Y(yank)把剪切的文本粘贴出来。

至于创建缩进,除了在光标位于行首时按 Tab 键这一标准做法,大多数编辑器都支持通过 macOS 下的 Command - ] 或 Windows 下的 Ctrl - ] 来增加光标所在行文本的缩进。

最后,如果你用 git 来管理写作版本,在有分行的情况下,可以很方便地看出哪里发生了修改。否则,就要使用 --word-diff 选项,并且对于中文效果很差。

当然,不是所有的文章都是从头写起。很多时候,我们是在他人的内容上加工和编辑。这种场合,如果将现有文本转换为「一句换一行」的样式,就能方便整理思路、仔细审视。

我们可以用正则表达式实现这一目的。具体而言,可以搜索如下内容:

(|||||\. |\? |! |: |; )([^\n])

也就是任何中文句号、问号、感叹号、冒号或分号,或相应的英文符号加一个空格,且之后不是紧接着换行([^\n])。

然后批量替换成:

$1\n$2

也就是在上述那些标点(第一对括号里的匹配项,$1)和它们之后的字符(第二对括号里的匹配项,$2)之间加入一个换行符(\n)。2

这里给出的正则表达式当然是一个粗疏的版本,没有考虑英文缩写中的句点、「一逗到底」的写作风格这类特殊情况;读者在使用时可以根据原文特征灵活调整。另外,如果你的编辑环境不支持正则表达式,得益于 Markdown 是纯文本,随便找一个支持正则表达式的在线编辑器,例如 Regex101,粘贴文本处理后再复制出来即可。

当然,本文的方法并不一定适合所有人(维基百科的贡献者们就分成两派),但也可以作为一个例子说明:人脑是一种湿件,视觉和心理上看似琐碎的提示,可能就会带来意外的帮助。有时,一点留白就能给思考增加深度,一段距离就能给创意留出空间。


延伸阅读


  1. 有的编辑器出于方便初学者理解、提高兼容性等考虑,会提供将单个换行符渲染为分段的功能。如果你发现本文方法无效,可以去设置中检查是否打开了类似选项。这种方式也是违反 Markdown 设计原意的,用不用本文方法都不建议打开。 ↩︎

  2. 这里给出的正则表达式当然是一个粗疏的版本,没有考虑英文缩写中的句点、「一逗到底」的写作风格这类特殊情况;读者在使用时可以根据原文特征灵活调整。另外,如果你的编辑环境不支持正则表达式,得益于 Markdown 是纯文本,随便找一个支持正则表达式的在线编辑器,例如 Regex101,粘贴文本处理后再复制出来即可。 ↩︎