J'ai un assez gros fichier texte formé de blocs comme
Short line.
Really long line.
Short line.
séparés par des lignes vides, et je voudrais utiliser vim (sous Linux) pour briser les longues lignes et obtenir des blocs comme
Short line.
This was
part of
a long line.
Short line.
Mon problème avec gq
(et gw
) est qu'il redistribue chaque bloc comme un paragraphe entier, c'est-à-dire qu'il ne préserve pas les deux sauts de ligne dans chaque bloc, et selon :help fo-table
aucune des gq
options de format de me permettrait de faire ce que je veux. J'ai également pensé que je pourrais atteindre mon objectif si je pouvais définir des caractères de nouvelle ligne comme délimiteurs de paragraphe, mais selon :help paragraph
ceux-ci, ils sont codés en dur.
Edit: je sais que je pourrais utiliser gq
ou gw
formater chaque ligne longue une par une, mais comme mon fichier s'étend sur quelques milliers de lignes, je cherche un moyen d'y parvenir automatiquement.
gq
etgw
. Je suis également content de ne pas m'être arrêté là, sinon je n'aurais pas entendu parler de la:g
commande. :)Réponses:
Cela applique la
normal
commandegww
(qui formate la ligne actuelle comme avecgw
) sur tout le tampon, sans tenir compte des mappages personnalisés (pour éviter les problèmes si par exemplegw
a été mappé à autre chose).Voir
:help :%
:help :norm
:help gww
Cette alternative est selon la suggestion de Ben dans les commentaires, et est plus simple que la solution d'origine, qui est enregistrée ci-dessous car elle pourrait mieux convenir dans d'autres circonstances similaires en raison de la capacité de correspondance d'expression régulière. Dans le cas "match toutes les lignes", il est cependant inutilement brut.
Application par programmation
gww
sur chaque ligne individuelle du tampon:Voir
:help :g
et:help norm
.^
correspond au début d'une ligne, ce qui en pratique fait correspondre chaque ligne.On peut également choisir de ne sélectionner que les lignes plus longues que par exemple 60 caractères avec
(voir
:help \%<
) mais dans la pratiquegww
, les lignes ne seront reformatées que plus longtemps que detextwidth
toute façon, donc cela peut ne pas avoir beaucoup d'importance ni en vitesse ni en résultat.(J'utilise
v
pour "colonne virtuelle" au lieu dec
pour "colonne", car cette dernière calcule vraiment un certain nombre d'octets dans la ligne. Cela peut conduire à des résultats inattendus lors de l'utilisation de codages multi-octets, ce qui est souvent une raison de se méfier. En pratique, ce n'est pas un vrai problème pour la même raison que ci-dessus, cargww
cela ne reformatera pas les lignes plus courtes que detextwidth
toute façon.)la source
:g
sans modèle, donc:g//norm gww
ne fonctionne pas mais:g/.*/norm gww
fonctionne.:g//
réutilise le dernier motif de recherche; s'il n'y en a pas, il échoue. Utilisez:g/^/
pour appliquer à toutes les lignes.:help last-pattern
pour une recherche normale s'appliquent également à la:global
commande.Comme vous avez déjà lu le manuel des commandes
gq
etgw
, je pense que vous voulez probablement quelque chose de plus pratique que de passer manuellement aux longues lignes, puis d'utilisergw0
,gw$
ou une autregw
commande pour formater uniquement la ligne actuelle.Je ne connais pas un moyen facile de casser de longues lignes dans Vim sur un bloc de texte. Cependant, puisque vous avez mentionné que vous utilisez Vim sur un système GNU / Linux, je suggère de filtrer votre texte via la
fmt
commande GNU .Pour l'ensemble du dossier:
Pour le paragraphe actuel (en utilisant des options courtes):
Explication des
fmt
options pertinentes :-w, --width=WIDTH
- largeur de ligne maximale (75 colonnes par défaut). L'option-WIDTH
est une forme abrégée de--width=DIGITS
(si vous utilisez cette version abrégée, elle doit être la première option).-s, --split-only
- séparer les longues lignes, mais ne pas recharger; il s'agit de l'option qui préserve vos sauts de ligne durs préexistants.la source
fmt
. J'ai préféré accepter l'autre réponse, car elle ne nécessite que vim.De:
Placer le marqueur sur la ligne "lorem ipsum" et presser les
gww
rendements (avectextwidth=40
pour plus de clarté):qui me semble être ce que vous demandez. Sinon, n'hésitez pas à clarifier.
la source