Emacs 文本自动换行
文本自动换行, 是学习新文本编辑器时最先关注的功能之一.
在文本编辑器里噼里啪啦打字, 结果文字一不小心就跑出了屏幕边缘. 不同的文本编辑器处理文本换行的方式各不相同.
Emacs默认情况下, 文字会一直向右延伸, 自动换行需要手动设置.
在 Emacs 中, 有几种方法可以实现文本换行. 个人最常用的是 visual-line-mode (视觉行模式) 和 auto-fill-mode (自动填充模式). 它们各有优缺点.
visual-line-mode 和 auto-fill-mode 有什么区别呢?
visual-line-mode (视觉行模式)
顾名思义, visual-line-mode 主要关注的是 视觉效果. 它实现的是
软换行 (soft wrap). 这意味着, 虽然你在屏幕上看到文本换行了, 但实际上
并没有在文本中插入真正的换行符.
如果在网页浏览器或其他程序中打开这段文本, 会发现, 文本会根据窗口的宽度自动调整换行, 这就是软换行的特点.
;; 开启 visual-line-mode
M-x visual-line-mode
(按下 M-x, 然后输入 visual-line-mode 并回车)
优点:
- 阅读舒适: 在 Emacs 窗口内, 文本按照屏幕宽度换行, 阅读起来更自然流畅.
- 灵活适应: 文本可以根据不同窗口尺寸自动调整, 适应性强.
缺点:
- 没有硬换行: 文本文件中没有实际的换行符. 在某些情况下, 这可能会导致格式问题, 例如在某些内容管理系统 (CMS) 中.
演示 visual-line-mode 的开启与关闭:
我现在启用了 visual-line-mode. 再次运行 visual-line-mode 命令 (
M-x visual-line-mode ) 就可以关闭它.
auto-fill-mode (自动填充模式)
接下来, 我们看看 auto-fill-mode.
;; 开启 auto-fill-mode
M-x auto-fill-mode
(同样, 按下 M-x, 然后输入 auto-fill-mode 并回车)
开启 auto-fill-mode 后, 当输入文本达到一定长度时, Emacs 会
自动插入硬换行符 (hard line break).
演示 auto-fill-mode 的效果:
现在我开启了 auto-fill-mode, 然后随便输入一些字符:
这是一段示例文本, 用来演示 auto-fill-mode 的效果. 当字数达到一定限制时,
Emacs 会自动插入硬换行符.
当文本达到预设的列宽时, Emacs 自动进行了换行. 如果你将这段文本复制到其他程序中, 换行符依然存在.
fill-column 变量和 M-q:
auto-fill-mode 的换行列宽是由变量 fill-column 控制的. 默认情况下,
fill-column 的值是 70 (或 80, 取决于 Emacs 配置). 你可以使用
M-x set-variable fill-column <列数> 来修改列宽.
;; 设置 fill-column 为 70
M-x set-variable fill-column 70
如果已经写好了一段文本, 但没有自动换行, 可以使用 *M-q 命令来 填充
(fill) 段落, 即根据 fill-column 的设置, 为段落添加硬换行.
优点:
- 硬换行: 文本文件中包含实际的换行符, 格式更稳定, 尤其是在需要硬换行的场景下 (例如纯文本文件, 某些文档格式).
- 列宽统一: 所有段落都保持相同的列宽, 看起来更整齐.
缺点:
- 可能影响 HTML 等格式: 在某些情况下, 硬换行可能会影响 HTML 等格式的渲染效果 (例如 WordPress 可能会保留硬换行, 导致显示异常). 但这并不绝对, 具体取决于目标平台的处理方式.
- 窗口利用率: 在宽屏显示器上,
auto-fill-mode可能会导致窗口两侧留白较多, 窗口空间利用率较低.
auto-fill-mode 在 Org Mode 中的潜在问题 (HTML 导出):
为了更直观地说明 auto-fill-mode 的潜在问题, 我们来看一个 Org Mode 导出
HTML 的例子.
假设我们有以下 Org Mode 文档:
#+OPTIONS: html-postamble:nil
* 演示 auto-fill-mode 对 HTML 导出的影响
** 开启 auto-fill-mode 的段落
这是一段开启了 auto-fill-mode 的段落, 我们来观察它导出到 HTML 后的效果.
** 未开启 auto-fill-mode 的段落
这是没有开启 auto-fill-mode 的段落.
我们分别在 auto-fill-mode 开启和关闭的情况下, 将其导出为 HTML.
开启 auto-fill-mode 导出的 HTML (Page Source 部分):
<div class="outline-2">
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">** 开启 auto-fill-mode 的段落</h2>
<div class="outline-text-2" id="text-2">
<p>
这是一段开启了 auto-fill-mode 的段落, 我们来观察它导出到 HTML 后的效果.
</p>
</div>
</div>
<div id="outline-container-3" class="outline-2">
<h2 id="sec-3">** 未开启 auto-fill-mode 的段落</h2>
<div class="outline-text-2" id="text-3">
<p>
这是没有开启 auto-fill-mode 的段落.
</p>
</div>
</div>
</div>
未开启 auto-fill-mode 导出的 HTML (Page Source 部分):
<div class="outline-2">
<div id="outline-container-2" class="outline-2">
<h2 id="sec-2">** 开启 auto-fill-mode 的段落</h2>
<div class="outline-text-2" id="text-2">
<p>
这是一段开启了 auto-fill-mode 的段落, 我们来观察它导出到 HTML 后的效果.
</p>
</div>
</div>
<div id="outline-container-3" class="outline-2">
<h2 id="sec-3">** 未开启 auto-fill-mode 的段落</h2>
<div class="outline-text-2" id="text-3">
<p>
这是没有开启 auto-fill-mode 的段落.
</p>
</div>
</div>
</div>
对比 HTML 源代码, 你会发现, 开启 auto-fill-mode 的段落, 在 <p>
标签内, 文本中包含了硬换行符. 虽然在浏览器中渲染效果可能没有差异,
但在某些对 HTML 代码有特殊处理的平台 (例如 WordPress),
硬换行可能会被保留, 导致意想不到的显示效果.
OpenOffice 文档导出:
与 HTML 不同, 将 Org Mode 文档导出为 OpenOffice 文档时, auto-fill-mode
的硬换行符会被忽略. 在 OpenOffice 中打开导出的文档, 你会发现,
无论是否开启 auto-fill-mode, 段落的显示效果都是一致的. 这说明,
不同的文档格式对硬换行的处理方式可能不同.
Org Mode 列表:
auto-fill-mode 还有一个影响, 那就是 Org Mode 列表的格式. 开启
auto-fill-mode 后, Org Mode 列表也会自动按照 fill-column
的设置进行换行, 列表项排列会更加整齐.
开启 auto-fill-mode 的 Org Mode 列表:
- 列表项一: 这是一段很长的列表项文本, 开启 auto-fill-mode 后, 会自动换行, 看起来更整齐.
- 列表项二: 这是第二个列表项, 同样很长, 也会自动换行.
- 列表项三: 第三个列表项.
*关闭 auto-fill-mode 的 Org Mode 列表: *
- 列表项一: 这是一段很长的列表项文本, 关闭 auto-fill-mode 后, 就不会自动换行, 可能会超出屏幕宽度.
- 列表项二: 这是第二个列表项, 同样很长, 也不会自动换行.
- 列表项三: 第三个列表项.
混合使用:
即使启用了 visual-line-mode 用于段落的软换行, 仍然可以使用 M-q (或
Alt-q) 命令来填充列表项或其他特定段落, 实现更精细的格式控制.
你可以根据需要, 灵活地结合使用这两种模式.
总结
- visual-line-mode (视觉行模式): 软换行, 阅读舒适, 适应性强, 但没有硬换行符.
- auto-fill-mode (自动填充模式): 硬换行, 格式稳定, 列宽统一, 但可能在某些情况下 (例如 HTML) 产生意外影响.
选择哪种模式取决于个人偏好和写作场景. 如果主要在 Emacs 中阅读和编辑文本,
或者文本最终会发布到网页等支持软换行的平台, visual-line-mode
可能更方便.
如果需要生成包含硬换行的文本文件,
或者希望文本在各种环境下都保持一致的列宽, auto-fill-mode 可能更适合.