用vim对txt格式的小说重新排版

12:01:00 AM 0 Comments

小说最通用的格式是txt,但制作的txt文件质量参差不齐,经常有一些毛病,比如段落前没有缩进,文件中植入了网址,章节前后没有缺少空行,空行过多,段落内每行用回车键断开等。这些问题用vim处理非常方便。


如图所示,排版尚好,但是每段内容内每行都用换行分割,需要去掉换行。每段段首有缩进。两种方式解决:普通的替换方式和全局的行合并方式。

1)段内换行,每个回车符后面紧跟着汉字或符号,假定都是双字节字符。匹配之后去掉换行

:%s/\n\([^\x00-\xff]\)/\1/g

或者反过来,假如换行符后紧跟的不是空格或者换行符,则删掉这个换行符

:%s/\n[\n ]\@!//g

2)行合并。从前一个开头有空格的行到后一个开头有空头的行之前的一行,全部合并。

:%g/^\s/,/^\s/-1j!

这里用j!是因为用j的话行之间会留一个空格隔开。解决办法一是用j!,二是先设置:set fo+=B,再用j。其表示删除双字节字符之间的空格,详情可以:h formatoptions 和:h fo-table查看。

 

其它常要用到的还有

1、删除行末的空格

:%s/\s\+$//g 或 :%s/\s*$//g

2、删除空行

:%g/^[ \t ]*$/d

3、删除连续空行,假如最多保留1个。

:%s/\n\n\+/\r\r/g

2和3可以组合起来

:%s/\([ \t ]*\n\)\+/\r/g

4、在章节之前或之后添加空行

:%s/^\s*第\(.*\)章/\r第\1章/g

为防止匹配到不是章节标题的行,可先用 :g/^\s*第.*章 看看匹配结果是否正确。类似的也可以在章节标题之后添加空行

:%s/^\s*第\(.(\)章\(.*\)$/第\1章\2\r/g

Some say he’s half man half fish, others say he’s more of a seventy/thirty split. Either way he’s a fishy bastard.