Ir para o conteúdo

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 :

vim1.png

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 :

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 :

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/
Criadas as primeiras linhas do no ~/.vim/vimrc/ :

"[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 ;
vim2.png

Ativando powerline fonts no ~/.vim/config/layout.vim com as linhas abaixo:

"[AirLine]
let g:airline_powerline_fonts = 1

vim3.png

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 :

vim4.png

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
Lembrando que pra que isso aí em cima funcione, é importante que se tenha os arquivos de sintaxe em ~/.vim/filetype/.

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
Se isso crescer, pode ser que mereça um nerdtree-config.vim ...

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 :

vim5.png