2010-01-26 6 views
2

J'ai l'exigence de séparer un document ASCII en pages de longueur maximale de 58 lignes par page. Au bas de chaque page, il y a un pied de page de 3 lignes. Je ne suis au courant d'aucune capacité de pagination dans Vim qui accomplirait ceci.Comment séparer des pages avec Vim?

Existe-t-il un bon moyen de faire cela avec Vim? Peut-être en soulignant chaque ligne 58e ou quelque chose du genre.

N.B. Je vois des réponses impliquant l'utilisation d'un outil séparé pour ce faire; que j'ai pensé. Ce qui m'intéresse c'est une solution Vim.

Merci.

+0

Bien sûr; vous pourriez écrire une macro qui a fait l'équivalent de 'while (1) do {58j; rfooter.txt} ', mais c'est plus lent que toutes les autres solutions qui vous sont présentées ici. Peut-être si vous avez expliqué pourquoi vous vouliez une solution vim? Tous les objets ressemblant à des marteaux ne doivent pas être appliqués à tout ce qui a l'air clou ... du moins pas sans une prime appliquée. – Ether

Répondre

2

Il est possible dans vim comme un script. Mettez ce qui suit dans un fichier et :source pendant que le fichier à modifier est ouvert. La liste s: footer sont les lignes à insérer après chaque série de 58 lignes.

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

Je suppose que c'est la meilleure solution de Vim seulement. Ce serait bien s'il y avait une façon native de le faire. –

+0

Vous pouvez aussi en faire une fonction et une commande (éventuellement dans un plugin) avec un argument pour le nombre de lignes. Ensuite, il devient un simple cas de taper ': Paginate 58' ou quelque chose comme ça. Si vous voulez être vraiment intelligent, vous pouvez supprimer automatiquement les anciens pieds de page et les rajouter (à condition qu'il n'y ait aucun risque de faire correspondre le texte dans le corps de votre document). – DrAl

2

Pourquoi est-il important d'utiliser vim? Vous pouvez utiliser split et cat plus efficacement.

En supposant que votre fichier d'origine s'appelle file et que vous avez créé un fichier, footer, qui inclut le texte de votre pied de page.

$ 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 aurait votre fichier d'origine avec le contenu de footer insérés dans chaque ligne 58ème.

Cela suppose que vous voulez tout récupérer dans le fichier d'origine. Si vous ne le faites pas, alors les fichiers file_parts * .footered résultants seraient les pages déjà séparées afin que vous puissiez passer la dernière étape.

1

Vous essayez probablement d'utiliser le mauvais outil pour cela. Vous pouvez le faire beaucoup plus facile par programmation, par exemple avec ce simple oneliner Perl:

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

L'outil approprié que vous cherchez est a2ps très probable.

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

Bonne réponse mais je veux savoir si Vim peut être utilisé pour cela. –

2

Les moyens les plus efficaces pour le faire dans vim sont le script (comme Geoff Reedy déjà suggéré) et la substitution (comme :%[email protected]\%(.*\n\)\{58}@\0---\rfooter\r---\[email protected]). Macro (comme suggéré dans le commentaire à cette question) est le plus lent, le script est le plus rapide. La substitution est plus lente que le script, mais beaucoup plus rapide qu'une macro.

Donc, la substitution est probablement la meilleure solution Vim seule sauf si ses performances sont inacceptables. Dans ce cas, cela vaut la peine d'écrire un script.

1

Une macro récursive peut fonctionner. Expérience avec les éléments suivants (positionner le curseur sur le premier caractère de la première ligne et passez en mode normal):

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

Notez que le registre auquel vous enregistrez la macro doit être effacé (qqq) et que vous devez n'utilise pas de tabulation lors de la lecture du fichier de pied de page (:read footer.txt).

Vous pouvez ensuite utiliser la macro (mode normal):

@q 
Questions connexes