Recuar para o próximo nível de recuo com >>

9

De tempos em tempos, tenho que trabalhar com código que não é recuado para o nível de recuo que o Vim configurou (4 espaços por nível), geralmente após copiar / colar algo no arquivo. Eu costumo me contentar com <<e >>. O problema é que eles não saltam para o próximo nível de recuo, apenas adicionam ou subtraem 4 espaços.

Se eu tiver um código como este

if condition:
    do this
   do that

fazendo >>on do thatresultará em

if condition:
    do this
       do that

Eu quero que isso aconteça

if condition:
    do this
    do that

Além de corresponder facilmente ao recuo da linha acima, quero que ele pule para o próximo nível de recuo, e não adicione 4 espaços.

Isto é o que tenho no meu .vimrc em relação à indentação

:set tabstop=4 shiftwidth=4 expandtab
Dumitru
fonte
Se você também tem filetype plugin indent onna sua .vimrc, filetype (e plugin) vai aplicar regras de recuo-relacionado. Ou seja, verifique qual é realmente o seu tabstopvalor ( fará; o mesmo para as outras configurações), ao editar e altere esses valores adicionando sua linha a um arquivo 'after', algo como: stackoverflow.com/a/159066/5000478set tabstop?
VanLaser
3
>>e, <<respectivamente, adicione e remova o recuo, que não é o que você deseja. O que você quer é "formatação", o que é feito ==.
Romainl 10/10
também pode mapear :nnoremap >> ^i<tab><esc>se você realmente deseja o comportamento das guias #>>
Wolfie 10/10
@romainl ==vai pular para o nível da linha acima. Embora seja uma boa coisa saber, isso não funcionaria em todos os casos em que estou interessado. Como complemento da pergunta, o que eu quero é fazer >>e <<recuar / deduzir até o próximo múltiplo de largura de turno da borda nessa direção. .
Dumitru
2
Não, ==usa equalexprou equalprgpara reformatar as linhas fornecidas.
Romainl # 10/16

Respostas:

12

Quando você usa um dos comandos {count}>>, {count}<<, >{motion}ou <{motion}, em algumas linhas que já foram recuados, e você quer que seu novo nível de recuo para ser um múltiplo de seu 'shiftwidth'valor de opção, você pode ativar a 'shiftround'opção, e adicione essa linha em seu vimrc:

set shiftround
user9433424
fonte
2

Se você quiser sempre >>recuar para o próximo tabstop e <<excluir até o último tabstop, poderá religá-los da seguinte forma:

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

Isso moverá o cursor, mas você provavelmente poderá fazer alguns truques de marca para movê-lo de volta. ^não deixa uma m'marca, mas você pode deixar uma manualmente dentro da encadernação.

Wolfie
fonte