2010-01-26 52 views
2

我需要將ASCII文檔分隔成每頁最多長度爲58行的頁面。在每頁底部有一個3行頁腳。我沒有意識到Vim中的任何分頁能力都可以實現這一點。如何將頁面與Vim分開?

有沒有一種好的方法來與Vim做到這一點?也許突出每58行或類似的東西。

N.B.我看到的答案涉及使用單獨的工具來做到這一點;這是我想到的。我感興趣的是Vim解決方案。

謝謝。

+0

把握;你可以寫一個相當於'while(1)do {58j; rfooter。txt}',但這比其他任何解決方案都要慢。也許如果你解釋了爲什麼你想要一個vim解決方案?並不是每一個錘子般的物體都必須適用於所有看起來有指甲的東西......至少不是沒有應用賞金。 – Ether 2010-01-26 03:47:27

回答

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 
+0

我想這是最好的Vim唯一的解決方案。如果有一些本地方式來做到這一點,那將會很不錯。 – 2010-01-26 12:30:17

+0

你也可以把它變成一個函數和命令(可選地在一個插件中),並帶有一個行數參數。然後它變成一個簡單的例子,輸入':Paginate 58'或類似的東西。如果您想要非常聰明,可以自動刪除舊頁腳並重新添加它們(只要沒有文檔正文中的文本匹配風險)。 – DrAl 2010-01-26 16:05:21

2

爲什麼使用vim很重要?您可以更高效地使用splitcat

假設您的原始文件名爲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文件將是已經分離的頁面,所以你可以跳過最後一步。

1

您可能試圖爲此使用錯誤的工具。你可以用這個簡單的Perl oneliner做更容易編程,例如:

perl -pe'print "your\nfooter\nhere\n" unless $. % 58' inputfilename > outputfilename 
3

你正在尋找正確的工具很可能a2ps的。

a2ps --lines-per-page 58 --footer=footer_text document.txt 
+0

很好的答案,但我想知道Vim是否可以用於此目的。 – 2010-01-26 03:03:21

2

做這件事在VIM最有效的方法是腳本(如蘆葦叢傑夫已經建議)和替代(如:%[email protected]\%(.*\n\)\{58}@\0---\rfooter\r---\[email protected])。宏(如對此問題的評論中所建議的)最慢,腳本是最快的。替代比腳本慢,但比宏更快。

所以可能的替代是最好的Vim唯一的解決方案,除非它的性能是不可接受的。在這種情況下,值得編寫一個腳本。

1

遞歸宏可能工作。實驗用下面的(在第一行的第一個字符位置的光標,並切換到正常模式):

qqq 
qq 
57j 
:read footer.txt 
3j 
@q 
q 

注意到錄製宏寄存器必須被清除(qqq),並且你必須讀取頁腳文件(:read footer.txt)時不使用tab-completion。

然後,您可以使用宏(正常模式):

@q