Copiei alguns códigos da Internet que têm recuo de 2 espaços e quero transformá-los em recuo de 4 espaços. Eu me pergunto se existe uma rotina curta do vim para realizar a tarefa sem ter que escrever o script do vim? Aqui está como estou fazendo isso com um arquivo HTML:
- Grave uma macro
- Vá para o início de uma linha
- Selecione visualmente todos os espaços em branco até a primeira ocorrência de "<"
- Puxe e cole todos os espaços em branco (basicamente para duplicá-los)
- Repete a macro até o final do arquivo
Em resumo qa0vt<yp<esc>jq
Armadilhas:
A macro falha para uma linha em branco ou uma linha que não começa com "<". E não tenho ideia de como estender essa solução para um arquivo não HTML.
ts
: =tabstop
,sts
: =softtabstop
e[no]et
: =[no]expandtab
.retab
o argumento seria útil e por que não podemos usá-lo para essa tarefa?:set sts=2 noet
e,:retab! 2
portanto, seria um pouco mais curto (embora talvez menos legível) dessa forma.:set ts=2 sts=2 noet | retab! | set ts=4 sts=4 et | retab!
e use-os@:
em arquivos diferentes para aplicar rapidamente a mesma ação.Pode ser possível com
:set shiftwidth=4
egg=G
.fonte
gg=G
significa exatamente? Eu entendo quegg
significa "mover para 1,1" eG
significa "mover para a última linha".=
faz recuo, então significa apenas recuar do início ao fim do texto%retab
, que converteu incorretamente espaços incorporados em literais de string.O que eu faço é muito semelhante às abordagens de esneider e cforbish, mas um pouco mais rápido de digitar:
Simplesmente substitui o espaço inicial (espaços ou tabulações) pelo dobro do espaço inicial (
&
é substituído pela expressão correspondente).fonte
%
.sed
e aplicá-lo a todos os arquivos em um diretório superuser.com/a/159286/41494Esta é uma pergunta muito antiga, porém todas as respostas estão ... erradas ... O Vim tem uma maneira muito fácil de reindentar o arquivo inteiro. Aprendi isso depois de escrever minha própria função para fazê-lo, então estou no mesmo barco da ignorância;)
tipo
isso pressupõe que você tenha seu tabstop configurado para o que você gosta, (então para o OP seria ts = 4)
Aprendi isso em http://vim.wikia.com/wiki/Fix_indentation , que menciona
fonte
Eu usei esta expressão regular (ela dobra o número de espaços à esquerda):
fonte
%s/\s\+/&&/
faz a mesma coisa? A propósito, acho que og
sinalizador é desnecessário (por exemplo, haveria apenas 1 correspondência com^pattern
em cada linha, não?)%s/^\s\+/&&/g
está mais próximo.Semelhante (mas um pouco mais simples) à resposta de cforbish, este regex irá duplicar os espaços iniciais
Ou você pode usar este outro regex para transformar 2 espaços em 4 espaços, preservando espaços únicos (e quantidades ímpares em geral)
Isso é,
fonte
Esta é uma variante das respostas baseadas em regex.
Eu tenho um script bash em meu diretório bin local que dobrará a quantidade de espaços em branco no início de uma linha. A entrada pode ser stdin ou um arquivo:
Eu uso isso no vim selecionando visualmente uma linha e emitindo o seguinte comando:
Isso me livra da necessidade de digitar (ou lembrar) o regex.
Eu também o uso em mapas como o seguinte:
que o aplicará a um bloco de texto recentemente colado. Eu geralmente uso o seguinte mapa para colar em vez de
:set paste
Meu fluxo de trabalho normal é:
ou simplesmente alterando o recuo em blocos arrancados colados de outro buffer.
fonte
Além da resposta de @ spro, coloquei isso em meu
.vimrc
Basta digitar
:Format
.Com a seleção visual, isso apenas formata as linhas selecionadas.
Sem seleção visual, isso formata todo o arquivo.
fonte