É possível converter guias em espaços, mantendo o alinhamento do texto?
Simplesmente substituir apenas funciona de maneira útil quando não há caracteres iniciais.
É possível converter guias em espaços, mantendo o alinhamento do texto?
Simplesmente substituir apenas funciona de maneira útil quando não há caracteres iniciais.
Respostas:
Você pode usar o :retab
comando De
:help :retab
Substitua todas as seqüências de espaço em branco que contêm a
<Tab>
por novas cadeias de espaço em branco usando o novo valor de tabstop fornecido. Se você não especificar um novo tamanho de tabstop ou for zero, o Vim utilizará o valor atual de'tabstop'
. [...] Com'expandtab'
ativado, o Vim substitui todas as guias pelo número apropriado de espaços.
Observe que o comando aceita um intervalo, para que você possa fazer uma seleção visual e, em seguida, apenas :retab
as linhas selecionadas.
Você pode usar :retab
, como indicado, no entanto, isso mudará todas as guias para espaços, não apenas as guias no início da linha
Portanto, este (onde ⇥
está um caractere de tabulação):
if :; do
⇥echo "⇥hello"
end
é alterado para (onde ␣
está um caractere de espaço):
if :; do
␣␣echo "␣␣hello"
end
Isso pode produzir efeitos colaterais inesperados em alguns cenários, e é ainda mais um problema ao alterar espaços para guias!
Então, escrevi uma pequena função para alterar apenas tabulações / espaços no início da linha:
" :retab changes *everything*, not just start of lines
fun! Retab(expandtab)
let l:spaces = repeat(' ', &tabstop)
" Replace tabs with spaces
if a:expandtab
silent! execute '%substitute#^\%(' . l:spaces . '\)\+#\=repeat("\t", len(submatch(0)) / &tabstop)#e'
" Replace spaces with tabs
else
silent! execute '%substitute#^\%(\t\)\+#\=repeat("' . l:spaces . '", len(submatch(0)))#e'
endif
endfun
Com esta versão, você deve especificar manualmente expandtab
na chamada de função (ou seja, :call Retab(1)
alterar guias para espaços), mas também pode modificá-la para obter o valor atual de &expandtab
(como já acontece com &tabstop
) da mesma forma que :retab
faz. (Eu prefiro especificá-lo manualmente).
a
em if a:expandtab
média?
set expandtab
no .vimrc e no autocmd BufWritePre * :call Retab(&expandtab)
- o recuo será alterado para tabulações, em vez de espaços.
O Vim fornece um !retab
comando que substituirá todas as seqüências <Tab>
por novas strings de espaço em branco usando o novo valor tabstop (por exemplo :set tabstop=2
) fornecido, mas todas as guias dentro das strings podem ser modificadas (por exemplo, em um programa C, você deve usar \t
para evitar isso)!
Portanto, como alternativa, você pode alterar todas as guias em espaços usando o seguinte comando:
:%s/\t/ /g
ou como sugerido por @Shahbaz :
:%s/^\t\+/ g
Portanto, apenas as guias usadas no recuo são convertidas.
Explicação:
%
representa todo o buffer / arquivo ( :help :%
)s
significa substituto ( :help sub-replace-special
)\t
, ou ^I
significa guia
- use quantos espaços você precisar por uma guiag
- significa global e converterá várias ocorrências de guias na mesma linhaEm seguida, para corrigir o recuo de todo o arquivo, você pode tentar: gg=G. Verificação: Re-recuando código mal recuado para obter mais detalhes.
Para usar espaços por padrão, em vez de guias, você precisa adicionar as seguintes configurações ao seu .vimrc
arquivo:
set tabstop=2 " (ts) width (in spaces) that a <tab> is displayed as
set expandtab " (et) expand tabs to spaces (use :retab to redo entire file)
set shiftwidth=2 " (sw) width (in spaces) used in each step of autoindent (aswell as << and >>)
Solução alternativa é usar tidy
Relacionado:
%s/^\t\+/ g
para que apenas as guias usadas no recuo sejam convertidas. Além disso, gg=G
pode ser catastrófico com linguagens como python.
Tente usar:
expand -t 4 input_filename output_filename
expand
é uma ferramenta de linha de comando para converter guias em espaços, que você pode executar a partir de um shell ou com :!expand
.
Está no POSIX, portanto deve estar disponível na maioria dos sistemas. unexpand
fará o inverso, a propósito.
expand
?
:%!expand -t 4
dentro do vim. Melhor ainda, você também pode usar a opção de largura atual mudança: :exe '%!expand -t ' . &shiftwidth
Para completar, =
também pode ser usado para corrigir recuos, depois de especificar que as guias são substituídas por espaços. No modo normal, você pode fazer isso digitando :set expandtab
. Então =
poderia ser usado de duas maneiras:
=
corrigia recuos dos blocos de código selecionados.gg=G
consertaria o arquivo inteiro, onde gg
move o cursor para o início do arquivo, depois =
é aplicado e G
move o cursor para o final do arquivo.Referência: link
:h vim-faq
e pesquisar/tab characters
. A tag difícil de memorizar é:h faq-14.16
.