DEV Community

Cover image for NeoVim como IDE
Luis Enrique
Luis Enrique

Posted on • Edited on

NeoVim como IDE

Acredito que muitos de vocês já tenham ouvido falar sobre o vim, eu particularmente sempre tive medo de usa-lo ou de nunca conseguir sair dele. Mas hoje, iremos falar do NeoVim que nada mais é do que um fork do vim. E ai, bora ver como configuramos ele ?

spongebob


Instalando o NeoVim

Linux

sudo apt install neovim
Enter fullscreen mode Exit fullscreen mode

macOS

brew install neovim
Enter fullscreen mode Exit fullscreen mode

Windows

choco install neovim
Enter fullscreen mode Exit fullscreen mode

Configurando

Primeiramente precisamos instalar um plugin para poder instalar os demais plugins

what

Meio estranho eu sei, mas precisamos dele para poder gerenciar os demais plugins e bem, particularmente, eu uso o vim-plug e é o que iremos usar

curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
Enter fullscreen mode Exit fullscreen mode

Agora precisamos criar nosso arquivo de configuração do vim, para Linux e macOs, o diretorio de configuração fica em ~/.config/nivm/init.vim.

Adicionaremos o seguinte no arquivo:

call plug#begin()
"Seção do plugin
call plug#end()
"Seção de configuração
Enter fullscreen mode Exit fullscreen mode

Tema

Eu particularmente não uso um tema em especifico, vivo trocando de tema em tema mas se preferir irei deixar alguns

Ok mas como instalar ? Simples ! Lembra do código acima onde deixei marcado aseção de plugins ? Basta adicionar Plug 'user_github/nome_repo'
olha só:

Plug 'joshdick/onedark.vim'
Enter fullscreen mode Exit fullscreen mode

e ativar o tema da seguinte forma:

colorscheme onedark
Enter fullscreen mode Exit fullscreen mode

Confuso ? Deverá ficar da seguinte forma

call plug#begin()
PLug 'cseelus/vim-colors-lucid'
call plug#end()

solorscheme lucid
Enter fullscreen mode Exit fullscreen mode

Agora basta salvar o arquivo e abri-lo novamente.

Para que uma alteração seja visivel é preciso abrir e fechar o arquivo novamente

Uma vez configurado o tema, precisamos instala-lo, mas como ? Como sabemos o Vim tem uma seção de comandos onde pressionamos esc e : e ele abre a seção de comandos, basta digitar:

PlugInstall
Enter fullscreen mode Exit fullscreen mode

Legal mas é bem chato ficar slavando e saindo toda hora ne ?

Então saca só, vamos criar um atalho para isso mas antes precisamos definir um prefixo

let mapleader="\<space>"
nnoremap <leader>sv :source ~/.config/nvim/init.vim<CR>
Enter fullscreen mode Exit fullscreen mode

Agora basta salvar, fechar e abrir novamente pela última vez e após salvar o arquivo, para obter as atualizações é só pressionar space + sv e pronto o arquivo será atualizado.


Explorador de Arquivos

Claro, não é obrigatório ter um explorador de arquivos, mas é sempre bom poder um arquivo rápido

Plug 'preservim/nerdtree'
Plug 'ryanoasis/vim-devicons'
Plug 'Xuyuanp/nerdtree-git-plugin'
Enter fullscreen mode Exit fullscreen mode

Agora algumas configurações básicas:

set encoding=UTF-8
"nerdtree
let NERDTreeShowHidden = 1
let NERDTreeMinimalUI = 1
let NERDTreeDirArrows = 1
let NERDTreeIgnore = []
let NERDTreeStatusline = ''

"nerdtree-git-plugin
let g:NERDTreeIndicatorMapCustom = {
    \ "Modified"  : "✹",
    \ "Staged"    : "✚",
    \ "Untracked" : "✭",
    \ "Renamed"   : "➜",
    \ "Unmerged"  : "═",
    \ "Deleted"   : "✖",
    \ "Dirty"     : "✗",
    \ "Clean"     : "✔︎",
    \ 'Ignored'   : '☒',
    \ "Unknown"   : "?"
    \ }
Enter fullscreen mode Exit fullscreen mode

Pressionamos ctrl+b e teremos:

file_explorer_gif


Busca

Bom, não basta apenas ter um explorador de arquivos e um tema daora, sempre precisaremos procurar um arquivo e sair do terminal pra pocurar externamente não é o que queremos

Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'
Enter fullscreen mode Exit fullscreen mode

Um atalho pra ele: ctrl+p

nnoremap <c-p> :Files<cr>
Enter fullscreen mode Exit fullscreen mode

O legal do fzf é que se você tiver o The Silver Search ele se integra automaticamente, com a configuração a baixo basta apenas combinarmos as teclas ctrl+f

nnoremap <c-f> :Ag<cr>
Enter fullscreen mode Exit fullscreen mode

Abaixo uma breve demostração de como ficou

fzf_Ag


Intellisense

Desde quando comecei a usar o vim/Neovim eu uso o ale mas um tempo depois conheci o coc.nvim, mas neste caso iremos usar os dois, então bora lá, e claro, faze-los trabalhar juntos

Plug 'dense-analysis/ale'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Enter fullscreen mode Exit fullscreen mode

ale

"ale
let b:ale_fixers = ['prettier', 'eslint']
let g:ale_echo_msg_error_str = 'E'
let g:ale_echo_msg_warning_str = 'W'
let g:ale_echo_msg_format = '[%linter%] %s [%severity%]'
let g:ale_sign_error = '✘'
let g:ale_sign_warning = '⚠'
Enter fullscreen mode Exit fullscreen mode

coc

let g:coc_global_extensions = [
    \  'coc-snippets',
    \  'coc-emmet',
    \  'coc-html',
    \  'coc-css',
    \  'coc-json', 
    \  'coc-phpls',
    \  'coc-yaml',
    \  'coc-prettier',
    \  'coc-eslint',
    \  'coc-jedi',
    \  'coc-python',
    \   ]

nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
nnoremap <silent> K :call <SID>show_documentation()<CR>

autocmd CursorHold * silent call CocActionAsync('highlight')
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"

function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~# '\s'
endfunction

" Use <c-space> to trigger completion.
inoremap <silent><expr> <c-space> coc#refresh()
" Use <cr> to confirm completion, `<C-g>u` means break undo chain at current position.

" Coc only does snippet and additional edit on confirm.
inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
Enter fullscreen mode Exit fullscreen mode

Pronto ! Temos eles configurados, mas ainda falta fazer os dois trabalharem juntos, para isso basta acessar as configurações do coc com :CocConfig e colocar o seguinte

{
  "suggest.noselect": false,
  "coc.preferences.formatOnSaveFiletypes": [
    "javascript",
    "typescript",
    "javascriptreact",
    "typescriptreact",
    "css",
    "json",
    "yaml"
  ],
  "diagnostic.displayByAle": true,
  "coc.preferences.colorSupport": true,
  "prettier.eslintIntegration": true,
  "prettier.tabWidth": 2
}
Enter fullscreen mode Exit fullscreen mode

Bom, aqui configuramos algumas outras coisas além da integração do coc com o ale, agora toda vez que salvar o arquivo, ele irá formata-lo, definimos o tamanhos de espaçamento do tab, etc

lint


Go-to Definition

Como toda IDE, precisamos ir para a definição de 'X' método, variável e por ai vai. Como já temos o coc configurado, basta apenas pressionar gd(go to definition) e ctrl+o para retornar

gotodefinition


Terminal Integrado

E claro, não poderia faltar, sempre precisamos executar algum comando então aqui irei deixar uma configuração para podermos executar o terminal dentro do NeoVim

" Mude para o modo normal com o esc
tnoremap <Esc> <C-\><C-j>
" start terminal in insert mode
au BufEnter * if &buftype == 'terminal' | :startinsert | endif
function! OpenTerminal()
  split term://zsh
  resize 10
endfunction
nnoremap <c-j> :call OpenTerminal()<CR>

" use alt+hjkl para mover entre split/vsplit paineis
tnoremap <A-h> <C-\><C-n><C-w>h
tnoremap <A-j> <C-\><C-n><C-w>j
tnoremap <A-k> <C-\><C-n><C-w>k
tnoremap <A-l> <C-\><C-n><C-w>l
nnoremap <A-h> <C-w>h
nnoremap <A-j> <C-w>j
nnoremap <A-k> <C-w>k
nnoremap <A-l> <C-w>l
Enter fullscreen mode Exit fullscreen mode

Pronto ! Basta pressionarmos ctrl+j(vscode feelings)

terminal_integrado


Fim !

E ai curtiu ? Então passa lá no meu github e vê as demais configurações que tenho para o vim.

isso_e_tudo

Top comments (12)

Collapse
 
andreneji profile image
André Lima • Edited

[coc.nvim] Error on execute python script: request error nvim_comand - Vim(pyxfile):E319: No "python3" provider found.
Ao inicciar o NVIM é apresentada essa msg de erro.

No win10...
Instalei o python 2.7.18 e 3.9.1, e configurei o path nos dois.
Pelo erro apresentado parece que o NVIM não encontra os executaveis, é isso?
Por favor, como corrigo?

A fonte abaixo eu consigo instalar no win?
let g:ale_sign_error = '✘'
let g:ale_sign_warning = '⚠'

Collapse
 
thespanishguy profile image
Luis Enrique • Edited

Você esta tendo erro na hora de adicionar o host do python ?
let g:python3_host_prog='/usr/bin/python3' se for, tente dar uma olhada aqui

Sobre os símbolos do ale, acredito que sim, só se tiver usando o coc junto terá que integrar os dois

Collapse
 
andreneji profile image
André Lima • Edited

Failed to load python3 host.

Agora apresenta essa msg após Incluir:
let g:python3_host_prog = 'C:\Program Files\Python39\python3.exe'

Thread Thread
 
thespanishguy profile image
Luis Enrique • Edited

Você instalou o pynvim ? python3 -m pip install pynvim
Se sim, não sei o que possa ser não tentei configurar no windows ainda.
Andei pesquisando e achei esse gist mas não tenho certeza de que irá funcionar

Thread Thread
 
andreneji profile image
André Lima

Deu certo agora!!!

Declarei a variável global apontando p/ o diretório correto e os dois comandos de upgrade:

let g:python3_host_prog = 'C:\Program Files\Python39\python3.exe'
python3 -m pip install --user --upgrade pynvim
python -m pip install --user --upgrade pynvim

Comentei a linha:
let g:python3_host_prog = 'C:\Program Files\Python39\python3.exe'
e continou ok ainda.

O unico erro apresentado agora é p/ o ruby. Estou pesquisando.

Segue o :checkhealth

health#coc#check

  • OK: Environment check passed

  • OK: Javascript bundle build/index.js found

  • OK: Service started

health#nvim#check

Configuration

  • OK: no issues found

Performance

  • OK: Build type: RelWithDebInfo

Remote Plugins

  • OK: Up to date

health#provider#check

Clipboard (optional)

  • OK: Clipboard tool found: win32yank

Python 2 provider (optional)

  • INFO: g:python_host_prog is not set. Searching for python in the environment.
  • INFO: Multiple python executables found. Set g:python_host_prog to avoid surprises.
  • INFO: Executable: C:\Python27\python.EXE
  • INFO: Other python executable: C:/Python27/python
  • INFO: Other python executable: /python
  • INFO: Python version: 2.7.18
  • INFO: pynvim version: 0.4.2
  • OK: Latest pynvim is installed.

Python 3 provider (optional)

  • INFO: Using: g:python3_host_prog = "C:\Program Files\Python39\python3.exe"
  • INFO: Executable: C:\Program Files\Python39\python3.exe
  • INFO: Python version: 3.9.1
  • INFO: pynvim version: 0.4.2
  • OK: Latest pynvim is installed.

Ruby provider (optional)

  • INFO: Ruby: ruby 2.7.2p137 (2020-10-01 revision 5445e04352) [x64-mingw32]
  • WARNING: neovim-ruby-host not found.
    • ADVICE:
      • Run gem install neovim to ensure the neovim RubyGem is installed.
      • Run gem environment to ensure the gem bin directory is in $PATH.
      • If you are using rvm/rbenv/chruby, try "rehashing".
      • See :help |g:ruby_host_prog| for non-standard gem installations.

Node.js provider (optional)

  • INFO: Node.js: v14.15.3
  • INFO: Neovim node.js host: C:\Users\anlima\AppData\Roaming\npm\node_modules/neovim/bin/cli.js
Thread Thread
 
thespanishguy profile image
Luis Enrique

Boa ! Já tentou rodar gem install neovim ? Acredito que o procedimento seja o mesmo, declarar o path do executavel do ruby: let g:ruby_host_prog='path/to/exec'

Thread Thread
 
andreneji profile image
André Lima

Tentei. Quando tento executar o gem install neovim, dá erro tbm.

PS C:\Users\anlima> gem install neovim
ERROR: Could not find a valid gem 'neovim' (>= 0), here is why:
Unable to download data from rubygems.org/ - timed out (rubygems.org/specs.4.8.gz)

Collapse
 
tashima42 profile image
Pedro Tashima

Curti bastante a configuração, principalmente a parte do terminal, muito obrigado pelo post!
Aqui ta minha config: github.com/Tashima42/install-scrip...
Estou usando o neovide no momento.

Collapse
 
thespanishguy profile image
Luis Enrique

Fico feliz que tenha gostado do post, espero que lhe ajude de alguma forma
Valeu !!

Collapse
 
rodryggoshell profile image
Rodrigo Martins

eu não consigo, que merda velho eu queria tanto usar esse como meu editor principal.

Collapse
 
thespanishguy profile image
Luis Enrique

Qual o problema ?

Collapse
 
rodryggoshell profile image
Rodrigo Martins

eu não consigo, criar as pastas.