web-dev-qa-db-fra.com

Smart Wrap dans Vim

Je me demandais si Vim avait la capacité d'envelopper intelligemment les lignes de code, de sorte qu'il conserve la même indentation que la ligne qu'il indente. Je l'ai remarqué sur un autre éditeur de texte, tel que l'éditeur de texte électronique, et j'ai trouvé que cela m'a aidé à comprendre ce que je regarde plus facilement.

Par exemple, plutôt que

<p>
    <a href="http://www.example.com">
        This is a bogus link, used to demonstrate
an example
    </a>
</p>

il semblerait que

<p>
    <a href="somelink">
        This is a bogus link, used to demonstrate
        an example
    </a>
</p>
74
Sasha

Cette fonctionnalité a été implémentée le 25 juin 2014 en tant que patch 7.4.338. Il y a eu quelques correctifs affinant la fonctionnalité, le dernier étant la 7.4.354, c'est donc la version que vous voudrez.

:help breakindent
:help breakindentopt

Extraits de l'aide de vim ci-dessous:

'breakindent'     'bri'   boolean (default off)
                          local to window
                          {not in Vi}
                          {not available when compiled without the |+linebreak|
                          feature}
        Every wrapped line will continue visually indented (same amount of
        space as the beginning of that line), thus preserving horizontal blocks
        of text.

'breakindentopt' 'briopt' string (default empty)
                          local to window
                          {not in Vi}
                          {not available when compiled without the |+linebreak|
                          feature}
        Settings for 'breakindent'. It can consist of the following optional
        items and must be seperated by a comma:
                  min:{n}     Minimum text width that will be kept after
                              applying 'breakindent', even if the resulting
                              text should normally be narrower. This prevents
                              text indented almost to the right window border
                              occupying lot of vertical space when broken.
                  shift:{n}   After applying 'breakindent', wrapped line
                              beginning will be shift by given number of
                              characters. It permits dynamic French paragraph
                              indentation (negative) or emphasizing the line
                              continuation (positive).
                  sbr         Display the 'showbreak' value before applying the 
                              additional indent.
        The default value for min is 20 and shift is 0.

Le paramètre showbreak est également pertinent à cet égard. Il suffixera le montant de votre décalage avec les caractères que vous spécifiez.

Exemple de configuration

" enable indentation
set breakindent

" ident by an additional 2 characters on wrapped lines, when line >= 40 characters, put 'showbreak' at start of line
set breakindentopt=shift:2,min:40,sbr

" append '>>' to indent
set showbreak=>>   

Remarque sur le comportement

Si vous ne spécifiez pas l'option sbr, tout showbreak tout caractère placé ajouté à l'indentation. La suppression de sbr de l'exemple ci-dessus provoque un retrait effectif de 4 caractères; avec ce paramètre, si vous souhaitez simplement utiliser showbreak sans retrait supplémentaire, spécifiez shift:0.

Vous pouvez également donner un décalage négatif, ce qui aurait pour effet de faire glisser les caractères showbreak et le texte encapsulé dans tout espace de retrait disponible.

Lorsque vous spécifiez une valeur min, le montant décalé sera écrasé si la largeur de votre terminal est plus étroite, mais les caractères showbreak sont toujours conservés.

50

Il existe un correctif pour cela, mais il persiste depuis ans et la dernière fois que j'ai vérifié, je ne l'ai pas appliqué correctement. Voir l'entrée "Lignes correctement mises en retrait" dans http://groups.google.com/group/vim_dev/web/vim-patches - Je souhaite vraiment que cela se retrouve dans la ligne principale.

Mise à jour: ce lien semble avoir bittrotté. Voici une version plus à jour du patch .

Mise à jour 2: elle a été fusionnée en amont (à partir du 7.4.345), vous n'avez donc plus qu'à :set breakindent.

33
ergosys

Je ne pense pas qu'il soit possible d'avoir exactement la même indentation, mais vous pouvez toujours obtenir une meilleure vue en définissant l'option "showbreak".

:set showbreak=>>>

Exemple:

<p>
    <a href="http://www.example.com">
        This is a bogus link, used to demonstrate
>>>an example
    </a>
</p>

La vraie chose est meilleure que l'exemple de code ci-dessus, car Vim utilise une couleur différente pour '>>>'.

17
too much php

MISE À JOUR: En juin 2014, un correctif pour prendre en charge une option breakindent a été fusionné dans Vim (version 7.4.346 ou ultérieure pour une meilleure prise en charge).


Vous pouvez également essayer :set nowrap qui permettra à vim d'afficher de longues lignes en faisant défiler vers la droite. Cela peut être utile pour examiner la structure globale d'un document, mais peut être moins pratique pour réellement éditer.

Les autres options proches de ce que vous recherchez sont linebreak et showbreak. Avec showbreak, vous pouvez modifier ce qui est affiché dans la marge gauche des lignes qui sont encapsulées, mais malheureusement, il ne permet pas un retrait variable selon le contexte actuel.

8
Greg Hewgill

La seule façon que je sache que vous pourriez le faire serait d'utiliser un caractère de retour (comme mentionné par Cfreak) et de combiner l'option textwidth avec les différentes options d'indentation. Si votre retrait est configuré correctement (comme c'est le cas par défaut avec la syntaxe html je crois, mais sinon voyez les options autoindent et smartindent), vous pouvez:

:set formatoptions = tcqw
:set textwidth = 50
gggqG

Si vous avez une personnalisation du paramètre formatoptions, il peut être préférable de simplement faire:

:set fo += w
:set tw = 50
gggqG

Ce que cela fait:

:set fo+=w  " Add the 'w' flag to the formatoptions so 
            " that reformatting is only done when lines
            " end in spaces or are too long (so your <p>
            " isn't moved onto the same line as your <a...).
:set tw=50  " Set the textwidth up to wrap at column 50
gg          " Go to the start of the file
gq{motion}  " Reformat the lines that {motion} moves over.
G           " Motion that goes to the end of the file.

Notez que ce n'est pas la même chose qu'un habillage doux: il encapsulera les lignes dans le fichier source ainsi qu'à l'écran (sauf si vous ne l'enregistrez pas bien sûr!). Il existe d'autres paramètres qui peuvent être ajoutés à formatoptions qui se formateront automatiquement à mesure que vous tapez: détails dans :help fo-table.

Pour plus d'informations, voir:

:help 'formatoptions'
:help fo-table
:help 'textwidth'
:help gq
:help gg
:help G
:help 'autoindent'
:help 'smartindent'
5
DrAl
:set smartindent
:set autoindent

Je pense que vous devez toujours utiliser un retour

3
Cfreak

Une solution macro:


Éditer:

L'opérer gq{motion} formate automatiquement la variable "largeur de texte". C'est plus facile/mieux que d'utiliser le 80lBi^M J'ai pour ma macro.


Si vous avez autoindent activé

:set autoindent

Entrer ensuite un retour à la fin d'une ligne induira la ligne suivante du même montant. Vous pouvez l'utiliser pour entrer en dur dans les retours à la ligne si vous le souhaitez. La macro suivante en profite pour indenter automatiquement votre texte:

réglez le registre z sur:

gg/\v^.{80,}$^M@x (change 80 to whatever length you want your text to be)

et réglez le registre x sur:

80lBi^M^[n@x (change 80 to whatever length you want your text to be)

Alors fais

@x   

pour activer les macros. Après quelques secondes, votre texte se trouvera tous dans des lignes correctement en retrait de 80 caractères ou moins.

Explication:

Voici une dissection des macros:

Partie 1 (macro z):

gg/\v^.{80,}$^M@x

gg - start at the top of the file (this avoids some formatting issues)
/  - begin search
\v - switch search mode to use a more generic regex input style - no weird vim 'magic'
^.{80,}$ - regex for lines that contain 80 or more characters
^M - enter - do the search (don't type this, you can enter it with ctrl+v then enter)
@x - do macro x

Partie 2 (macro x):

80lBi^M^[n@x

80l - move right 80 characters
B   - move back one Word (WORDS include characters like "[];:" etc.)
i^M - enter insert mode and then add a return (again don't type this, use ctrl+v)
^[  - escape out of insert mode (enter this with ctrl+v then escape)
@x  - repeat the macro (macro will run until there are no more lines of 80 characters or more)

Avertissements:

  • Cette macro se cassera s'il y a un mot de 80 caractères ou plus.

  • Cette macro ne fera pas de choses intelligentes comme le retrait des lignes après les balises.

  • Utilisez le paramètre lazyredraw (: set lazyredraw) pour accélérer cela

2
Michael Asnes

Si votre code HTML est suffisamment bien formé, l'exécuter à travers xmllint pourrait aider:

:%!xmllint --html --format
2
Arkady