Substituir guias por espaços no vim

358

Gostaria de converter tab em espaços no gVim. Eu adicionei a seguinte linha ao meu _vimrc:

set tabstop=2

Ele funciona para parar em dois espaços, mas ainda parece que uma tecla de tabulação foi inserida (tentei usar a tecla h para contar os espaços posteriormente).

Não tenho certeza do que devo fazer para que o gVim converta abas em espaços?

David.Chu.ca
fonte
11
Pessoalmente, eu consideraria tabstop = 2 um travessão muito pequeno; Eu uso ts = 4 e entendo por que as pessoas (como a equipe do kernel do Linux) usam ts = 8 (e elas não usam o expandtab - eu faço).
Jonathan Leffler
4
Existe uma maneira de converter espaços em abas no vim?
Cwd
2
@cwd substituindo os espaços com caráter guia ( ^Ique vem Ctrl-vdepois Tab) seriam obras, por exemplo, se suas abas atuais é de 4 espaços::%s/ /^I/g
Indra Ginanjar

Respostas:

381

IIRC, algo como:

set tabstop=2 shiftwidth=2 expandtab

deve fazer o truque. Se você já possui guias, siga-o com um bom RE global para substituí-las por espaços duplos.

D.Shawley
fonte
25
Opa, isso é ":% expandir t2!"
Paul Tomblin
368
ou você pode apenas usar: retab
rampion
e se eu quiser salvá-lo com espaços? agora quando eu: wq e abra o arquivo novamente eu estou de volta ao abas
Gorkem Yurtseven
11
@Gorkem colocar esses comandos em seu .vimrc, de modo que vim usa essas configurações cada sessão
Krakkos
5
O que tudo isso significa é bem explicado no wiki do Vim .
Serge Stroobandt
824

Depois que você tiver expandido a guia de acordo com as outras respostas, a maneira extremamente conveniente de converter arquivos existentes de acordo com as novas configurações é:

:retab

Ele funcionará no buffer atual.

ʞɔıu
fonte
mas como podemos fazer a retab solicitar confirmação de cada ocorrência do TAB?
Oculus Dexter
8
E sendo Vim, ele funciona em regiões visualmente selecionados também :)
Andy
2
Obrigado por me ensinar uma coisa nova. Eu uso o tedioso :%s/\t/ /ghá anos antes de ver seu comentário.
Tai Le
Você pode até fazer :args retab | wtodos os arquivos abertos na linha de comando, por exemplo vim *.txt,.
Jaked
Alguém sabe qual versão do vim possui: retab? Meu 7.3.322 não.
bitmaker
114

Tentar

set expandtab

para abas suaves.

Para corrigir guias pré-existentes:

:%s/\t/  /g

Usei dois espaços, já que você já definiu seu tabstop para 2 espaços.

Hank Gay
fonte
5
Essa correção inserirá dois espaços em que apenas um é necessário.
Jonathan Leffler
8
em vez de fazer a substituição, você pode fazer o que Nick sugeriu acima - ou seja, refazer a revisão. Isso redigitará todas as suas guias existentes como o número de espaços definido em seu tabstop.
Gowri
Dica incrível! O Vim me mostrou um arquivo perfeitamente identificado, enquanto o gato (linux cmd) mostrou uma identificação irregular. Acabei de alterar os 2 espaços para 4 como uso no Vim set ts = 4.
karlphillip
60

Isso funcionou para mim:

você pode ver as guias primeiro fazendo isso:

:set list

para tornar possível substituir guias, faça o seguinte:

:set expandtab

então

:retab

agora todas as guias foram substituídas por espaços. Você pode voltar à visualização normal como esta:

:set nolist
serup
fonte
11
:set listé simplesmente lindo.
Amir A. Shabani
44

gg=G reindentará o arquivo inteiro e removerá a maioria, senão todas as guias que eu recebo dos arquivos dos colegas de trabalho.

Jake Sellers
fonte
11
substitui tabulações por espaços?
precisa saber é o seguinte
11
Impressionante! Trabalhou para mim também.
Nawaz
11
Você pode explicar o que gg = G faz? Isso fez exatamente o que eu estava procurando. Eu tenho html no sublime e quando eu colei no vim, foi loucamente recuado. Agora parece limpo.
jes516
3
@ jes516 ggmove o cursor para o início do buffer. =é formato e assume um comando de movimento. Gmove o cursor no final do buffer, para que ele seja formatado do começo ao fim do buffer atual.
Jake Sellers
40

Adicione as seguintes linhas ao seu arquivo .vimrc

set expandtab
set tabstop=4
set shiftwidth=4
map <F2> :retab <CR> :wq! <CR>

Abra um arquivo no vim e pressione F2. As guias serão convertidas em 4 espaços e o arquivo será salvo automaticamente.

anish
fonte
Provavelmente vale a pena notar que qo arquivo fechará também o buffer atual do arquivo. Isso pode ou não ser desejado.
Willem van Ketwich 14/09/19
14

Se você deseja manter o seu \tigual a 8 espaços, considere a configuração:

   set softtabstop=2 tabstop=8 shiftwidth=2

Isso fornecerá dois espaços por <TAB>impressora, mas \to código real ainda será exibido como 8 caracteres.

pk.
fonte
Obrigado por mencionar softtabstop, uma das características mais importantes, eu acho.
Martin Ueding 19/09/13
6

Isso funcionou para mim:

:set tabstop=2 shiftwidth=2 expandtab | retab
Willem van Ketwich
fonte
4

procure primeiro as guias no seu arquivo: / ^ I: set expandtab: retab

vai funcionar.

Shekar
fonte
a primeira parte você poderia por favor explicar que
Serup
3

Este artigo possui um excelente script vimrc para manipular guias + espaços e converter entre eles.

Estes comandos são fornecidos:

Space2Tab Converta espaços em tabulações, apenas em recuos.

Tab2Space Converta guias em espaços, apenas em recuos.

RetabIndent Execute Space2Tab (se 'expandtab' estiver definido) ou Tab2Space (caso contrário).

Cada comando aceita um argumento que especifica o número de espaços em uma coluna da guia. Por padrão, a configuração 'tabstop' é usada.

Fonte: http://vim.wikia.com/wiki/Super_retab#Script

" Return indent (all whitespace at start of a line), converted from
" tabs to spaces if what = 1, or from spaces to tabs otherwise.
" When converting to tabs, result has no redundant spaces.
function! Indenting(indent, what, cols)
  let spccol = repeat(' ', a:cols)
  let result = substitute(a:indent, spccol, '\t', 'g')
  let result = substitute(result, ' \+\ze\t', '', 'g')
  if a:what == 1
    let result = substitute(result, '\t', spccol, 'g')
  endif
  return result
endfunction

" Convert whitespace used for indenting (before first non-whitespace).
" what = 0 (convert spaces to tabs), or 1 (convert tabs to spaces).
" cols = string with number of columns per tab, or empty to use 'tabstop'.
" The cursor position is restored, but the cursor will be in a different
" column when the number of characters in the indent of the line is changed.
function! IndentConvert(line1, line2, what, cols)
  let savepos = getpos('.')
  let cols = empty(a:cols) ? &tabstop : a:cols
  execute a:line1 . ',' . a:line2 . 's/^\s\+/\=Indenting(submatch(0), a:what, cols)/e'
  call histdel('search', -1)
  call setpos('.', savepos)
endfunction

command! -nargs=? -range=% Space2Tab call IndentConvert(<line1>,<line2>,0,<q-args>)
command! -nargs=? -range=% Tab2Space call IndentConvert(<line1>,<line2>,1,<q-args>)
command! -nargs=? -range=% RetabIndent call IndentConvert(<line1>,<line2>,&et,<q-args>)

Isso me ajudou um pouco mais do que as respostas aqui, quando fui procurar uma solução.

Adam Eberlin
fonte
3

expandé um utilitário unix para converter abas em espaços. Se você não deseja setnada no vim, pode usar um comando shell do vim:

:!% expand -t8
qwr
fonte
11
se você quiser apenas expandir uma parte do código: primeiro selecione essa parte no modo visual e pressione :. Agora a linha de comando do vim é exibida :'<,'>. Em seguida, insira !expand -t4a tab para 4 espaços. (A linha de comandos é como resultou :'<,'>!expand -t4)
Penghe Geng