Emballage souple à 80 caractères dans Vim dans une fenêtre de largeur arbitraire

126

Je veux utiliser le soft wrap de Vim capacité de ( :set wrap) pour envelopper du code à 80 caractères, quelle que soit ma largeur de fenêtre réelle.

Je n'ai pas encore été en mesure de trouver un moyen de le faire - tout l'emballage doux semble lié à la largeur de la fenêtre

  • textwidth et wrapmargin sont tous deux destinés à être emballés (ils insèrent des caractères de nouvelle ligne dans le fichier)
  • la division verticale en plusieurs fenêtres et l'utilisation :vertical resize 80(éventuellement avec :set breakat=pour permettre des pauses sur n'importe quel caractère) sur l'une d'elles fonctionne en quelque sorte (même si c'est un peu hackish), mais les ruptures lors de l'utilisation :set numbercar les numéros de ligne occupent un nombre variable de colonnes (en fonction sur la longueur du fichier) et ceux-ci font partie des 80.

Existe-t-il un moyen de le faire dans vim? Cela n'a pas l'air prometteur, selon d'autres sources .

Pour le moment, mon approximation est juste d'avoir /^.\{80}\zs.\+comme recherche par défaut, donc elle est au moins mise en évidence. J'ai pensé à ajouter un :syntaxélément pour cela, mais cela s'est cassé quand il chevauchait d'autres éléments de syntaxe, alors j'ai abandonné cette idée.

rampion
la source
En fait, comment avez-vous configuré une recherche par défaut?
thethinman

Réponses:

37

Vous pourriez

  • définir une grande largeur minimale pour la colonne des numéros de ligne via :set numberwidth=6 et
  • alors vous pouvez redimensionner votre fenêtre avec :set columns=86(ou avec la souris) à la bonne taille.

Si vous modifiez un fichier contenant un million de lignes, vous pouvez avoir des problèmes, mais c'est peu probable. Vous gaspillez également 6 colonnes de fonds d'écran de cette façon. Il y a donc encore toutes sortes de problèmes.

Vous pouvez surligner au-delà de la 80e colonne en utilisant :matchcomme indiqué ici et ici .

Au-delà de cela, je ne vois aucun moyen de le faire. On dirait que ce serait une fonctionnalité intéressante.

Brian Carper
la source
Malheureusement, vim ne conserve pas le paramètre des colonnes si la fenêtre est redimensionnée. Cela conduit à une situation malheureuse avec les gestionnaires de fenêtres en mosaïque où il n'y a pas de bon moyen de passer en douceur à 80 colonnes si la fenêtre est trop large.
gravitation
Cela fonctionne, mais ce n'est pas collant. Je suppose que la prochaine étape consiste à configurer un autocmd pour conserver les colonnes à la nouvelle taille souhaitée pour les types de fichiers souhaités.
xer0x
1
C'est la bonne réponse en ce qu'elle confirme que vous ne pouvez pas le faire. Et je suis sûr que je ne suis pas le seul à ne pas vouloir redimensionner la fenêtre de mon terminal uniquement pour cela. Je veux beaucoup plus de largeur pour les utilisations non vim.
Sridhar Sarnobat
20

Essaye ça:

set columns=80
autocmd VimResized * if (&columns > 80) | set columns=80 | endif
set wrap
set linebreak
set showbreak=+++

Vous pouvez supprimer le if (&columns > 80) |si vous voulez toujours 80 colonnes.

eborisch
la source
Sur mon terminal iTerm, cela rend la fenêtre plus petite. Je ne sais pas si c'est un problème avec mon environnement (je vois que vous faites quelque chose avec le redimensionnement automatique), mais sinon ce n'est pas souhaitable. Merci pour la suggestion.
Sridhar Sarnobat
L'autocmd fonctionnait parfaitement pour moi (en utilisant le terminal guake).
mzcarlos
Fonctionne comme un charme avec Tmux + NeoVim dans Alacritty.
meh
16

Je n'ai pas de solution au soft wrap, mais comme pour le marquage d'une colonne, à partir de Vim 7.3 (publié le 15/08/2010) :set colorcolumn=80mettra en évidence la colonne 80. La couleur dépendra de votre fichier de syntaxe.

Voir Vim 80 colonnes layout préoccupations , :h colorcolumn.

ftvs
la source
Les citations ne sont pas des URL valides, c'est donc logique. Le nom d'ancre ne doit pas contenir de caractères d'URL non valides, le SO ne doit pas corriger les erreurs des autres développeurs de sites.
Shadow Wizard est une oreille pour vous le
1
Shadow Wizard fait référence à une révision précédente de ma réponse dans laquelle je me demande comment placer des guillemets simples dans les URL à l'aide de Markdown. Ensuite, ib a suggéré d' utiliser% 27, qui a fonctionné. Merci, ib.
ftvs
Récemment découvert comment ne mettre en évidence que les colonnes au-delà de 80 ~:let w:eighty_column_match = matchadd('ColorColumn', '\%81v.\+', 100)
rampion
La colorwidthchose est utile pour d'autres raisons, donc je suis heureux que vous ayez publié ceci.
Sridhar Sarnobat
2

Avez-vous essayé 'linebreak'?

        *'linebreak'* *'lbr'* *'nolinebreak'* *'nolbr'*
  'linebreak' 'lbr' boolean (default off)
        local to window
        {not in Vi}
        {not available when compiled without the  |+linebreak|
        feature}
If on Vim will wrap long lines at a character in 'breakat' rather
than at the last character that fits on the screen.  Unlike
'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file,
it only affects the way the file is displayed, not its contents.  The
value of 'showbreak' is used to put in front of wrapped lines.
This option is not used when the 'wrap' option is off or 'list' is on.
Note that <Tab> characters after an <EOL> are mostly not displayed
with the right amount of white space.
TK.
la source
3
Hmm ... mais ce breakatn'est qu'un motif (pas une longueur), donc je ne vois pas comment je pourrais utiliser cela pour forcer un enveloppement souple à 80 ....
rampion
Hmmm, je me demande s'il est possible de faire une regex qui correspondra à des mots dont la longueur totale (plus les espaces entre les deux) est inférieure ou égale à n caractères.
Shane Creighton-Young
@ ShaneCreighton-Young: ^.{,80}\bferait pour les personnes qui utilisent des onglets soft / expand. Notez que c'est perl regex, pas vim regex.
Mark K Cowan
0

Il n'y a pas de bonne façon de le faire. Nous pouvons pirater une solution de fortune setlocal softwrapavec autocmdsi nous modifions la réponse @eborisch. Si nous redimensionnons à chaque fois que nous entrons dans un tampon, et que nous redimensionnons à une longueur particulière lorsque la variable locale softwrapest définie, nous obtenons le comportement souhaité.

Supposons que nous souhaitons un enveloppement souple à 80 colonnes, nous pouvons écrire ce qui suit dans .vimrc.

augroup softwrap
    autocmd VimResized * if (exists('b:softwrap') && &columns > 80) | set columns=80 | endif
    autocmd BufEnter * set columns=999
augroup END

Pour activer le mode pour un tampon particulier, utilisez les commandes suivantes:

let b:softwrap=1
set columns=80
blé dur
la source
Cela transforme simplement mes fichiers en charabia.
Suuuehgi