Comment déplacer le retrait de ligne sur une valeur spécifique?


11

Plusieurs fois, je rencontre une situation où une ligne n'est pas correctement en retrait. Ether à travers une pâte, un plugin de retrait incorrect / non préféré, ou le plus souvent des espaces supplémentaires compensant la valeur du retrait. Je règle généralement cela par <<ou >>la ligne plusieurs fois pour le réparer. Dans le cas d'espaces supplémentaires, je ferai un 100<<puis un >>pour chaque niveau de retrait que je veux réellement.

La question est, comme le |mouvement qui vous permet de définir la colonne par nombre 10|envoie le curseur à la 10e colonne. Comment puis-je spécifier le niveau de retrait?

Un exemple (cela ne fonctionne pas) avec shiftwidth=4 expandtab:

The quick (indent level 0)
••••Brown Fox (indent level 1)
••••••••••Jumped over the lazy dog (indent level 2 with two extra spaces)

Dans ce cas, je dois actuellement compter le niveau de retrait de la dernière ligne (2) et en ajouter un pour les espaces supplémentaires, puis taper 3<<puis compter le niveau de retrait de ce que j'ai ensuite 1>>(ou utiliser autoindentet ==commander).

Je demande quelque chose comme 1==pour forcer le retrait au niveau de retrait 1. Ou, dans certains cas, 0==pour supprimer un retrait tout ensemble.

Je me rends compte que l'exemple ci-dessus fait une mise en retrait automatique sur 1 ou 0 lignes (respectivement) et ne fait donc pas ce que j'aimerais, mais j'espère que cela aidera à mieux illustrer la question.

Réponses:


18

Vous pouvez utiliser la :leftcommande:

:[range]le[ft] [indent]
Lignes alignées à gauche [range]. Définit le retrait des lignes sur [indent](par défaut 0). {pas à Vi}

Notez que :leftdéfinit le retrait à n espaces et n'est pas conscient de shiftwidthou tabstop, donc l'utilisation :left 8utilisera 8 espaces.

Si vous souhaitez définir le niveau d'indentation, vous pouvez facilement définir une commande:

command! -nargs=1 Left execute 'left ' . &sw * <args>

L'utilisation :Left 2définira l'indentation sur 8 espaces.

Pour mapper cela à <Leader>=, vous pouvez utiliser:

noremap <expr> <Leader>= ':left ' . str2nr(nr2char(getchar())) * &sw . '<CR>'

Je ne sais pas si c'est la meilleure façon, mais c'est la seule façon que je peux gérer ... \=2indentera la ligne actuelle à 8 espaces, et 5\=3indentera les 5 lignes suivantes à 12 espaces.


Un indice connexe qui résout également votre problème consiste à définir l' shiftroundoption. De:help 'shiftround'

Retrait arrondi au multiple de 'shiftwidth'. S'applique à >et aux < commandes. CTRL-T et CTRL-D en mode Insertion arrondissent toujours le retrait à un multiple de 'shiftwidth'(ceci est compatible Vi).

Dans votre exemple, le premier <<"arrondira" à 8 espaces. Donc, votre problème (en utilisant 3<<puis >>) est résolu. Et comme le dit la page d'aide, vous pouvez également utiliser le <C-d>mode d'insertion.


Impressionnant! Ces solutions fonctionnent parfaitement.
Sukima
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.