Como altero o recuo da linha para um valor específico?

11

Muitas vezes me deparo com uma situação em que uma linha não é recuada corretamente. Éter através de uma pasta, plug-in de indentação ruim / não preferido ou, na maioria das vezes, espaços extras que compensam o valor de indentação. Eu costumo corrigir isto <<ou >>a linha algumas vezes para consertá-la. No caso de espaços extras, farei um 100<<então a >>para cada nível de recuo que realmente quero.

A questão é que, como o |movimento que permite definir a coluna por número, 10|envia o cursor para a 10ª coluna. Como posso especificar o nível de recuo?

Um exemplo (isso não funciona) com 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)

Neste caso, atualmente eu tenho que contar o nível de indentação da última linha (2) e adicionar um para os espaços extras, em seguida, digite 3<<e conte o nível de indentação do que eu então 1>>(ou uso autoindente ==comando).

Estou pedindo algo como 1==forçar o recuo no nível 1. Ou, em alguns casos, 0==para remover um recuo completamente.

Sei que o exemplo acima faz recuo automático em 1 ou 0 linhas (respectivamente) e, portanto, não faz o que eu gostaria, mas esperava que isso ajudasse a ilustrar melhor a pergunta.

Sukima
fonte

Respostas:

18

Você pode usar o :leftcomando:

:[range]le[ft] [indent]
Alinhar linhas à esquerda [range]. Define o recuo nas linhas como [indent](padrão 0). {não no Vi}

Observe que :leftdefine o recuo para n espaços e não tem conhecimento de shiftwidthou tabstop, portanto, o uso :left 8usará 8 espaços.

Se você deseja definir o nível de indentação, pode definir facilmente um comando:

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

Use :Left 2definirá o recuo para 8 espaços.

Para mapear isso <Leader>=, você pode usar:

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

Não tenho certeza se essa é a melhor maneira, mas é a única maneira que posso gerenciar ... \=2recuará a linha atual para 8 espaços e 5\=3recuará as próximas 5 linhas para 12 espaços.


Uma dica relacionada que também resolve seu problema está definindo a shiftroundopção. A partir de:help 'shiftround'

Recuo arredondado para múltiplo de 'shiftwidth'. Aplica-se a >e < comandos. CTRL-T e CTRL-D no modo Inserir sempre arredondam o recuo para um múltiplo de 'shiftwidth'(isso é compatível com Vi).

No seu exemplo, o primeiro <<"arredondará" para 8 espaços. Portanto, seu problema (usando 3<<e depois >>) está resolvido. E, como diz a página de ajuda, você também pode usar <C-d>no modo de inserção.

Martin Tournoij
fonte
Impressionante! Essas soluções funcionam perfeitamente.
Sukima 7/03/15