刚刚学到一招:简便 Emacs 折行
有一行长长的文字,显示出来整个屏幕都戳出去看不到头尾了,于是想着怎么给它折一下行。
上 Google 搜了一下,找到一个命令,叫 fold,很简单好用,马上试了一下,呃,不行😖,对中文支持有问题,折出乱码来了…
于是联想了一下,这个文字处理工作编辑器最在行了,我最常用的 Emacs 下就自带一个折行的快捷键。于是开始思考怎么方便的用 Emacs 实现这个简单的功能。
有一种方法是显然不能接受的,步骤太多了:
- 打开 Emacs 窗口(或把现有的 Emacs 窗口调到前台)
- 把长文字粘贴进去
- 按一下 M-q 快捷键(fill-paragraph)
- 把折好了的所有文字选中,拷贝出来
我想要的是类似于 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。
真是太赞了😆!