我要求将ASCII文档分成每页最多58行的页面。在每页的底部有一个3行页脚。我不知道Vim中有任何能够实现这一目标的分页能力。
使用Vim有一个很好的方法吗?也许突出每一个第58行或类似的东西。
N.B。我看到的答案涉及使用一个单独的工具来做到这一点;这是我想到的。我感兴趣的是Vim解决方案。
感谢。
答案 0 :(得分:3)
您正在寻找的正确工具很可能是a2ps。
a2ps --lines-per-page 58 --footer=footer_text document.txt
答案 1 :(得分:2)
为什么使用vim很重要?您可以更有效地使用split
和cat
。
假设您的原始文件名为file
,并且您创建的文件footer
包含您的页脚文字。
$ split -l 58 file file_parts
$ for i in file_parts*; do cat $i footer > $i.footered; done
$ cat file_parts*.footered > file.footered
file.footered
会在第58行插入原始文件,内容为footer
。
这假设您希望将它全部放回原始文件中。如果不这样做,那么生成的file_parts * .footered文件将是已经分离的页面,因此您可以跳过最后一步。
答案 2 :(得分:2)
vim可以作为脚本。将以下内容放在文件中,并在要更改的文件打开时将其:source
。 s:页脚列表是每次运行58行后要插入的行。
let s:footer = ["","Footer",""]
let s:line = 0
while s:line <= line("$") - 58
let s:line = s:line + 58
call append(s:line, s:footer)
let s:line = s:line + len(s:footer)
endwhile
答案 3 :(得分:2)
在vim中执行此操作的最有效方法是脚本(如Geoff Reedy已建议的那样)和替换(如:%s@\%(.*\n\)\{58}@\0---\rfooter\r---\r@
)。宏(如对此问题的评论中所建议的)是最慢的,脚本是最快的。替换比脚本慢,但比宏更快。
所以替换是最好的仅限Vim的解决方案,除非它的性能是不可接受的。在这种情况下,值得编写一个脚本。
答案 4 :(得分:1)
您可能正在尝试使用错误的工具。你可以通过编程方式更容易地完成它,例如使用这个简单的Perl oneliner:
perl -pe'print "your\nfooter\nhere\n" unless $. % 58' inputfilename > outputfilename
答案 5 :(得分:1)
递归宏可能有效。试验以下内容(将光标定位在第一行的第一个字符上并切换到正常模式):
qqq
qq
57j
:read footer.txt
3j
@q
q
请注意,必须清除录制宏的寄存器(qqq
),并且在读取页脚文件(:read footer.txt
)时不得使用制表符完成。
然后您可以使用宏(普通模式):
@q