Dans VIM, comment diviser une très longue ligne en plusieurs lignes?

170

Disons que j'ai une très longue ligne dans l'éditeur VIM (disons environ 300+ caractères). Comment pourrais-je diviser cela en plusieurs lignes afin que les limites des mots se coupent à peu près à 80 caractères?

Exemple:

This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line This is a really long line

à

This is a really long line 
This is a really long line
This is a really long line
This is a really long line
This is a really long line
This is a ...
Jordan Parmer
la source

Réponses:

254

Vim fait cela très facilement (couper les lignes aux limites des mots).

gq{motion} % format the line that {motion} moves over
{Visual}gq % format the visually selected area
gqq        % format the current line
...

Je vous suggère de vérifier :help gqet :help gw.

La définition de textwidth ( tw) vous donnera également un saut de ligne automatique en cas de dépassement lors de la saisie. Il est également utilisé gq, mais s'il est désactivé gq, la taille de la fenêtre est interrompue ou 79 selon ce qui vient en premier.

:set tw=80

En définissant les options de format pour inclure la largeur du texte, vim sera automatiquement interrompu au paramètre tw.

:set fo+=t
il_le_grand
la source
5
Donc, pour votre cas, la gqcommande serait <ESC>(sortez du mode Insérer / Remplacer / etc), puisgq80l
MidnightLightning
6
C'est l'opposé de Ctrl + j (combine plusieurs lignes en une seule).
Yzmir Ramirez
9
Vim ne cesse de m'étonner. C'est de l'or pur.
Jondlm
10
juste pour la prochaine personne qui trouve ceci, gq ne divisera pas seulement une ligne de texte plein, il a besoin d'espaces pour faire son travail
stringy05
2
[s'exécute gqq] aaaahhh, c'est magnifique
underscore_d
85

Commencez par configurer votre vim pour qu'il comprenne que vous voulez 80 caractères:

:set tw=80

puis, allumez la ligne:

V

et faites le reformater vim:

gq

la source
17

Ce n'est pas vraiment lié à VIM, mais vous pouvez utiliser le programme fmt comme dans

$ fmt myfile
Wernesey
la source
38
:%! fmt% "Peut le rendre lié à vim :)
Maxim Sloyko
2
Utile pour vi, bien que je préfère gqq sur vim.
WhyNotHugo
13

Pour les lignes pleines de texte, mettez en surbrillance la zone en utilisant v en mode normal, puis appuyez sur

:s/\v(.{80})/\1\r/g

Cela ajoutera une nouvelle ligne à la fin de chaque 80e caractère.

:s/       replaces within the current select
\v        uses regular expressions
(.{80})   selects 80 characters & placed them into group one
\1\r      replaces group one with group one and a newline
fumé
la source
C'est la seule solution qui a fonctionné pour une longue chaîne base64.
jviotti
6

Si vous êtes sur * nix, vous avez probablement des fichiers folddisponibles.

Sélectionnez la région que vous souhaitez utiliser v, puis vous pouvez couper sur des espaces de largeur 80 en utilisant:

!fold --spaces --width=80

C'est essentiellement la même chose que d'utiliser gq .

Cependant, si vous souhaitez simplement interrompre le caractère 80 et ne pas être limité aux espaces, vous pouvez utiliser:

!fold --width=80

Si vous le voulez avec une seule touche, définissez simplement un mappage - j'ai utilisé

vmap <f1> !fold --width=80<CR>

Michael Anderson
la source
C'est la réponse qui fonctionne pour les longues chaînes non séparées par des espaces. Sur macOS, vous devrez peut-être utiliser gfold au lieu de fold.
Aaron D
sur mac os, je devais faire! fold -w 80
user674669
5

Pour fractionner les longues lignes dans le document complet sans supprimer les sauts de ligne déjà présents, utilisez:

:set formatoptions+=w
:set tw=80
gggqG
Olivier Faucheux
la source
4

J'avais besoin de reformater un fichier entier plutôt qu'une ligne. Comme le souligne Wernsey, j'aurais pu utiliser `` fmt '', mais la séquence suivante dans vim a également fait l'affaire (empruntant aux différentes réponses ici):

<ESC>
:setl tw=80 fo=t
1GVGgq
John Rix
la source
3

Comme un rapide et méchant, essayez peut-être la carte suivante:

map q 080lwbels<CR><ESC>

qui dit:

  • commencer une 0ème position de ligne,
  • passer au 80e caractère vers la droite,
  • aller au début du mot suivant,
  • revenir au mot précédent,
  • aller à la fin du mot en cours,
  • aller un caractère à droite, et
  • remplacez ce caractère par un CR.

Ensuite, frapper q et CR divisera la ligne en morceaux sur la limite du mot.

Rob Wells
la source
-1

J'ai inséré manuellement '\' (puis CR / tab pour formater) dans chaque LONGLINE après le dernier espace mais avant la colonne 80. C'est-à-dire:

1 this is a long, long, line

ressemble maintenant à

1 this is a long, \
        long line

et compile normalement.

808
la source