Vim (Vi IMproved) é um editor de texto gratuito e open source já instalado na maioria dos sistemas UNIX. Lançado em 1991, o Vim é um clone melhorado do antigo Vi, de 1976.
Uma das principais características do Vi é a interface de linha de comando em que se edita texto. Essa natureza foi herdada de um editor que usava puramente linha de comando, chamado Ed. É importante frisar que na época de uso de editores como o Ed, o mouse não era popularizado ou nem sequer existia. Desse jeito, a solução para se navegar num texto ou editá-lo era usar combinações de teclas que facilitassem a vida dos usuários.
O mouse começou a ganhar popularidade com o lançamento do Apple Lisa, em 1983).
Vou dividir a resposta para essa pergunta em três partes.
Você pode não usar o editor de texto Vim. Porém, a coisa mais importante sobre o Vim não é o próprio editor em si, porém como você se movimenta nele, ou seja, as vim motions. Sabe quando você vai na cozinha e automaticamente, sem pensar, acaba pegando um copo d'água e começar a beber e depois de um tempo se pergunta por que começou a beber água? Você pode ter feito isso por pura memória muscular (ou corporal nesse caso).
Com o Vim, você tem maneiras bem eficientes de se movimentar no texto, com alguns pressionar de teclas você consegue fazer o que quiser. Com isso, você pode combinar a maneira de editar do vim (as vim motions) com a memória muscular. Nesse sentido, com o tempo você nem se preocupará em como mas sim no que fazer.
Por consequência disso, você ficará muito mais rápido e livre ao editar texto, tendo mais liberdade de pensar no texto em si. Uma coisa boa das vim motions é que elas estão em todo lugar. Seja nos editores de texto mais populares, em algumas ferramentas de linha de comando, navegadores, etc.
Por fim, as vim motions são como um vício. Uma vez acostumado, fica difícil voltar atrás.
A experiência com o editor de texto varia muito de pessoa pra pessoa. Alguns se acostumam, outros nem tanto. O mais importante é estar pelo menos familiarizado com as vim motions antes de tentar usar o editor, já que você sabe como realizar tarefas básicas.
Usar o editor de texto te proporcionará duas coisas muito importantes:
-
Contato com a linha de comando. Saber como usar a linha de comando (no terminal) com proeficiência é essencial para qualquer programador, use ele o Vim ou não. Dessa forma, com o Vim, você tem constante contato com a linha de comando, pois o Vim é apenas um editor de texto, e qualquer coisa fora disso você precisará acessar a linha de comando. Assim, parte das ferramentas
coreutils
são essenciais para o dia a dia no terminal, além de outras ferramentas, como,grep
,awk
,sed
,less
, etc. -
Personalização do workflow. Pela flexibilidade do Vim, você pode configurar seu editor de texto da maneira que você quiser. Ter um workflow que funcione para você é essencial, pois te dará mais conforto e velocidade ao trabalhar com seu editor de texto. Ainda, ao configurar o Vim, existem muitas opções de integração entre o editor e várias ferramentas de terminal (como as mencionadas anteriormente). Por exemplo, você pode configurar o Vim para que ele tenha análise sintática do seu código, mostrando erros de sintaxe, gere snippets de código, etc.
Uma das coisas que faz de um editor de texto ser bom é sua extensibilidade. Quem já tenha usado outros editores de texto populares pôde percerber que eles tem uma vasta lista de plugins que são possíveis de serem instalados.
O mais interessante é que você pode combinar a flexibilidade das configurações do Vim com plugins que melhorem sua experiência. Isso faz com que você construa o ambiente de desenvolvimento que você quiser.
Para se ter uma ideia, há por volta de 19 mil plugins (quantidade obtida a partir do link abaixo). Um ótimo recurso para listar os plugins mais populares se encontra aqui.
Frequentemente as pessoas comparam um editor ao outro. O que uma pessoa se deve atentar é qual a experiência que ela terá e quais os pontos positivos e negativos que aquele editor tem. Muitas vezes, para se tornar proeficiente num editor de texto, isso requer tempo e esforço. Assim, comparar editores não faz sentido, pois é o usuário e o seu workflow que importam e não as características de outro editor.
Por mais que isso te pareça estranho, é comum termos vários programas com suas filosofias próprias: regras (abordagens) gerais que guiam o desenvolvimento de uma aplicação. Como muitos outros softwares, Vim também tem sua filosofia.
Vim adere à filosofia de edição modal. Isso significa que ele fornece vários modos e o significado das teclas muda de acordo com o modo. Você navega pelos arquivos no modo normal, insere texto no modo de inserção, seleciona linhas no modo visual, acessa comandos no modo de linha de comando e assim por diante. Isso pode parecer complicado no começo, mas tem uma grande vantagem: você não precisa quebrar os dedos segurando várias teclas ao mesmo tempo, na maioria das vezes basta pressioná-las uma após a outra. Quanto mais comum a tarefa, menos teclas são necessárias.
Um conceito relacionado que funciona bem com a edição modal são os operadores e
movimentos. Os operadores iniciam uma determinada ação, por exemplo, alterar, remover
ou selecionar texto. Em seguida, você especifica a região do texto na qual deseja atuar
usando um movimento. Para alterar tudo entre parênteses, use ci(
(leia alterar
parênteses internos ou change inner parentheses). Para remover um parágrafo
inteiro de texto, use dap
(leia excluir ao redor do parágrafo ou delete
around paragraph).
Se você vir usuários avançados do Vim trabalhando, notará que eles falam a linguagem do Vim, assim como os pianistas manuseiam seus instrumentos. Operações complexas são feitas usando apenas alguns pressionamentos de tecla. Eles nem pensam mais nisso, pois a memória muscular já assumiu o controle. Isso reduz a carga cognitiva e ajuda a focar na tarefa real.
O resultado final é um editor que pode corresponder à velocidade com que você pensa.
Diferente da maioria dos editores de texto/código que existem por aí, Vim tem o que se chama de modos. O design do Vim é baseado na ideia de que um programador passa a maior parte do seu tempo lendo, navegando e editando pequenos trechos de código, ao invés de escrever continuamente grandes textos. Por isso o Vim possui múltiplos modos de operação:
- Normal: para se mover num texto e fazer edições
- Insert: para inserir texto
- Replace: para substituição de texto
- Visual (plain, line, block): para selecionar blocos de texto
- Command-line: para rodar um comando
Teclas tem diferentes significados dependendo em qual modo você está. Por exemplo,
a letra x
no modo Insert significa literalmente o caractere 'x', mas no modo
Normal, essa tecla deleta o caractere debaixo do cursor, assim como no modo
Visual, que deleta o texto selecionado.
Em sua configuração padrão, Vim mostra em qual modo você está bem na parte inferior esquerda. Seu modo inicial/padrão é o modo Normal (quando você abre o editor). Geralmente, você passará a maior parte do seu tempo entre os modos Normal e Insert.
Para trocar de um modo para outro, você aperta a tecla <ESC>
, indo para o modo
Normal. Do modo Normal, você vai para o modo Insert com i
, para o modo Replace
com R
, para o modo Visual com v
, Visual Line com V
('v' maiúsculo), Visual Block
com <C-v>
(Ctrl-V, às vezes também escrito como ^V
), e modo Command-line com :
.
Sim, eu sei, isso tudo parece muito complicado. Mas não se preocupe, pois os modos do Vim se tornarão algo bem familiar: e na verdade você os achará geniais.
Responda rápido: qual tecla te coloca no modo Normal e qual te tira de qualquer modo?
O modo Normal é o centro de tudo, pois é ele que te leva a todos os outros modos. Assim,
permaneça nesse o máximo possível, e troque para outro modo quando necessário.
Pense no modo Normal como onde você esculpe seu código/texto, seja lendo-o ou então
fazendo pequenas mudanças. Para ter certeza que você está no modo Normal, aperte
<ESC>
e veja seu canto inferior à esquerda, onde aparecerá NORMAL
(por padrão, todos os outros modos aparecerão no mesmo local).
Por usarmos muito o
<ESC>
e ser uma tecla longe da posição que digitamos geralmente essa tecla é mapeada para outra tecla mais perto ou até uma combinação de teclas, mas não se preocupe com isso por enquanto.
Nota: Os comandos do Vim são mnemônicos e, na maioria da vezes, fáceis de lembrar.
Em modo Normal, você entra nesse modo apertando :
.
Seu cursor pulará para a linha de comando na parte inferior da tela ao pressionar :
.
Este modo tem muitas funcionalidades, incluindo abrir, salvar e fechar arquivos, assim
como sair do Vim.
:q
(ou:quit
) - para sair de um arquivo não modificado:q!
- forçar a saída de um arquivo (modificado ou não):w
(ou:write
) - salva o arquivo:x
- salva o arquivo e sai ao mesmo tempo (equivalente a:wq
ou entãoZZ
):h
(ou:help
) - abre uma janela no Vim com o arquivo de ajuda:h {comando}
- abre uma janela com a ajuda para ocomando
- Por exemplo,
:h y
te mostra o arquivo de ajuda para o comandoy
do modoNormal
Estando no modo Normal, há diversas formas de entrar no modo Insert:
i
oua
- para inserir texto antes do cursor ou depois do cursor, respectivamenteI
ouA
- para inserir texto no começo ou no final da linha, respectivamente
Lembre-se do
i
comoinsert
e doa
comoappend
.
o
ouO
- respectivamente, cria uma linha abaixo ou acima de onde você está e te coloca em modo Insert
Lembre-se do
<Shift>
quando for inserir acima de onde você está (o Shift é uma setinha para cima).
Você pode selecionar um pedaço de texto/código de diferentes formas:
v
- para selecionar o caractere abaixo do cursorV
- para selecionar toda a linha em que o cursor está<C-v>
- seguido de movimentos, seleciona um bloco de texto
Mas calma, o que são movimentos? Antes de saber os movimentos, vamos entender uma ideia chave do Vim.
A ideia mais importante no Vim é que a própria interface do Vim é uma linguagem de programação. Teclas (com nomes mnemônicos) são comandos, e esses comandos expressam ideias (pense no Vim realmente como uma linguagem, com verbos, substantivos e adjetivos). Isso permite movimentos e edições eficientes, especialmente quando os comandos se tornam memória muscular.
Repetindo, você deve passar a maior parte do tempo no modo Normal, usando comandos de movimento para navegar no arquivo. Os movimentos no Vim também são chamados de “substantivos”, porque se referem a pedaços de texto.
- Movimentos básicos:
h
- direitaj
- baixok
- cimal
- esquerda
Dica: o
j
se parece com uma seta pra baixo.
-
Palavras:
w
- vai pro começo da próxima palavrab
- volta pro começo da palavra anteriore
- vai pro final da próxima palavra
-
Linhas:
0
- começo da linha_
- primeiro caractere da linha$
- final da linha
-
Tela:
H
- topo da telaM
- meio da telaL
- final da tela
-
Páginas:
<C-u>
- uma página para cima (up)<C-d>
- uma página para baixo (down)
Uma página é o texto que ocupa toda a tela do seu terminal.
-
Arquivo:
gg
- começo do arquivoG
- final do arquivo50%
- metade do arquivo (100%
seria equivalente aG
)
-
Número da linha:
:{n}
ou{n}G
- vai para a linha de númeron
Você não tem que digitar os "{", apenas digite
10G
, por ex. Lembre-se disso pro resto do texto.
-
Correspondência:
%
- encontra o próximo(
,[
ou{
-
Encontre:
f{caractere}
- Posiciona o cursor em cima docaractere
t{caractere}
- Posiciona o cursor antes docaractere
F{caractere}
- Faz o mesmo quef
mas de trás pra frenteT{caractere}
- Faz o mesmo quet
mas de trás pra frente,
para o próximo item e;
para o anterior
-
Busca:
/{expressão}
- Busca pelo item encontrado pelaexpressão
regularn
para o próximo item eN
para o anterior
Tudo o que você fazia com o mouse agora você faz com o teclado usando comandos de edição que compõem com comandos de movimento. Aqui é onde a interface do Vim começa a parecer uma linguagem de programação. Os comandos de edição do Vim também são chamados de “verbos”, porque os verbos agem sobre substantivos.
d{movimento}
- Deleta tudo fornecido pelomovimento
- Por exemplo,
dw
apaga a próxima palavra,d0
apaga tudo até o começo da linha,d$
até o final, etc
- Por exemplo,
c{movimento}
- Muda tudo fornecido pelomovimento
cw
, por exemplo, muda a próxima palavra- O mesmo que
d{movimento}
seguido dei
x
- Deleta o caractere sob o cursor (igual adl
)s
- Muda o caractere sob o cursor (igual acl
)- Modo Visual + manipulação
- Selecione o texto,
d
para apagá-lo ouc
para mudá-lo
- Selecione o texto,
u
para desfazer e<C-r>
para refazery
- Copia o caractere/textop
- Cola o caractere/texto copiado
Nota:
p
também cola o texto que foi deletado.
Você pode combinar substantivos e verbos com uma contagem, que executará uma determinada ação várias vezes.
3w
move 3 palavras para frente5j
move cinco linhas para baixo7dw
deleta 7 palavras
Siga os seguintes passos:
Primeiro, vamos praticar toda a parte básica (e mais algumas coisas) que vimos até agora. Em seu terminal, digite:
vimtutor pt.utf-8
Esse é o texto oficialmente traduzido do vimtutor original, em inglês.
Agora siga todo o texto, fazendo cada lição. Além disso, ajude o colega ao lado, se possível.
Para ter algum texto/código para brincar, faça isso:
- Clone esse repositório com:
git clone https://github.com/isaacvicente/minicurso_vim
- Mova-se para o diretório recém criado:
cd minicurso_vim
Dica: use o Tab para autocompletar o nome do diretório.
- Veja os arquivos disponíveis:
ls
vimrc é o arquivo de configuração do Vim. É nele onde o Vim pode ser customizado ao seu próprio gosto. Para tal, o Vim usa uma linguagem própria para sua configuração, o VimL (ou Vim Language).
Não se preocupe com essa linguagem. Para o básico, cada opção é bem fácil de entender.
Temos um vimrc mínimo para você. Cada opção é seguida de uma pequena explicação em inglês. Procure entender o que a maioria delas significa.
Vamos usar o vimrc disponível! Do seu terminal, digite:
mkdir -p ~/.vim/
Agora copie o vimrc para a pasta .vim/
:
cp vimrc ~/.vim/
Em sistemas UNIX, diretórios/arquivos precedidos de um ponto (.) são diretórios/arquivos escondidos. Geralmente os arquivos de configuração ou são arquivos escondidos ou ficam em alguma pasta escondida. Por tal motivo, chamamos esses arquivos de dotfiles. Por exemplo, você pode ver meus dotfiles.
Dica: para ver arquivos/diretórios escondidos digite
ls -a
(ouls --all
).
Um buffer é nada mais que o texto que você está editando. Assim, cada arquivo que você abre no Vim
tem seu próprio buffer. Logo, quando você roda vim texto.txt
, você está abrindo o Vim com um
único buffer que é carregado com o conteúdo de texto.txt
. Você pode, então, abrir com o Vim com
vários buffers carregados, um para cada arquivo, como por exemplo, vim ~/.vimrc ~/.bashrc
.
Uma janela (window) é apenas uma maneira de visualizar um buffer. O importante
a observar é que uma janela pode visualizar qualquer buffer que desejar, ou
seja, ela não é forçada a olhar para o mesmo buffer. Ao editar um arquivo, se
digitarmos :vsplit
, teremos uma divisão vertical e na outra janela veremos o
buffer atual que estamos editando! Acontece que quando abrimos uma janela, ela
visualiza o buffer atual. Executando os comandos relacionados aos buffers, podemos
modificar qual buffer a janela está visualizando.
Tabs são abas. Não confunda as abas do Vim com as do VSCode (ou qualquer editor de texto parecido). No Vim, uma aba é uma coleção de janelas, ou seja, um layout. Abas foram desenvolvidas para permitir que tenhamos diferentes layouts de janelas.
Para evitar essa pequena confusão, tente apenas usar buffers e janelas. Mais futuramente, quando eventualmente você precisar de diferentes layouts para seus buffers, use abas.
Uma discussão mais detalhada de buffers, windows e tabs encontra-se nesse blog post, no qual se tem alguns exemplos que ilustram o uso de buffers e windows.
Vamos abrir dois buffers com o Vim:
vim c-code.c lorem_ipsum.txt
Isso te levará ao arquivo c-code.c
. Porém, ao usar o comando :ls
, você verá
que, na verdade, há dois buffers. Para ir pro próximo buffer faça:
:bn
(ou:bnext
)
Analogamente, para voltar um buffer:
:bp
(ou:bprevious
)
Com isso, você estará no arquivo c-code.c
novamente, sem nem precisar sair do Vim.
Agora, vamos supor que você queira visualizar dois arquivos ao mesmo tempo, de modo a ter um fácil acesso a ambos. Para isso, é útil utilizarmos duas janelas. Por exemplo:
vim c-code.c python-code.py
Com isso, fazemos:
<C-w>
s
ou:sp
(ou:split
) - abrimos uma janela horizontalmente
Aperte Ctrl (lembre-se da notação do Ctrl) seguido de 'w'. Depois disso, você pode livremente apertar 's'. Note que a janela está visualizando o mesmo buffer.
:bn
- dentro da nova janela, vamos pro próximo buffer
buffers_e_janelas.mp4
Como essa operação é muito comum, temos um único comando equivalente ao que fizemos:
:sbn
(ou:sbnext
) - abre uma janela horizontal e visualiza o próximo buffer
Tente fazer esse você mesmo!
Mais comandos úteis de janelas:
:vs
,:vsplit
ou<C-w>
v
- Abre uma janela verticalmente:new
- Abre uma janela e te coloca pra editar um arquivo em branco:sp {arq}
- Faz o mesmo que:new
, porém cria um arquivo com nomearq
Nota: para fechar uma janela, você usa o convencial
:q
.
<C-w>
h
/j
/k
/l
- Te move para a janela da(e) esquerda/baixo/cima/direita.
Para inverter a posição de duas (ou mais janelas), fazemos:
<C-w>
r
- inverte a janela à direita ou a janela abaixo<C-w>
R
- inverte a janela à esquerda ou a janela acima
Já sabemos que o Vim não é exatamente fácil de ser usado no primeiro contato e que o aprendizado leva algum tempo. Também sabemos que há toda uma filosofia por trás do uso do Vim na edição de textos e que, uma vez que o usuário esteja familiarizado, poderá colher os frutos do seu aprendizado editando texto de forma cada vez mais eficaz e eficiente.
Sabendo que grande parte do dia-a-dia de qualquer pessoa na Internet envolve escrever textos, e que essa pessoa já utilize o Vim para programação, por quê não usar o Vim e os seus comandos também em um navegador, gerenciador de arquivos... Ou até em um player de música? Tratando-se de programação, o céu é o limite.
Podemos dividir o funcionamento do "modo Vim" nas aplicações em duas formas de implementação: embutida na aplicação e através de plug-in.
Há aplicações que são intencionalmente criadas para serem operadas através de atalhos semelhantes ao Vim. Nessa categoria encontraremos aplicações que nós normalmente não conhecemos e que podem (ou não) ter todos os recursos que esperamos, já que tendem a ser projetos menores e desenvolvidos especialmente para ter um modo Vim.
Já outras aplicações podem ser estendidas, permitindo que desenvolvedores criem plug-ins que adicionam o modo Vim a elas. Essa característica é especialmente útil nos casos em que uma aplicação não é desenvolvida com o modo Vim em mente, mas que a presença dele seria interessante.
Temos uma listagem bastante completa de aplicações que ou possuem o modo Vim ou permitem que ele seja adicionado no site Big Pile of Vim-like.
Os destaques incluem:
- NeoMutt: cliente de e-mails com modo Vim por padrão.
- Ranger: gerenciador de arquivos com modo Vim por padrão.
- cmus: um player de música não tão minimalista com modo Vim.
- Vimium: adiciona o modo Vim ao Chrome.
- Vimium-FF: adiciona o modo Vim ao Firefox.
Além disso, algumas aplicações que suportam plugins que fazem com que a edição de texto/navegação seja como Vim são:
- Visual Studio Code + Vim: o VSCode tem uma extensão que permite edição de texto como Vim, com linha de comando e macros inclusos.
- JetBrains + Vim = IdeaVim: assim como o VSCode, as IDEs da JetBrains também têm uma extensão para o Vim.
- Obsidian: aplicação para anotações que além de já vir com um "modo Vim" embutido, tem plugins como esse que dão suporte até a arquivos de configuração para o Vim.
- Curated Learning Resources - Vim Resources: uma lista com os melhores conteúdos relacionados ao Vim, desde livros até dicas práticas. Guarde esse link em seus bookmarks e seja feliz.
Dos links aqui citados, esse é o mais importante.
- Vimrc Configuration Guide: um guia de configuração do vimrc.
Nota: só adicione ao seu vimrc apenas o que você precisa: geralmente, quanto mais simples, melhor.
- Learn Vim the Smart Way: uma guia pelas partes boas do Vim, com boa profundidade de conteúdo mas não tanta a ponto de te sobrecarregar.
- r/vim - Wiki: a wiki do subreddit do Vim, com ótimas dicas construídas pela comunidade.
Assim como em outros editores de texto modernos, o Vim também tem seus plugins. Escolhendo a dedo cada plugin pode tornar sua experiência no Vim extremamente mais conveniente.
- Vim Awesome: uma lista awesome dos plugins mais curtidos e usados pela comunidade.
Uma lista incrível (awesome) é uma lista de coisas incríveis com curadoria da comunidade. Existem listas incríveis sobre tudo, desde aplicativos CLI até livros de fantasia.
O Neovim é para o Vim assim como o Vim foi para o Vi. A verdade é que você não está nada errado em usar apenas o Vim. Porém, ultimamente o Neovim vem ganhando muita popularidade, sendo o editor de texto mais amado, segundo o survey do StackOverFlow de 2022.
Algumas das vantagens:
- LSP - Language Server Protocol: O LSP facilita recursos como go-to-definition, find-references, hover, conclusão, renomeação, formatação, refatoração, etc., usando análise semântica de todo o projeto.
- Lua scripting: Lua é uma linguagem de scripts simples, pequena, fácil e relativamente popular. Ela pode ser usada para configurar o Neovim, oferecendo uma grande flexibilidade a um pequeno custo de aprender uma nova linguagem de programação.
Uma coisa muito bacana acerca do Neovim é que foram construídas aplicações que simulam muito bem modernas IDEs. As mais famosas são:
- LazyVim: configuração bem completa do Neovim e facilmente extendível ao seu gosto.
- LunarVim: uma camada de IDE sobre o Neovim. Completamente dirigida pela comunidade.
Nota: esses projetos são fantásticos, porém se você considera utilizar o Neovim, eu recomendaria você realmente entender primeiro o que o Neovim, por padrão, é capaz de fazer. É muito satisfatório construir uma configuração só sua: então considere fazer isso!
Há ainda mais motivos para que uma pessoa talvez troque Vim pelo Neovim. Se você ficou curioso(a), pesquise mais sobre.
Realmente esperamos que você tenha levado algo de útil desse mini curso. Esperamos também que você legitimamente continue usando o Vim.