Neovim - Workflow para Java, C# e JS/TypeScript (Atualização com Neovim 0.8 e LSP)
Published: 2023-01-01 17:32:55

Em 2020 escrevi um [post](https://dev.to/wesleyegberto/neovim-workflow-para-java-c-e-js-typescript-36ja) sobre workflow no Neovim 0.4.

Aqui atualizo aquele post com o meu setup onde utilizo as novas features do Neovim e do LSP.

Print do meu PDE (Personal Development Environment):

![](img/neovim-workflow-basico-atualizado-lsp-1.png)

## Introdução

Neovim é um projeto que de acordo com o repositório no [Github](https://github.com/neovim/neovim), busca refatorar agressivamente o Vim para que seja possível:

* Simplificar manutenção e encorajar contribuição;
* Dividir o trabalho entre múltiplos desenvolvedores;
* Habilitar UI avançada sem modificações no core;
* Maximizar extensibilidade.

A maior vantagem que percebi foi a comunidade provendo diversas interfaces e extensões que facilitam a transição de uma IDE para o Neovim.

Para introdução e motivação completa acesse a [Wiki no Github](https://github.com/neovim/neovim/wiki/Introduction).

A partir do Neovim 0.6, com o lançamento da engine de LSP, ficou muito mais fácil e amigável configurar o Neovim para usar com as principais linguagens utilizadas no mercado.

## Instalação

Para instalação basta seguir os passos descritos [aqui](https://github.com/neovim/neovim/wiki/Installing-Neovim) onde é disponibilizados os pacotes e comandos para instalação em diversos SOs.

Todos os comandos do Vim funcionam normalmente no Neovim visto que é um fork da versão Vim 7.4.160 e que vem sendo atualizado constantemente.

## Plugins

Alguns plugins que uso:

* [PAQ](https://github.com/savq/paq-nvim): gerenciador de plugins, permite instalar/atualizar os plugins através da referência do github (ex.: `paq {'savq/paq-nvim'}`), vale a pena adicionar uma referência dele mesmo para permitir atualizações automáticas. Também existe o [Packer](https://github.com/wbthomason/packer.nvim) que é bem utilizado.
* [Telescope](https://github.com/nvim-telescope/telescope.nvim): plugin que permite fazer fuzzy find de qualquer coisa (arquivos, arquivos git, documentos LSP, comandos, helptags, etc), possui diversas extensões que permite adicionar novas funcionalidades (eu utilizo algumas onde [disponibilizo na configuração](https://github.com/wesleyegberto/dotfiles/blob/master/nvim/lua/plugins.lua#L65-L76)).
* [Galaxyline](https://github.com/glepnir/galaxyline.nvim): plugin para exibir algumas informações no rodapé do painel (como branch, linguagem, tamanho do arquivo, etc).
* [Vim-numbertoggle](https://github.com/jeffkreeftmeijer/vim-numbertoggle): plugin para facilitar a navegação relativa com `j` e `k`.
* [Hop](https://github.com/phaazon/hop.nvim): plugin para facilitar e acelerar a navegação no arquivo similar ao EasyMotion mas com algumas melhorias.
* [vim-visual-multi](https://github.com/mg979/vim-visual-multi): plugin para habilitar multiplos cursores igual ao `Ctrl+D` do VS Code.
* LSP:
  * [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig), [mason.nvim](https://github.com/williamboman/mason.nvim) e [mason-lspconfig](https://github.com/williamboman/mason-lspconfig.nvim): plugin para facilitar as configurações das engines LSP para utilizar nas linguagens de programação desejadas.
  * [lspkind-nvim](https://github.com/onsails/lspkind-nvim): plugin para adicionar ícones nas entidades de LSP (classe, método, snippet, etc) igual ao VS Code.
* [which-key](https://github.com/folke/which-key.nvim): plugin que permite configurar um menu com os comandos disponíveis conforme digitamos nossas keybindings, facilita na memorização das keybindings conforme vamos utilizando.

## Workflow

Com o LSP do Neovim e os plugins de autoconfiguração, todas as linguagens que utilizado podem ser configurada e customizada facilmente.

Com o LSP é possível configurar os atalhos para todas as ações disponíveis nos LSP (go to definition, go to implementation, find references, find type, action, etc), assim não será preciso nenhum outro plugin para configurar essas ações (como era necessário no Coc.nvim).

Para facilitar a experiência no Neovim e trazer aquele feeling de IDE utilizo as extensões abaixo:

* [nvim-tree.lua](https://github.com/kyazdani42/nvim-tree.lua): plugin com explorador lateral para permitir navegar na estrutura de diretório do projeto. O plugin [nvim-web-devicons](https://github.com/kyazdani42/nvim-web-devicons) adiciona os ícones dos principais tipos de arquivos na visualização do explorador.
* autocomplete e snippets:
  * utiliza a engine nvim-cmp para configurar os snippets nos projetos, ela permite ser extendida com snippets de outros plugins e das engines de LSP, também é possível configurar nossas próprias snippets seguindo a configuração do VS Code.
    * [nvim-cmp](https://github.com/hrsh7th/nvim-cmp): engine de autocomplete;
    * [cmp-nvim-lsp](https://github.com/hrsh7th/cmp-nvim-lsp): integração com LSP;
    * [LuaSnip](https://github.com/L3MON4D3/LuaSnip): engine de snippets, suporta o formato do VS Code (é possível copiar os arquivos de snippets do VS Code e utiliza diretamente no Neovim);
    * [cmp-luasnip](https://github.com/saadparwaiz1/cmp_luasnip): integração do LuaSnip com nvim-cmp;
    * [friendly-snippets](https://github.com/rafamadriz/friendly-snippets): coleção de snippets de várias linguagens e frameworks.
* git:
  * utilizo alguns plugins para facilitar a integração com o Git (símbolos no arquivo para informar se houve adição/remoção/alteração na linha, git blame na linha, diff view e conflitos);
  * plugins:
    * [vim-fugitive](https://github.com/tpope/vim-fugitive): disponibiliza os comandos Git para executar direto do Neovim;
    * [vim-gitgutter](https://github.com/airblade/vim-gitgutter): símbolos no arquivo com o status do arquivo no Git;
    * [nvim-blame-line](https://github.com/tveskag/nvim-blame-line): informações do Git blame direto na linha do arquivo;
    * [diffview.nvim](https://github.com/sindrets/diffview.nvim): diff view direto no Neovim;
    * [git-conflict.nvim](https://github.com/akinsho/git-conflict.nvim): marca os conflitos do arquivo.

Para facilitar minha vida nas tarefas rápidas que faço pelo terminal (como docker, git, npm, etc) utilizo o [vim-floaterm](https://github.com/voldikss/vim-floaterm) que permite executar diversas tarefas através de popups.

Abaixo segue as combinações de plugins que utilizo para cada linguagem de forma que tenha sempre autocomplete, snippets, code checking e builds:

* Java: mason.nvim já configura todas as ferramentas necessárias, é preciso apenas se atentar na versão da linguagem que é utilizada no [JDT do Eclipse](https://www.eclipse.org/jdt/) (atualmente requer o JDK 17). Também é possível utilizar o plugin [nvim-jdtls](https://github.com/mfussenegger/nvim-jdtls) que possibilita configuração completa do JDT (diferentes versões da JDK, XML de formatação, DAP para debug e testes). [Aqui](https://github.com/wesleyegberto/dotfiles/blob/master/nvim/ftplugin/java.lua) tem a configuração completa do JDT que estou utilizando no momento.
* Javascript/TypeScript: mason.nvim já configura todas as ferramentas necessárias, também é possível utilizar o plugin [typescript.nvim](https://github.com/jose-elias-alvarez/typescript.nvim) que configura o LSP e provê fatures adicionais (como decompilação).
* C#: mason.nvim já configura as ferramentas necessárias, mas também é possível utilizar o plugin [Omnisharp-vim](https://github.com/OmniSharp/omnisharp-vim) que permite uma maior customização e integração com Omnisharp.

## Dotfiles

Além desses existem diversos outros plugins para facilitar navegação, edição e suporte de linguagens e highlight de sintaxes.

Para ver todos os plugins e configurações que utilizo acesse meu [Dotfiles no Github](https://github.com/wesleyegberto/dotfiles).