Eu examinei várias perguntas no Stack Overflow para saber como converter espaços em guias sem encontrar o que eu preciso. Parece haver mais perguntas sobre como converter guias em espaços, mas estou tentando fazer o oposto.
Em Vim
Eu tentei :retab
e :retab!
sem sorte, mas acredito que esses são realmente para ir de tabulações para espaços de qualquer maneira.
Eu tentei os dois expand
e unexpand
no prompt de comando sem sorte.
Aqui está o arquivo em questão:
Como converter espaços à esquerda em guias usando Vim
o shell ou?
sed "s/ +/`echo -e '\t'`/g" < input.py > output.py
) parece converter todos os espaços, não apenas espaços iniciais. No segundo exemplo (sed "s/^ +/`echo -e '\t'`/g" < input.py > output.py
), ele substitui apenas o primeiro espaço de cada linha por uma guia e deixa o restante deles.find
,awk
e blackjack (muito tempo para deixar nos comentários)Respostas:
Usando o Vim para expandir todos os espaços à esquerda (maior que
'tabstop'
), você estava certo de usar,retab
mas primeiro verifique'expandtab'
se a redefinição (:verbose set ts? et?
é seu amigo).retab
tem um intervalo , por isso geralmente especifico%
para significar "o arquivo inteiro".Antes de fazer algo assim (particularmente com arquivos Python!), Costumo definir
'list'
, para que eu possa ver o espaço em branco e mudar.Eu tenho o seguinte mapeamento no meu
.vimrc
para isso:fonte
:set noet
,:set tabstop=2
,:retab!
,:%retab!
,:set tabstop=1
,:retab!
,:%retab!
%
. O mapeamento F2 é exatamente como foi digitado .:set noet ts=2 |%retab!
:%retab!
ainda funciona. Eu estava confuso com==
, etc, que faz respeitar a configuração preserveindent.:set tabstop=4
1 - Se você possui espaços e deseja tabulações.
Primeiro, você precisa decidir quantos espaços terão uma única guia. Dito isto, suponha que você tenha linhas com 4 espaços à esquerda, ou 8 ... Do que você imagina, provavelmente deseja que uma guia tenha 4 espaços. Agora, com essas informações, você faz:
Existe um problema aqui! Essa sequência de comandos procurará todo o seu texto, não apenas espaços no início da linha. Isso significa que uma string como:
"Hey,␣this␣␣␣␣is␣4␣spaces"
se tornará"Hey,␣this⇥is␣4␣spaces"
, mas não é! é uma guia!Para resolver esse pequeno problema, recomendo um
search
, em vez deretab
.Essa pesquisa procurará no arquivo inteiro todas as linhas começando com qualquer número de guias, seguido por 4 espaços e substituindo-o pelo número de guias encontradas mais uma.
Infelizmente, isso não será executado de uma vez!
A princípio, o arquivo terá linhas começando com espaços. A pesquisa converterá apenas os 4 primeiros espaços em uma guia e permitirá o seguinte ...
Você precisa repetir o comando. Quantas vezes? Até você receber um
pattern not found
. Ainda não consigo pensar em uma maneira de automatizar o processo. Mas se você fizer:Você provavelmente já terminou. Este comando repete a última pesquisa / substituição por 10 vezes. Não é provável que o seu programa tenha tantos recuos. Se tiver, basta repetir novamente
@@
.Agora, apenas para completar a resposta. Sei que você pediu o contrário, mas nunca sabe quando precisa desfazer as coisas.
2 - Você tem abas e deseja espaços.
Primeiro, decida a quantos espaços você deseja converter suas guias. Digamos que você queira que cada guia tenha 2 espaços. Você então faz:
Isso teria o mesmo problema com as strings. Mas como seu melhor estilo de programação para não usar guias rígidas dentro de strings, você realmente está fazendo uma coisa boa aqui. Se você realmente precisa de uma guia dentro de uma string, use
\t
.fonte
ex command
, porque isso seria o que está dentro da função. E não, não é raro. Você só precisa ter strings com espaços para ter uma bagunça. Não é raro. Eu estou lá. Obrigado por comentar.^
símbolo, para iniciar a pesquisa a partir do início da linha, corre o risco de mudar de espaço dentro das strings. Com a^
garantia, você está alterando apenas espaços e tabulações desde o início da linha e, portanto, recuo. Além disso, se você tiver certeza de que está tudo bem em^
executar de uma só vez , remova-o e execute-o apenas uma vez com::%s/\(^I*\)␣␣␣␣/\1^I/g
Conversão: pesquise todas as instâncias de 4 espaços consecutivos (após o caractere =), mas apenas se a linha inteira até esse ponto for em branco (isso usa a asserção look-behind de largura zero
\@<=
). Substitua cada instância encontrada por um caractere de tabulação.fonte
:%s/\(^\s*\)\@<= /\t/g
- coloque o número apropriado de espaços (para converter 4 espaços em 1 guia, coloque 4 espaços) logo após o<=
Altera todos os espaços para a guia:% s / \ s / \ t / g
fonte
Linux: com
unexpand
(eexpand
)Aqui está uma solução muito boa: https://stackoverflow.com/a/11094620/1115187 , principalmente porque usa * nix-utilities:
Linux: script customizado
Minha resposta original
Snippet de festança para substituir o recuo de 4 espaços (existem dois
{4}
no script) por guias em todos os.py
arquivos da./app
pasta (recursivamente):Não modifica 4 espaços no meio ou no final.
Foi testado no Ubuntu 16.0xe Linux Mint 18
fonte
No meu caso, eu tinha vários espaços (os campos foram separados por um ou mais espaços) que eu queria substituir por uma guia. O seguinte foi feito:
fonte
Se você coreutils GNU instalado, considere
%!unexpand --first-only
ou para guias 4-espaciais, considere%!unexpand -t 4 --first-only
(--first-only
está presente apenas no caso de você foram acidentalmente invocandounexpand
com--all
).Observe que isso substituirá apenas os espaços que precedem as paradas prescritas da guia, não os espaços que os seguem; você não verá nenhuma diferença visual no vim, a menos que exiba as guias mais literalmente; por exemplo, meu
~/.vimrc
contémset list listchars=tab:▸┈
(suspeito que seja por isso que você pensouunexpand
que não funcionou).fonte
Para usar o Vim para redefinir novamente um conjunto de arquivos (por exemplo, todos os arquivos * .ts em uma hierarquia de diretórios) de 2 espaços para 4 espaços, tente isso na linha de comando:
O que isto está fazendo é usar
find
para passar todos os arquivos correspondentes paraxargs
(a opção -print0 em find funciona com a opção -0 para xargs para manipular arquivos com espaços no nome).O xargs executa o vim no modo ex (
-e
) em cada arquivo que executa o comando ex fornecido, que na verdade são vários comandos, para alterar os espaços iniciais existentes para guias, redefinindo a parada de tabulação e alterando as guias de volta para espaços e, finalmente, salvando e saindo.A execução no modo ex impede isso:
Vim: Warning: Input is not from a terminal
para cada arquivo.fonte
Script Python simples:
fonte