DEV Community

Cover image for Postila de vim
Neni
Neni

Posted on • Updated on • Originally published at wtf.neni.dev

Postila de vim

🚧 Post em desenvolvimento 🚧

- [x] Motivos
- [ ] Instalação
- [ ] Modos
- [ ] Movimentação
  - [x] Dentro do arquivo
  - [x] Scroll
  - [x] Para inserção
  - [ ] Entre arquivos
- [x] Objetos
- [ ] Pesquisa/Substituição
- [ ] Vimrc
  - [ ] .vimrc
  - [ ] ftplugin
    - [x] PHP
    - [x] Go
    - [ ] Markdown
- [x] Plugins
Enter fullscreen mode Exit fullscreen mode

Sobre

Vim é um editor de texto:

  • Leve
  • Open source
  • Popular e bem estabelecido na comunidade (foi criado em 1991)
  • Utilizável pelo terminal
  • Cheio de atalhos/comando para navegação
  • Multi plataforma
  • Configurável através de dotfiles
  • Expansível com plugins
  • Que não precisa de mouse (mouseless)
  • Que possui o suficiente para programar (sintaxe, sugestões de texto, pesquisa, substituição e etc), apesar de precisar configurar por conta debug e intellisense (go to definition e complete)

Movimentação

Dentro do arquivo

:h motion.txt

  • h esquerda
  • j baixo
  • k cima
  • l direita
  • gg primeira linha
  • G ultima linha
  • 0 primeira coluna da linha
  • ^ primeira coluna com texto da linha
  • $ ultima coluna da linha (incluindo quebra)
  • g_ ultima coluna da linha com texto da linha
  • fx carácter x à frente na linha (, volta e ; avança)
  • Fx carácter x atrás na linha (, volta e ; avança)
  • tx carácter anterior x à frente na linha (, volta e ; avança)
  • Tx carácter anterior x atrás na linha (, volta e ; avança)
  • * palavra (N volta e n avança)
  • w avança para o início de uma word
  • W avança para o início de uma WORD
  • e avança para o final de uma word
  • E avança para o final de uma WORD
  • b volta para o início de uma word
  • B volta para o final de uma WORD
  • :25 linha 25
  • % início ou final do fechamento de {[(<

"word" é uma palavra delimitada por non-keyword (pontuação, espaço e números) e "WORD" por espaço somente

Scroll

  • zt
  • zb
  • zz

Para inserção

  • i esquerda do cursor
  • a direita do cursor
  • I início da linha (alias de ^i)
  • A fim da linha (alias de g_a)
  • o nova linha abaixo da atual
  • O nova linha acima da atual
  • gi volta para a posição do ultimo insertmode

Objetos

É possível instruir uma seleção para executar um comando, como deletar substituir ou até selecionar (:h objects). Essa instrução é a delimitação do que o comando deve abranger, cujo pode ser de um verbo com movimentação ou verbo com objeto:

  • dd apaga uma linha
  v
  perfer et obdura!
  dolor hic tibi proderit olim;
Enter fullscreen mode Exit fullscreen mode
  dolor hic tibi proderit olim;
  ^
Enter fullscreen mode Exit fullscreen mode
  • de apaga do cursor até o final de uma palavra. É um verbo com movimentação (d + e)
  --v
  perfer et obdura!
  dolor hic tibi proderit olim;
Enter fullscreen mode Exit fullscreen mode
  --v
  pe et obdura!
  dolor hic tibi proderit olim;
Enter fullscreen mode Exit fullscreen mode
  • diw apaga a palavra sob o cursor. É um verbo com objeto (d inside word)
  --v
  perfer et obdura!
  dolor hic tibi proderit olim;
Enter fullscreen mode Exit fullscreen mode
  v
   et obdura!
  dolor hic tibi proderit olim;
Enter fullscreen mode Exit fullscreen mode

A delimitação de objetos é feita atraves de uma instrução + substantivo, sendo:

instrução letra
entre (inner) i
ao redor (outer) a
até (find) f
até antes (until) t
substantivo letra
aspas "
apóstrofo '
parênteses ( ou )
chaves { ou }
colchetes [ ou ]
maior/menor < ou >
palavra w
parágrafo p
sentença s
<tag></tag> t

Pesquisa e substituição

descrição escopo comando
pesquisa arquivo /texto procurado
substituição arquivo :%s/original/substituto/g
pesquisa projeto :vimgrep /texto procurado/ **/*.php e :cw

Vimrc

  • Windows: %userprofile%\_vimrc
  • Linux: ~/.vimrc

Abaixo algumas sugestões de configuração.

AVISO: Várias das configurações abaixo podem ser substituídas por plugins, mas dispenso seu uso sempre que possível.

Ftplugin

Especificações para filetypes, ou seja, configurações que só são carregadas caso o arquivo aberto seja de um tipo específico (go, python, php e etc).
Elas podem ser criadas através de <runtimepath>/ftplugin/<nome-filetype>.vim. Caso um dos meus runtimepaths seja ~/dotfiles o caminho para o filetype php, ficaria ~/dotfiles/ftplugin/php.vim

PHP

" :make|cw
" THANKS: https://stackoverflow.com/a/7272248/9881278
" THANKS: https://stackoverflow.com/a/7193830/9881278
" THANKS: https://vim.fandom.com/wiki/Runtime_syntax_check_for_php
setl errorformat=Parse\ error:\ %m\ in\ %f\ on\ line\ %l,%-GErrors\ parsing\ %f,%-G%.%#
setl makeprg=php\ -ln\ %

setlocal suffixesadd=.php
Enter fullscreen mode Exit fullscreen mode

Go

" :make|cw
setl errorformat=%-G#%.%#
setl errorformat+=%-G%.%#panic:\ %m
setl errorformat+=%-GFAIL%.%#
setl errorformat+=%-Gexit%.%#
setl errorformat+=%-GPASS%.%#
setl errorformat+=%-Gok%.%#
setl errorformat+=can\'t\ load\ package:\ %m
setl errorformat+=%f:%l:%c:\ %m
setl errorformat+=%f:%l:\ %m
setl errorformat+=%*\\s%f:%l\ %m
setl errorformat+=%+A---\ FAIL:\ Example%.%#
setl errorformat+=%C%m

setl makeprg=go\ test

command! -nargs=1 GoDoc !go doc <args>
" interpreta package.Fun como um nome de arquivo
nnoremap K :GoDoc <c-r><c-f><cr>
Enter fullscreen mode Exit fullscreen mode

Plugins

Nativamente, o Vim 8 possui sistema de packages, precisando apenas clonar o projeto (plugin/package) em uma pasta específica:

  • %userprofile%\vimfiles\pack\vendor\start no Windows
  • ~/.vim/pack/vendor\start no Linux

O nome vendor é opcional, poderia ser qualquer outro

A pasta start é para packages que devem iniciar junto com o vim, caso queira adicionar manualmente (:packadd <pacote>) clone em opt ao invés de start

Existem outras formas de gerenciar plugins/packages como o vim-plug e minpac

Para gerar a doc auxiliar use uma das 3 opções:

  • Todas helptags:
:helptags ALL
Enter fullscreen mode Exit fullscreen mode
  • Somente as helptags de um vendor/start:
:helptags ~/vimfiles/pack/vendor/start/*/doc
Enter fullscreen mode Exit fullscreen mode
  • Somente de um plugin especifico (fugitive no exemplo) e pelo terminal:
vim -u NONE -c "helptags fugitive/doc" -c q
Enter fullscreen mode Exit fullscreen mode

Plugins que recomendo

  • Importantes:

  • Úteis:

    • startify: gerencia sessões/projetos/favoritos
    • vrc: cria rest client (postman, insomnia e etc) a partir de um arquivo .rest
  • Interessantes:

    • goyo: setup de leitura mais confortável
  • Específicos:

    • javascript: atualização de sintaxe/highlight para javascript
    • jsx pretty: atualização de sintaxe/highlight para react
    • tsuquyomi: desenvolvimento com typescript
    • markdown: atualização de sintaxe/highlight para markdown

Discussion (0)