学习了。
顺带提一下 vim 里的实现方法。
由于 vim 里有 J 和 gJ 两个指令,连接行已经十分方便了。(助记符是 join)
它们的区别是 J 连接行后,第一行行末和第二行行首的空格全部会删掉只保留一个。但有一些例外,比如如果第二行行首是标点符号,就不加空格了。如果第一行行末是句子结束用的标点,比如是 ., !, ? 之类的会加两个空格。
gJ 则是连接一律删除所有空格。
有些选项可以改变 J 的行为:置位 'cpoptions'('cpo') 中的 j 可以让 J 只在 . 后加两个空格(即是说 !, ? 之类加一个)。关闭 'joinspaces'('js') 这个选项(默认是开启的),可以让 J 的行为最多只加一个空格。置位 'formatoptions'('fo') 中的 M 可以让 J 智能判断,当处理多字节的字符时,比如中文、日文、俄文,一律不加空格。而处理单字节字符时,比如英文、法文,行为不变。
可以看出 vim 自带的功能也不能处理连字符。所以要想完成 z版 的工作也得自己写函数。先把行连接好,再把变成 '- ' 的东西删掉就行了。
function Join() range
exe a:firstline . ',' . a:lastline . 'j'
s/- //ge
endfunction
在某些情况下,比如文中自带了 '- ' 的情况,这样处理效果和 z版 的会有些区别。虽然这种字符是不合文法的,但也可以算是个 bug 吧。
另一方面,有的时候折可能会在连字符上出现。比如 a 2-year-old baby 这样的,即使在 year- 后面折行了,连接回来也不能删去 '-'。这种情况我和 z版 的小程序都不能处理。
[
本帖最后由 pangding 于 2013-1-22 11:16 编辑 ]