我需要將ASCII文檔分隔成每頁最多長度爲58行的頁面。在每頁底部有一個3行頁腳。我沒有意識到Vim中的任何分頁能力都可以實現這一點。如何將頁面與Vim分開?
有沒有一種好的方法來與Vim做到這一點?也許突出每58行或類似的東西。
N.B.我看到的答案涉及使用單獨的工具來做到這一點;這是我想到的。我感興趣的是Vim解決方案。
謝謝。
我需要將ASCII文檔分隔成每頁最多長度爲58行的頁面。在每頁底部有一個3行頁腳。我沒有意識到Vim中的任何分頁能力都可以實現這一點。如何將頁面與Vim分開?
有沒有一種好的方法來與Vim做到這一點?也許突出每58行或類似的東西。
N.B.我看到的答案涉及使用單獨的工具來做到這一點;這是我想到的。我感興趣的是Vim解決方案。
謝謝。
它可能在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
我想這是最好的Vim唯一的解決方案。如果有一些本地方式來做到這一點,那將會很不錯。 – 2010-01-26 12:30:17
你也可以把它變成一個函數和命令(可選地在一個插件中),並帶有一個行數參數。然後它變成一個簡單的例子,輸入':Paginate 58'或類似的東西。如果您想要非常聰明,可以自動刪除舊頁腳並重新添加它們(只要沒有文檔正文中的文本匹配風險)。 – DrAl 2010-01-26 16:05:21
爲什麼使用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
會對你與footer
在每一個第58行插入內容的原始文件。
這是假設你想把它全部放回原始文件。如果你不這樣做,那麼生成的file_parts * .footered文件將是已經分離的頁面,所以你可以跳過最後一步。
您可能試圖爲此使用錯誤的工具。你可以用這個簡單的Perl oneliner做更容易編程,例如:
perl -pe'print "your\nfooter\nhere\n" unless $. % 58' inputfilename > outputfilename
你正在尋找正確的工具很可能a2ps的。
a2ps --lines-per-page 58 --footer=footer_text document.txt
很好的答案,但我想知道Vim是否可以用於此目的。 – 2010-01-26 03:03:21
做這件事在VIM最有效的方法是腳本(如蘆葦叢傑夫已經建議)和替代(如:%[email protected]\%(.*\n\)\{58}@\0---\rfooter\r---\[email protected]
)。宏(如對此問題的評論中所建議的)最慢,腳本是最快的。替代比腳本慢,但比宏更快。
所以可能的替代是最好的Vim唯一的解決方案,除非它的性能是不可接受的。在這種情況下,值得編寫一個腳本。
遞歸宏可能工作。實驗用下面的(在第一行的第一個字符位置的光標,並切換到正常模式):
qqq
qq
57j
:read footer.txt
3j
@q
q
注意到錄製宏寄存器必須被清除(qqq
),並且你必須讀取頁腳文件(:read footer.txt
)時不使用tab-completion。
然後,您可以使用宏(正常模式):
@q
把握;你可以寫一個相當於'while(1)do {58j; rfooter。txt}',但這比其他任何解決方案都要慢。也許如果你解釋了爲什麼你想要一個vim解決方案?並不是每一個錘子般的物體都必須適用於所有看起來有指甲的東西......至少不是沒有應用賞金。 – Ether 2010-01-26 03:47:27