Joignez les lignes à l'intérieur des paragraphes dans vim

13

Supposons que vous ayez tapé un long document dans vim avec un saut de ligne automatique, de sorte que toutes les lignes ont été coupées, disons, avec 79 caractères. Vous avez peut-être même appliqué une mise en forme à l'ensemble du document pour couper toutes les lignes à cette longueur.

Les paragraphes sont délimités dans votre document par des lignes vides.

Vous décidez maintenant de ne plus vouloir de sauts de ligne dans les paragraphes.

Comment pouvez-vous supprimer tous les sauts de ligne dans les paragraphes sans éliminer complètement les limites des paragraphes?

J'ai fait ce hack rapide et idiot, mais je cherche la bonne façon.

:%s/^\s*$/@@@@@ - replace blank lines with @@@@@
ggVGgJ           - join all lines in the file
:%s/@@@@@/\r\r/g   - replace @@@@@ with line breaks
dggoldst
la source
hé, ne le cognez pas si votre solution fonctionne, et votre solution fonctionne.
pdwalker le

Réponses:

12

Je pense que cela fait ce que vous voulez: assurez-vous qu'il y a une ligne vide à la fin du fichier, puis joignez chaque paragraphe (terminé par une ligne vide).

G:a

.
:g/^./ .,/^$/-1 join

Explication: commencez par aller à la fin du fichier et ajoutez une ligne vide supplémentaire avec :a(peut-être qu'il existe une façon plus élégante de le faire; de ​​manière interactive, vous pouvez remplacer les trois premières lignes par o<ESC>). Ensuite, pour chaque ligne non vide qui n'a pas encore été prise en compte ( :g/^./), appliquez la joincommande à la plage commençant à la ligne sélectionnée ( .) et se terminant une ligne avant la ligne vide suivante ( /^$/-1).

Facultativement, :g/^$/dsi vous ne voulez pas qu'il reste de ligne vierge (vous pouvez alors enlever le -1).

Gilles 'SO- arrête d'être méchant'
la source
Merci. Cela devient très proche pour moi, cependant, il supprime les lignes vides entre les paragraphes. (J'ai essayé fileformat unix et dos pour voir si c'était une chose Windows). Pouvez-vous également traduire un peu les commandes? G va à la dernière ligne. : un selon l'aide est "ajouter" mais je ne sais pas ce que cela fait. De plus, le g / motif / cmd que vous avez là m'a perdu. Quelle est la commande?
dggoldst
@dggoldst: J'ai changé la commande pour conserver les lignes vides. Les trois premières lignes consistent simplement à ajouter une ligne vide à la fin du fichier (sinon le dernier paragraphe ne sera pas mis en correspondance). La dernière commande est :g, qui applique une commande à toutes les lignes correspondantes; voir :help :get peut -:g être ce fil sur la façon dont se comporte lorsque vous supprimez des sauts de ligne .
Gilles 'SO- arrête d'être méchant'
:$pu _ à la fin, mettez le registre des trous noirs, ce qui entraîne une ligne vierge à la fin.
SergioAraujo
12

Cela devrait le faire:

:set tw=99999
gggqG

twest défini sur une valeur au moins aussi grande que le nombre de caractères dans le paragraphe le plus long. ggdéplace le curseur sur la première ligne; gqest la commande de reformater; Gdéplace le curseur sur la dernière ligne, indiquant gqde reformater de l'emplacement actuel du curseur à la dernière ligne.

garyjohn
la source
5
  1. Placez le curseur à l'intérieur du paragraphe souhaité

  2. Type: vipJ

( vipmet en surbrillance le paragraphe actuel, Jjoint toutes les lignes)

Juan
la source
2

Ce n'est peut-être pas la façon la plus propre de le faire, mais voici ce que j'utiliserais:

ggqav}bgJ}wq999@a   # go to the top of the file (gg)
                    # start recording macro "a" (qa)
                    # select the entire paragraph (v})
                    # go back one word so as not to join the blank line (b)
                    # join the selected lines without spaces (gJ)
                    # go to first word of the next paragraph (}w)
                    # finish recording the macro (q)
                    # 999 times (arbitrary number of paragraphs to join)
                    # run macro "a" (@a)

( Travaux dans VIM 7.2. )

En fonction de la façon exacte dont les paragraphes ont été divisés lors de leur mise en forme d'origine, vous pouvez remplacer la gJcommande (joindre sans espaces) par la Jcommande (joindre avec des espaces).

Le 999nombre arbitraire ne doit être qu'au moins le nombre de paragraphes dans le fichier - vous pouvez sélectionner un plus grand nombre si vous le souhaitez et ne perdre que des cycles de processeur. En supposant une et une seule ligne vide entre les paragraphes, vous pouvez obtenir un nombre de paragraphes plus précis en utilisant:

:%s/^$//gn     # returns "999 matches on 999 lines"
goldPseudo
la source
Cela fonctionne pour moi. Ce serait bien d'ajouter un "gg" au début pour mettre le curseur en haut du fichier. De plus, l'utilisation de J au lieu de gJ n'entraîne pas la fusion de mots séparés en un seul. Ce n'est peut-être le cas que pour mes valeurs de "formatoptions", qui m'étonnent actuellement.
dggoldst