[Perl] linesplit - Utility per il break automatico di testi

Stato
Discussione chiusa ad ulteriori risposte.

imported_BlackLight

Utente Silver
16 Agosto 2007
211
8
1
98
Per chi come me usa Vim quotidianamente (ma il discorso è perfettamente se a Vim si sostituisce qualsiasi altro editor, blocco note di Windows compreso) è una rogna dover gestire file contenenti linee lunghissime, abbondantemente al di là dei margini, usando i tasti direzionali o 'hjkl' per muoversi continuamente avanti e indietro nella linea. È anche una rogna scrivere email usando Vim all'interno di Mutt con la funzione di break automatico, che interrompe la riga e va a capo in genere dopo 80 caratteri, e operare una correzione a metà dell'email quando si è già arrivati alla fine. A quel punto si opera la correzione, poi in genere si cerca di ristabilire manualmente il break delle righe, per fare in modo che il margine degli 80 caratteri massimi venga rispettato. Una cosa a dir poco abbruttente.

Ora quei tempi bui sono terminati. Non avendo trovato nulla di simile in giro (ma sono sicuro che sia possibile qualcosa del genere usando le magie nere di sed e/o awk, ma non volevo addentrarmi in meandri di scripting e sequenze simili all'aramaico note solo a pochi massoni eletti), ho sviluppato un minuscolo ma IMHO utilissimo script in Perl che consente, dato un testo da file o via stdin, di stabilire automaticamente la larghezza massima dei margini a un numero di caratteri predefinito (di default 80, ma stabilibile con l'opzione -n), e scrivere il risultato su stdout o su un file di output. Più o meno come opera l'opzione :set textwidth=n in Vim, ma mentre quell'opzione funziona solo mentre si digita il testo e inserisce automaticamente un break quando vengono digitati n caratteri, questo script opera su un testo già fornito, sistemando correttamente i break delle linee.

Link:
http://sprunge.us/jbeC

Si integra alla perfezione con Vim. Basta piazzare lo script nel proprio PATH e quindi inserire in .vimrc le righe

Codice:
nmap \ls :%!linesplit<CR>
vmap \ls :!linesplit<CR>

A questo punto, digitando \ls in normal mode tutto il file verrà breakkato (di default ogni linea conterrà al massimo 80 caratteri e le parole non verranno spezzate). In visual mode sarà invece possibile selezionare il blocco da breakkare, e digitando \ls solo quelle righe verranno spezzate.

Ancora, dando

Codice:
linesplit -i text1.txt -o text2.txt -n 40

si splittano in righe il file text1.txt mandando l'output a file2.txt. Mentre

Codice:
cat text.txt | linesplit

splitta in righe il file text.txt mandando l'output su stdout.

Lo script magari può sembrare banale, ma dopo tanto tempo di splitting manuale sui testi avevo bisogno di un'utility del genere.
 
Per vim ci sono i vari f e t (per non parlare dei "moltiplicatori" di comandi), che hanno sempre risolto i miei problemi in tal senso, può essere comunque utile per la formattazione "al volo" di qualche documento con un preciso text width (visto che è vero che l'opzione in vim funzia solo mentre uno lo sa scrivendo, il testo).

Comunque, come dicevi tu, si può ottenere con qualche trick da bash, ma probabilmente si può ottenere anche con qualche trick da vim stesso (anche se al momento non mi viene in mente niente, non che io lo conosca oltre il normale uso).

Resta il fatto che è una cose utile per fare formattazioni al volo e senza troppi scazzi, per questo ti ringrazio per la pensata ^^
 
shura ha detto:
http://www.imagebanana.com/img/38xovomn/08052010143845.png

io non so usare sed, ma lo script di blacklight come ha detto lui non ti taglia le parole come quello che hai fatto vedere tu...
 
shura ha detto:
http://www.imagebanana.com/img/38xovomn/08052010143845.png

shura fail :O

A usare sed in quel modo non ci vuole tanto, ma questo script è diverso. Se usi sed in quel modo ti assicuri che ogni linea a esattamente 5 caratteri, e breakki le parole in mezzo. Se operi su file di testo, generalmente non vuoi spezzare le parole in mezzo. Vuoi piuttosto assicurarti che ogni linea abbia al più n caratteri, e se appendendo a quella linea la parola successiva la linea va oltre questo limite, allora sbatti fuori quello che hai appeso finora alla linea e cominci una nuova linea. Magari c'è un modo oscuro per fare questo anche in sed e/o awk e/o grep, modo che include sequenze di regex da 123456 caratteri che sembrano un incrocio mal riuscito fra l'aramaico antico e /dev/urandom e implicano il sacrificio di una vergine a Satana per essere invocate, ma il mio metodo è decisamente più intuitivo.

http://img121.imageshack.us/img121/6608/201005081522221280x800s.png
 
se ci metti \s al posto di [ ] è anche meglio e magari strippi gli \s a inizio e fine, non ci vuole molto, verrebbe figo :D
 
Stato
Discussione chiusa ad ulteriori risposte.