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.

Sukima
la source

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.

Martin Tournoij
la source
Impressionnant! Ces solutions fonctionnent parfaitement.
Sukima