Retrait au niveau de retrait suivant avec >>

9

De temps en temps, je dois travailler avec du code qui n'est pas en retrait au niveau d'indentation dans lequel j'ai configuré Vim (4 espaces par niveau), généralement après avoir copié / collé quelque chose dans le fichier. Je me contente généralement de <<et >>. Le problème est qu'ils ne sautent pas au niveau de retrait suivant, ils ajoutent ou soustraient simplement 4 espaces.

Si j'ai un code comme celui-ci

if condition:
    do this
   do that

faire >>le do thatentraînera

if condition:
    do this
       do that

Je veux que ça aille à ça

if condition:
    do this
    do that

En plus de correspondre facilement à l'indentation de la ligne ci-dessus, je veux qu'il passe au niveau d'indentation suivant, sans ajouter 4 espaces.

Voici ce que j'ai dans mon .vimrc concernant l'indentation

:set tabstop=4 shiftwidth=4 expandtab
Dumitru
la source
Si vous avez également filetype plugin indent ondans votre .vimrc, des règles liées à l'indentation de type de fichier (et plugin) s'appliqueront. C'est-à-dire vérifier quelle est réellement votre tabstopvaleur ( fera; même pour les autres paramètres), lors de la modification, et modifiez ces valeurs en ajoutant votre ligne à un fichier 'après', quelque chose comme: stackoverflow.com/a/159066/5000478set tabstop?
VanLaser
3
>>et <<respectivement ajouter et supprimer le retrait qui n'est pas ce que vous voulez. Ce que vous voulez, c'est du "formatage", ce qui est fait avec ==.
romainl
pourrait également mapper :nnoremap >> ^i<tab><esc>si vous voulez vraiment le comportement des onglets>>
Wolfie
@romainl ==sautera au niveau de la ligne ci-dessus. Bien que ce soit une bonne chose à savoir, cela ne fonctionnerait pas dans tous les cas qui m'intéressent. En plus de la question, ce que je veux, c'est pour >>et <<mettre en retrait / déduire jusqu'au multiple suivant de la largeur de décalage de la frontière dans cette direction. .
Dumitru
2
Non, ==utilise soit equalexprou equalprgpour reformater les lignes données.
romainl

Réponses:

12

Lorsque vous utilisez l' une des commandes {count}>>, {count}<<, >{motion}ou <{motion}, sur certaines lignes qui ont déjà été en retrait, et vous voulez leur niveau d'indentation être un multiple de votre 'shiftwidth'valeur d'option, vous pouvez activer l' 'shiftround'option et ajoutez cette ligne dans votre vimrc:

set shiftround
user9433424
la source
2

Si vous souhaitez toujours >>mettre en retrait le tabstop suivant et <<le supprimer jusqu'au dernier tabstop, vous pouvez les lier comme suit:

:nnoremap << ^i<BS><esc>
:nnoremap >> ^i<tab><esc>

Cela déplacera le curseur, mais vous pourriez probablement faire quelques repères pour le déplacer en arrière. ^ne laisse pas de m'marque, mais vous pouvez en laisser une manuellement dans la reliure.

Wolfie
la source