刚刚学到一招:简便 Emacs 折行

有一行长长的文字,显示出来整个屏幕都戳出去看不到头尾了,于是想着怎么给它折一下行。

上 Google 搜了一下,找到一个命令,叫 fold,很简单好用,马上试了一下,呃,不行😖,对中文支持有问题,折出乱码来了…

于是联想了一下,这个文字处理工作编辑器最在行了,我最常用的 Emacs 下就自带一个折行的快捷键。于是开始思考怎么方便的用 Emacs 实现这个简单的功能。

有一种方法是显然不能接受的,步骤太多了:

  1. 打开 Emacs 窗口(或把现有的 Emacs 窗口调到前台)
  2. 把长文字粘贴进去
  3. 按一下 M-q 快捷键(fill-paragraph)
  4. 把折好了的所有文字选中,拷贝出来

我想要的是类似于 cat、grep 这类的过滤器,一头输入,另一头输出,这是 Unix 的设计精髓,那么,该怎么实现呢?打开 Emacs man 手册看了会儿帮助,试了几下,没什么收获,于是又上 Google 搜“emacs read from stdin”,马上找到一篇很有价值的回答:见这篇回答中关于 process substitution 的那个

最后实现的过滤管道组合命令如下:

cat | emacs -nw --batch -Q --insert <(cat) --eval '
; {%emacs-lisp%}
(progn
  (fill-region (point-min) (point-max))
  (message "%s" (buffer-string)))
  ; {%/emacs-lisp%}
' 2>&1

同时封装了一个名为 wrap 的脚本,在 http://github.com/baohaojun/system-config/raw/master/bin/wrap

真是太赞了😆!