2009-08-23 10 views
2

Je souhaite formater les fichiers texte de sous-titres srt pour éviter les problèmes d'encapsulation sur mon lecteur multimédia.Modifier la largeur de l'habillage dans un fichier texte à l'aide de Vim

J'ai besoin de définir une largeur d'enroulement de ligne à un nombre de caractères, par ex. 43

Je peux le faire avec EditPlus, c'est une fonction intégrée et fonctionne bien. La raison pour laquelle je veux le faire dans Vim, tout d'abord Editplus est seulement disponible sur le PC et le second Vim est badass.

J'ai trouvé la solution suivante sur le net ..

: set tw = 43
gggqG

Il fonctionne, mais pas exactement comment je le veux.

E.g.

J'ai ce texte:

00: 47: 39487 -> 00: 47: 42453
Je vais devoir compléter certaines procédures,
et je vous ai demandé de vérifier ce que ils sont pour moi

après que je formate, je reçois:

557 00: 47: 39487 -> 00: 47: 42453 Je vais
doivent remplir certaines procédures, et je
vous a demandé de vérifier ce qu'ils sont pour
me

Il semble ignorer les sauts de ligne/CRs. Comme vous pouvez voir le "je vais" a été ajouté à la première ligne.

Comment l'obtenir pour ne pas ignorer les sauts de ligne?

EDIT: apoligies sur la mise en forme, la première fois en utilisant stackoverflow!

+1

on dirait qu'il est mise en forme par le paragraphe (bizarre compte tenu de vos commandes sont correctes). – p00ya

Répondre

6

Vous pouvez utiliser l'option d'espaces blancs formatoptions et faire en sorte que les lignes que vous souhaitez recouvrir se terminent par des espaces.

:set tw=43 
:set fo+=w 
:g/^\a/s/$//
gggqG 

La troisième ligne ajoute un espace à l'extrémité d'une ligne commençant par une lettre et fo+=w arrêts gq de lignes de jonction qui ne se terminent pas par des espaces.

Voir:

:help fo-table 
:help 'formatoptions' 
:help gq 
:help :g 

Modifier en réponse aux commentaires

:g/^\a/s/$//

Cela se traduit par:

:g/ " Search the file 
^\a " For lines starting (^) with an alphabetic character (\a - equivalent to [A-Za-z]) 
/ " Then on each line that the regexp matches (i.e. each line starting with an alphabetic character) 
s/ " Substitute... 
$  " The end of line (zero-width match at the end of the line) 
// " With a space (slashes are delimiters) 

La commande globale (:g) ne fonctionnera que sur le courant fichier, mais le textwidth et formatoptions lignes durera toute la session. Si vous voulez que ces options ne seront utilisées que sur le tampon courant, utilisez :setlocal à la place:

:setlocal tw=43 
:setlocal fo+=w 
:help :setlocal 
+0

Super! Cela imite maintenant le comportement de Editplus. Cependant, certains aspects de la réponse d'erichui fonctionnent encore mieux. Parce que cette solution tient compte des sauts de ligne, si un mot est au-delà de 43 caractères, il est poussé sur la ligne ci-dessous, mais il conservera le saut de ligne original, donc une ligne ne pourrait contenir qu'un seul mot suivi d'un autre ligne, semble juste étrange. Mais c'est juste être difficile maintenant! Merci Al :) – Fred

+0

Et que signifie exactement ": g/^ \ a/s/$//"? Aussi une fois que j'ai exécuté cette commande, Vim semble se souvenir de tout document que j'ouvre dans cette session, comment le réinitialiser à la valeur par défaut sans rouvrir Vim? – Fred

+0

@Jon: J'ai ajouté une explication de: g ///. Aussi une explication de la façon de rendre le tampon de paramètres local. Je ne suis pas sûr de comprendre le commentaire d'une ligne avec un mot: si je comprends bien, si toutes les lignes se terminent dans l'espace, gq devrait les trier. Peut-être pourriez-vous donner un exemple? – DrAl

0

Je ne vois pas exactement quel est le problème en raison du formatage de votre article, mais vous voudrez peut-être vérifier le paramètre 'formatoptions' dans l'aide de vim, en particulier: fo-table qui contient un tas de drapeaux de personnalisation .

This link peut être utile.

1

avec le texte suivant (à savoir seulement 3 lignes):

557 
00:47:39,487 --> 00:47:42,453 
I will have to complete some procedures, and I asked you to check out what they are for me 

Utilisez gqq (format ligne en cours) sur la 3ème ligne après la mise en tw. Le formatage par paragraphe ne fonctionnera pas puisque vim traitera les 3 lignes comme faisant partie du même paragraphe (les paragraphes ne se terminent que par une ligne vide).

+0

Cela ne va malheureusement pas convenir car un seul fichier texte sera composé de centaines de 'blocs'. De l'exemple qui est le 577ème! Donc, éditer un paragraphe prendra du temps. Je cherche un moyen d'automatiser le processus pour l'ensemble du fichier, comme le fait gggqG. – Fred

2

Si les seules lignes que vous voulez envelopper sont celles qui commencent par du texte (ignorer celles qui commencent par des chiffres), vous pouvez utiliser ce qui suit.

:g/^[a-zA-Z]/normal gqq 

Ceci exécutera p00ya's command sur chaque ligne de texte du fichier.

1

Bien que pas vraiment robuste (ou élégant), si vous pouvez supposer que les lignes de sous-titres ne commencent pas par des nombres, vous pouvez configurer Vim pour les traiter comme des commentaires.

:set comments=:0,:1,:2,:3,:4,:5,:6,:7,:8,:9 
gggqG 

Les lignes commençant par 0-9 seront traitées comme des commentaires et ne seront pas fusionnées avec le texte.

Questions connexes