OpenBSD : OpenBSD e VIM
1 - OpenBSD e VIM
Desde os meus primeiros anos no Slackware eu tenho usado o VIM como editor padrão. Ele é a versão do Visual Editor ( VI ) com esteróides, que se tornou um dos editores de texto mais utilizados no universo UNIX. E não me levem a mal: eu acho o Emacs sensacional, mas prefiro o estilo de trabalhar do VIM ( que é muito mais orientado a letras e árvores de decisão ).
Assim como o Emacs, o VIM possui um universo de extensões e recursos, permitindo que você realize tarefas que desafiam a imaginação. Junte isso a estar disponível para uma variedade de plataformas :
- Agenda
- Amiga
- Cygwin
- i/OS
- Linux
- MS-DOS
- Macintosh
- MorphOS
- OS/2
- Open VMS
- Plan9/9Front ( não oficial )
- QNX
- Symbian ( não oficial )
- Unix
- Windows
Isso sem contar nos ports do VI pra sistemas mais simples ( como esse do MSX... animal! ). Não tem como não gostar, ta ligado? (=
O VIM possui uma linguagem de scripts ( vimscript/VimL ) que pode ser utilizada para customizar e otimizar o editor às necessidades do usuário. Além da VimL, se compilado com o devido suporte, o VIM pode extender a várias outras linguagens de script : Lua, Perl, Python e Ruby. Num passeio rápido pelo shopping center é possível achar toda sorte de extensões ( plugins ) para o editor.
Existem vários utilitários para o VIM ( plugins também ) que ajudam a gerenciar a instalacão, configuração e remoção das extensões. No entanto, neste artigo e nos demais eu vou procurar realizar as instalações de scripts e extensões da forma mais "manual" possível. O intuito disto é além de o mais didático possível, poder também criar um ambiente agnóstico.
1.1 - Instalando o VIM
Na minha mudança para o OpenBSD ( 6.5 beta ), uma das primeiras coisas que tive que providenciar foi o bendito editor. E não foi difícil, pois já está presente nos pacotes do OpenBSD :
pkg_add -vim vim
Nisto me foi apresentada a lista a seguir :
a 0: <None> 1: vim-8.1.1048-gtk2 2: vim-8.1.1048-gtk2-lua 3: vim-8.1.1048-gtk2-perl-python-ruby 4: vim-8.1.1048-gtk2-perl-python3-ruby 5: vim-8.1.1048-gtk3 6: vim-8.1.1048-gtk3-lua 7: vim-8.1.1048-gtk3-perl-python-ruby 8: vim-8.1.1048-gtk3-perl-python3-ruby 9: vim-8.1.1048-no_x11 10: vim-8.1.1048-no_x11-lua 11: vim-8.1.1048-no_x11-perl-python-ruby 12: vim-8.1.1048-no_x11-perl-python3-ruby 13: vim-8.1.1048-no_x11-python 14: vim-8.1.1048-no_x11-python3 15: vim-8.1.1048-no_x11-ruby Your choice:
Eu escolhi a versão com suporte a python3 (14), já que provavelmente vai ser a linguagem de script para extensão que mais encontrarei extensões e por ser um pacote menor e mais leve. Caso eu quisesse um pacote mais completo, a opção 12 seria a ideal. Não considero nenhuma com GTK porque acho uma baita ostentação, além do terminal ser o meu melhor amigo.
1.2 - Quanto custa
O pacote que usei tem as seguintes bibliotecas linkadas :
% ldd $(which vim) /usr/local/bin/vim: Start End Type Open Ref GrpRef Name 1a595000 3a5b2000 exe 2 0 0 /usr/local/bin/vim 01d08000 21d0b000 rlib 0 2 0 /usr/lib/libm.so.10.1 06e51000 26e55000 rlib 0 1 0 /usr/lib/libcurses.so.14.0 0d82a000 2d82d000 rlib 0 2 0 /usr/local/lib/libiconv.so.6.0 05f2c000 25f2f000 rlib 0 2 0 /usr/local/lib/libintl.so.6.0 0cc92000 2cced000 rlib 0 1 0 /usr/local/lib/libpython3.6m.so.0.0 0d4b7000 2d4ba000 rlib 0 2 0 /usr/lib/libpthread.so.26.1 052df000 252e2000 rlib 0 2 0 /usr/lib/libutil.so.13.0 07e7c000 27e8d000 rlib 0 1 0 /usr/lib/libc.so.95.0 0f9cb000 0f9cb000 ld.so 0 1 0 /usr/libexec/ld.so
O que tamanho básico do vim é pouco mais de 20M. Relativamente grande, concordo.
% du -csh /usr/local/share/vim/ /usr/local/bin/vim* /usr/local/man/man1/vim* 21.4M /usr/local/share/vim/ 2.5M /usr/local/bin/vim 0B /usr/local/bin/vimdiff 4.0K /usr/local/bin/vimtutor 16.0K /usr/local/man/man1/vim.1 2.0K /usr/local/man/man1/vimdiff.1 2.0K /usr/local/man/man1/vimtutor.1 23.9M total
Com o comando vim
:
1.3 - Extras : pacotes e distribuições
Existem alguns gerenciadores de extensão ( pacotes ) para o VIM, desenvolvidos por terceiros. Alguns mais conhecidos são :
- apt-vim : https://github.com/egalpin/apt-vim
- Dein.vim : https://github.com/Shougo/dein.vim
- minpac : https://github.com/k-takata/minpac
- NeoBundle : https://github.com/Shougo/neobundle.vim
- Pathogen : https://github.com/tpope/vim-pathogen
- Plug : https://github.com/junegunn/vim-plug
- VAM : https://github.com/MarcWeber/vim-addon-manager
- volt : https://github.com/vim-volt/volt
- Vundle : https://github.com/VundleVim/Vundle.vim
Entretanto a partir do VIM 8 foi introduzido um gerenciador nativo de pacotes, bem mais simples que os citados acima, cuja única função é gerenciar o que você baixa.
Há também, para os mais preguiçosos, as "distribuições" de configuração do vim, que consiste em um pacote contendo vários plugins e configurações visando entregar um determinado perfil de ambiente para se usar o VIM :
- dot-vimrc : https://github.com/humiaozuzu/dot-vimrc
- Evervim : https://github.com/LER0ever/EverVim
- fisa-vim-config : http://fisadev.github.io/fisa-vim-config
- Janus : https://github.com/carlhuda/janus
- SpaceVIM : https://github.com/SpaceVim/SpaceVim
- spf13-vim : https://github.com/spf13/spf13-vim
- volt : https://github.com/vim-volt/volt
- WebVim : https://webvim.org
1.4 - Tutorial
O VIM instala também um tutorial o vimtutor
. Basta chamar no terminal.
2 - DYI : Faça você mesmo
O arquivo global de configuração do vim é o /etc/vimrc. Normalmente é usado pelos mantenedores do pacote de instalação na plataforma, mas também é possível a configuração por usuário ( na verdade é o mais comum ).
No OpenBSD o arquivo global fica em /usr/local/share/vim/vimrc. No pacote instalado o conteúdo do /usr/local/share/vim/vim81/defaults.vim é carregado por padrão, já fornecendo uma gama razoável de scripts provendo syntax hilight, suporte a mouse, etcetera et al. Para maiores detalhes verifique a versão com vim --version
.
2.1 - Diretórios e arquivos iniciais
A configuração pessoal ( per user ) dá-se pelo arquivo ~/.vimrc ou ~/.vim/vimrc. Como pretendo elaborar uma estrutura pessoal, eu vou preferir a segunda opção :
mkdir ~/.vim/ ;
cp /usr/local/share/vim/vim81/defaults.vim ~/.vim/
"[Defaults]"""""""""""""""""""""""""""""""""""""""' source ~/.vim/defaults.vim
Nota
Mesmo com o ~/.vim/vimrc criado, o defaults.vim do sistema ainda vai ser carregado. O que pra mim não é exatamente uma coisa ruim. Caso queira desabilitar o carregamento do defaults.vim, adicione let skip_defaults_vim=1
no ~/.vim/vimrc.
2.1.1 - Estrutura de diretórios
Depois de instalado o VIM, vamos realizar algumas modificações básicas, criando os diretorios que serão extendidos no vimrc :
mkdir -p ~/.vim/{after,autoload,colors,compiler,config,doc,ftdetect,ftplugin,indent,pack,plugin} ; touch ~/.vim/config/{colorscheme,filetype,keybinds,layout,misc,mouse,spell}.vim ;
E adicionei as seguintes linhas ao ~/.vim/vimrc :
"[Keybinds]""""""""""""""""""""""""""""""""""""""" source ~/.vim/config/keybinds.vim "[Colorscheme]"""""""""""""""""""""""""""""""""""" source ~/.vim/config/colorscheme.vim "[Mouse]"""""""""""""""""""""""""""""""""""""""""" source ~/.vim/config/mouse.vim "[Filetype]""""""""""""""""""""""""""""""""""""""" source ~/.vim/config/filetype.vim "[Spelling]""""""""""""""""""""""""""""""""""""""" source ~/.vim/config/spell.vim "[Layout]""""""""""""""""""""""""""""""""""""""""" source ~/.vim/config/layout.vim "[Miscelaneous]""""""""""""""""""""""""""""""""""" source ~/.vim/config/misc.vim
Isso me dará o seguinte layout :
/home/wolf/.vim |-- after |-- autoload |-- colors |-- compiler |-- config | |-- colorscheme.vim | |-- filetype.vim | |-- keybinds.vim | |-- layout.vim | |-- misc.vim | `-- mouse.vim |-- doc |-- ftdetect |-- ftplugin |-- indent |-- pack |-- plugin `-- vimrc
Onde :
- after : Carregados depois dos arquivos em plugins/, servem como complementos, workarounds ou hacks ;
- autoload : Scripts que serão carregados automaticamente ( além do vimrc ), mas somente quando forem necessário : são carregados, mas não necessariamente executados ;
- colors : Temas ( color schemes ) que serão disponibilizados ;
- compiler : Arquivos que terão configurações pertinents a compiladores ;
- config : Diretório onde deixarei minhas configurações separadas por tópico, que serão seletivamente chamadas pelo ~/.vim/vimrc. Opção MINHA ;
- doc : Onde poderá conter as documentações dos plugins ;
- ftdetect : Também carregados automaticamente, mas para automações de acordo com os tipos de arquivos (filetype) ;
- ftplugin : Plugins que serão lidos quando você chamar
set filetype=foo
, podendo ser um arquivo foo.vim ou um diretório foo/ contendo vários plugins ; - indent : Similar ao ftplugin, só que relacionado às configurações de identação do tipo de arquivo referido ;
- pack : Diretório usado pelo gerenciador de pacotes nativo do VIM ( A partir do 8. Veja a seção 2.1.2 deste documento ) ;
- plugin : Script que serão executados toda vez que o VIM for iniciado ;
- vimrc : O arquivo de configuração maior, que chama todos os outros.
A lista completa recomendada pode ser obtida digitando :h runtimepath
:
global {not in Vi} This is a list of directories which will be searched for runtime files: filetype.vim filetypes by file name |new-filetype| scripts.vim filetypes by file contents |new-filetype-scripts| autoload/ automatically loaded scripts |autoload-functions| colors/ color scheme files |:colorscheme| compiler/ compiler files |:compiler| doc/ documentation |write-local-help| ftplugin/ filetype plugins |write-filetype-plugin| indent/ indent scripts |indent-expression| keymap/ key mapping files |mbyte-keymap| lang/ menu translations |:menutrans| menu.vim GUI menus |menu.vim| pack/ packages |:packadd| plugin/ plugin scripts |write-plugin| print/ files for printing |postscript-print-encoding| spell/ spell checking files |spell| syntax/ syntax files |mysyntaxfile| tutor/ files for vimtutor |tutor|
2.1.2 - Pack
O diretório ~/.vim/pack é o diretório destinado aos pacotes que você irá baixar. Nele, cada pacote tem sua estrutura individual de pacotes.
Nota
Lembrando que o pacote no dialeto oficial do VIM é um diretório que contém um ou mais plugins.
A estrutura interna, de acordo com :h packages
deve ser :
pack/foo/README.txt pack/foo/start/foobar/plugin/foo.vim pack/foo/start/foobar/syntax/some.vim pack/foo/opt/foodebug/plugin/debugger.vim
Onde dentro do pacote foo :
- start/foobar/plugin/bar.vim : Carrega automaticamente, define comandos. Pode conter um ou mais plugins.
- start/foobar/autoload/foo.vim : Carregado quando o comando 'foo' é utilizado.
- start/foobar/doc/foo.txt : Arquivo de ajuda do pacote 'foo'.
- start/foobar/doc/tags : Tags de assistência.
Em :h packages
há uma lista mais detalhada.
2.2 - Aparência
Como o VIM é um editor visual que faz forte uso das capacidades do console, um bom conjunto de fontes, terminal, charset, scripts e plugins tornam a experiência muito melhor. Com um conjunto de boas fontes ( como a Tewi que instalei ) já é possível usufruir de um VIM não apenas bonito, mas extremamente funcional.
E uma das forma mais comuns de fazer isso é usando o Powerline. Acontece que acho o Powerline bem pesado pra um computador mais humilde ( como o meu T60 ). É por isso que vou instalar o Airline, uma alternativa mais leve e tão bonita quanto, além de ser muito customizável.
2.2.1 - Airline
Instalei a versão direto do repositório do github :
git clone https://github.com/vim-airline/vim-airline \ ~/.vim/pack/vim-airline/start/vim-airline ;
Ativando powerline fonts no ~/.vim/config/layout.vim com as linhas abaixo:
"[AirLine] let g:airline_powerline_fonts = 1
2.2.2 - Tema
O pacote do OpenBSD já vem com um conjunto de temas em /usr/local/share/vim/vim81/colors/. Na internet é possível achar facilmente vários temas, que integram bem com arquivos de sintax highlight ( como o Dracula e o Monokai ).
Eu baixei o monokai :
wget https://raw.githubusercontent.com/crusoexia/vim-monokai/master/colors/monokai.vim \ -O /home/wolf/.vim/colors/monokai.vim ;
E adicionei as seguintes linhas no ~/.vim/config/colorscheme.vim :
"[theme]""""""""""""""""""""""""""""""""""""""""" "{Monokai} colorscheme monokai "[monokai]"""""""""""""""""""""""""""""""""""""""" "{Overwrite Colors} highlight Normal ctermfg=white ctermbg=black "{Truecolor Support} "set termguicolors "{256Color} set t_Co=256 "{Italic Fonts Term} let g:monokai_term_italic = 1 """""""""""""""""""""""""""""""""""""""""""""""""""
2.2.3 - Layout
Configurei o frame que divide a tela e a numeração de linhas adicionando ao ~/.vim/config/layout.vim :
"[Frames]""""""""""""""""""""""""""""""""""""""""" "{Fillchars} set fillchars+=vert:\ "[Numbering]"""""""""""""""""""""""""""""""""""""" "{LineNumber} set number
Resultado até agora :
2.3 Comportamento
Além da aparência é possível configurar alguns comportamentos iniciais do seu VIM. No meu caso há customizações básicas de teclas, detecção de tipos de arquivo e codificação de caracteres.
2.3.1 - Unicode
Já tivemos alguns ajustes prévios para eyecandy, como italico em certos terminais e uso de caracteres de escape unicode ( airline status bar ). Por garantia eu adicinei no ~/.vim/config/misc.vim
"[Encoding]""""""""""""""""""""""""""""""""""""""" set encoding=utf-8
2.3.2 - Keybinds
Coisas que configuro no meu ~./vim/config/keybinds.vim.
Eu costumo colar conteúdo dentro do terminal com frequência, mas o VIM às vezes quer indentar. Então pra evitar isso eu uso :set paste
para colar e depois volto com o :set nopaste
. Para evitar ficar digitando isso eu uso :
"[Keybinds]""""""""""""""""""""""""""""""""""""""" "{set paste/nopaste} set pastetoggle=<F2>
2.3.3 - Tipos de arquivos
Em ~/.vim/config/filetype.vim :
"[Filetype]""""""""""""""""""""""""""""""""""""""" filetype on "{Load Plugin} filetype plugin on "{Load indent} filetype indent on
3 - Melhorando Ainda Mais
Já com esse setup básico vou adicionar algumas extensões que tornam a minha vida bem melhor.
3.1 - NERDTree
Eu seu que tem o tal do netrw e tudo o mais. Só que particularmente eu ainda acho muto cheio de problemas, pricinpalmente quando tive que lidar com diretórios e arquivos de swap do VIM. Por isso vamos de NERDTree :
git clone https://github.com/scrooloose/nerdtree.git \ ~/.vim/pack/nerdtree/start/nerdtree ;
Agora mande um :NERDTree
no VIM e um menu lateral na esquerda vai mostrar o $PWD atual.
Agora vamos configurar o VIM para iniciar o NERDTree caso não se passe nenhum arquivo para o editor. Também aproveitei para configurar comportamentos como : fechar o NERDTree quando se abre um arquivo, encerrar o VIM quando o NERDTree for o único painel e outras canalhices. Para isso vou adicionar as linhas abaixo no ~/.vim/config/layout.vim :
"[NERDTree]""""""""""""""""""""""""""""""""""""""" "{Start if NOARG} autocmd StdinReadPre * let s:std_in=1 autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif "{Find as VIM buffer} nnoremap <silent> <Leader>v :NERDTreeFind<CR> "{Quit on OpenFile} let NERDTreeQuitOnOpen = 0 "{Quit if NERDTreeIsOnlyPane} autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif "{Use Minimal Chars} let NERDTreeMinimalUI = 0 let NERDTreeDirArrows = 0 "{Show Dotfiles} let NERDTreeShowHidden=1
3.2 - Supertab
O VIM possui o recurso de autocomplete com ^p
ou ^n
. No entanto o SuperTab torna isso mais simples apenas ao pressionar \<tab>. Para instalar manualmente :
git clone https://github.com/ervandew/supertab.git \ ~/.vim/pack/supertab/start/supertab/ ;
E é isso. Na próxima vez que usar o VIM, o \<tab> vai completar usando o texto já existente como recurso. Caso tenha extensões como YouCompleteMe, a coisa fica ainda melhor ( isso iremos abordar em outra hora ).
4 - Resultado final
Segue :