Tecla Tab == 4 espaços e recuo automático após chaves no Vim

1265

Como faço para o vi - Vim nunca usar abas (converter espaços em abas, péssimo!), Faz com que a tecla tab == 4 espaços e indente automaticamente o código após blocos de chaves como o Emacs ?

Além disso, como faço para salvar essas configurações para nunca mais precisar inseri-las?

Eu já vi outras questões relacionadas a isso, mas sempre parece estar um pouco fora do que eu quero.

mmcdole
fonte
3
Relacionado: Como substituir guias por espaços? em Vim SE
kenorb

Respostas:

1882

Como foi apontado em algumas respostas abaixo, o método preferido agora é NÃO usar o smartindent, mas use o seguinte (no seu .vimrc ):

filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab

No seu arquivo .vimrc :

set smartindent
set tabstop=4
set shiftwidth=4
set expandtab

Os arquivos de ajuda demoram um pouco para se acostumar, mas quanto mais você lê, melhor o Vim fica:

:help smartindent

Melhor ainda, você pode incorporar essas configurações na sua fonte para portabilidade:

:help auto-setting

Para ver suas configurações atuais:

:set all

Como graywh aponta nos comentários, smartindent foi substituído por cindent, que "funciona de maneira mais inteligente", embora ainda principalmente para idiomas com sintaxe do tipo C:

:help C-indenting

Ken
fonte
4
Se você tiver o conjunto de guias de expansão, deverá usar espaços. Você também "define compatível"? Que tem vários efeitos colaterais, incluindo a redefinição expandtab ao seu padrão de "off"
Ken
60
Desculpe, mas o smartindent foi substituído pelo cindent, que por si só é apropriado para a sintaxe no estilo C. A ativação do vimrc pode ser um problema ao trabalhar com outros idiomas. Basta usar "recuo do tipo de arquivo ativado".
graywh
2
Bem, o smartindent também é apenas para sintaxe no estilo C e é essencialmente preterido.
graywh
4
se eu ativar o expandtab, existe uma maneira de realmente inserir o caractere de tabulação no texto?
Daniele Segato
3
@DanieleSegato <ctrl v> <tab> deve funcionar no modo de inserção: stackoverflow.com/questions/4781070/...
Ken
236

Relacionado, se você abrir um arquivo que use guias e espaços, supondo que você tenha

set expandtab ts=4 sw=4 ai

Você pode substituir todas as guias por espaços no arquivo inteiro por

:%retab
netjeff
fonte
10
Para sua informação, se você não quiser que sua guia seja substituída por espaços, remova a linha da aba de expansão.
Eno
6
As guias não estão em branco? ;-)
Rob Wells
11
@ Rob-Wells: mudei "espaço em branco" para "espaços". Você está feliz agora? ;-)
netjeff 28/02
Você poderia explicar o que significa essa primeira linha?
Fund Monica's Lawsuit
2
O expandtab determina se as guias são expandidas para espaços. ts = tabstop = Número de espaços que um <Tab> no arquivo conta. sw = shiftwidth = Número de espaços a serem usados ​​para cada etapa do recuo (automático). ai = autoindent = Copiar recuo da linha atual ao iniciar uma nova linha.
mcmacerson
89

A melhor maneira de obter indentação específica de tipo de arquivo é usar filetype plugin indent onno seu vimrc. Em seguida, você pode especificar itens como set sw=4 sts=4 et.vim / ftplugin / c.vim, por exemplo, sem precisar torná-los globais para todos os arquivos que estão sendo editados e outras sintaxes que não sejam do tipo C também serão recuadas corretamente (mesmo lisps) .

graywh
fonte
9
IMHO, melhor do que a resposta que foi marcada como correta. O recuo do tipo de arquivo substitui o cindent e o smartindent.
0fnt
62

Para ter guias de 4 espaços na maioria dos arquivos, caractere de tabulação real de 8 em Makefiles e recuo automático em vários arquivos, incluindo C / C ++, coloque isso no seu ~/.vimrcarquivo:

" Only do this part when compiled with support for autocommands.
if has("autocmd")
    " Use filetype detection and file-based automatic indenting.
    filetype plugin indent on

    " Use actual tab chars in Makefiles.
    autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif

" For everything else, use a tab width of 4 space chars.
set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.
set shiftwidth=4    " Indents will have a width of 4.
set softtabstop=4   " Sets the number of columns for a TAB.
set expandtab       " Expand TABs to spaces.
Shervin Emami
fonte
Por que você não precisa de um else? Parece-me que as últimas linhas substituir o específico do makefile em todos os casos
lucidbrot
6
Olá @lucidbrot, a instrução "autocmd FileType make" basicamente informa ao vim algumas configurações a serem usadas sempre que ele abre um Makefile. Enquanto as linhas abaixo estão definindo os padrões. Em outras palavras, as configurações "tabstop = 8 ..." são aplicadas posteriormente quando o arquivo é aberto e substituem as configurações "tabstop = 4 ..." que se aplicam na inicialização.
Shervin Emami
56

Em muitos sistemas Linux, como o Ubuntu, o .vimrcarquivo não existe por padrão, portanto, é recomendável que você o crie primeiro.

Não use o .viminfoarquivo que existe no diretório inicial. É usado para uma finalidade diferente.

Etapa 1: acesse o diretório inicial

cd ~

Etapa 2: criar o arquivo

vim .vimrc

Etapa 3: adicione a configuração declarada acima

filetype plugin indent on
set tabstop=4
set shiftwidth=4
set expandtab

Etapa 3: salve o arquivo pressionando Shift+ ZZ.

Erick
fonte
11
Não o use, Shift + ZZele criará o arquivo .swp. use wq.
shas 31/12/15
6
@shas: "ZZ" é equivalente a ": x" , que é o mesmo que ": wq", exceto que ele salva apenas se o arquivo foi alterado ... ( Ctrl-Zé outra história ...)
Gert van den Berg
1
@shas Isso simplesmente falso. Se você não quiser um arquivo de permuta para uma sessão de edição, precisará executar vim -n <file>. Um arquivo de troca não é algo gerado em tempo de economia; isso acabaria com seu objetivo, já que os arquivos de troca se tornam úteis na recuperação de sessões de edição encerradas abruptamente.
Kaz
32

A maneira recomendada é usar a indentação baseada em tipo de arquivo e usar apenas smartindent e cindent se isso não for suficiente.

Adicione o seguinte ao seu .vimrc

set expandtab
set shiftwidth=2
set softtabstop=2
filetype plugin indent on

Espero que ajude como uma resposta diferente.

Chaudhry Junaid
fonte
12

edite seu ~ / .vimrc

$ vim ~/.vimrc

adicione as seguintes linhas:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
Yusuf Ibrahim
fonte
10

No wiki do VIM :

:set tabstop=4
:set shiftwidth=4
:set expandtab
Do utilizador
fonte
6

O recuo automático é baseado no modo de sintaxe atual. Sei que, se você estiver editando o Foo.java, insira um {e pressione os Enterrecuos na linha a seguir.

Quanto às guias, existem duas configurações. No Vim, digite dois pontos e, em seguida, "defina tabstop = 4", que definirá as guias para serem exibidas como quatro espaços. Pressione dois pontos novamente e digite "set expandtab", que inserirá espaços para as guias.

Você pode colocar essas configurações em um arquivo .vimrc (ou _vimrc no Windows) em seu diretório pessoal, para digitá-las apenas uma vez.

Joey Gibson
fonte
0

Primeiramente, não use a Tabchave no Vim para recuo manual. O Vim possui um par de comandos no modo de inserção para aumentar ou diminuir manualmente a quantidade de indentação. Esses comandos são Ctrl-Te Ctrl-D. Esses comandos observam os valores de tabstop, shiftwidthe expandtab, e mantêm a mistura correta de espaços e guias (número máximo de guias seguido por qualquer número necessário de espaços).

Em segundo lugar, essas teclas de indentação manual não precisam ser muito usadas de qualquer maneira se você usar a indentação automática.

Se, em Ctrl-Tvez de Tabincomodá-lo, você pode remapear:

:imap <Tab> ^T

Você também pode remapear Shift-Tabpara Ctrl-Dexecutar o deindent:

:imap <S-Tab> ^D

Aqui ^ T e ^ D são caracteres de controle literais que podem ser inseridos como Ctrl-VCtrl-T.

Com esse mapeamento, você ainda pode digitar literal Tab no buffer usando Ctrl-VTab. Observe que, se você fizer isso, mesmo se :set expandtabestiver ativado, receberá um caractere de tabulação não expandido.

Um efeito semelhante ao <Tab> mapa é obtido usando :set smarttab, o que também faz com que o backspace na frente de uma linha se comporte de maneira inteligente.

No smarttabmodo, quando Tabusado não no início de uma linha, ele não tem significado especial. Isso é diferente do meu mapeamento acimaTab para Ctrl-T, porque um Ctrl-Tusado em qualquer lugar de uma linha (no modo de inserção) aumentará o recuo dessa linha.

Outros mapeamentos úteis podem ser:

:map <Tab> >
:map <S-Tab> <

Agora podemos fazer coisas como selecionar algumas linhas e pressionar Tab para recuá-las. Ou pressione Tabduas vezes em uma linha (no modo de comando) para aumentar seu recuo.

Se você usar os comandos adequados de gestão de recuo, em seguida, tudo é controlado por três parâmetros: shiftwidth,tabstop e expandtab.

O shiftwidthparâmetro controla o tamanho do recuo; se você quiser quatro recuos de espaço, use:set shiftwidth=4 ou a abreviação :set sw=4.

Se apenas isso for feito, o recuo será criado usando uma mistura de espaços e tabulações, porque noexpandtab é o padrão. Use :set expandtab. Isso faz com que os caracteres de tabulação digitados no buffer sejam expandidos para espaços e para o recuo gerenciado pelo Vim use apenas espaços.

Quando expandtabestá ativado e se você gerencia seu recuo através de todos os mecanismos adequados do Vim, o valor de tabstoptorna-se irrelevante. Ele controla como as guias aparecem se ocorrerem no arquivo. Se você tiver set tabstop=8 expandtabe depois introduzir uma guia rígida no arquivo Ctrl-VTab, ela produzirá um alinhamento para a próxima posição da guia baseada em 8 colunas, como de costume.

Kaz
fonte
Todos os seus mapeamentos devem usar variantes não recursivas. O mapeamento go <C-t>pode usar essa sintaxe em vez de literais. Por fim, o mapeamento <Tab>no modo normal também será mapeado <C-i>(eles são o mesmo personagem), por isso não recomendo (você perde uma parte bacana da funcionalidade do vim
D. Ben Knoble
@ D.BenKnoble Eu não recomendo nada disso; Eu uso Ctrl-T, Ctrl-D e <> eu mesmo. Isso está usando o Vim como pretendido. As pessoas acostumadas a usar o Tab em outros editores podem não gostar disso, só isso.
Kaz