[pt-BR] Flutter no NeoVim
Tags: vim, flutter, dart
Published: 2020-11-06 00:26:57

Neste post descrevo como configurei meu vim para trabalhar com a linguagem Dart e o framework Flutter.

## Suporte a linguagem
O básico é instalar o suporte a linguagem. Com isso já temos 'syntax highlighting' e 'indentation'.

{% details ❕instalação %} Para mais detalhes sobre como instalar os plugins acesse o repositório do gerenciador [vim-plug](https://github.com/junegunn/vim-plug). {% enddetails %}


Para instalar o [dart-vim-plugin](https://github.com/dart-lang/dart-vim-plugin):

```
Plug 'dart-lang/dart-vim-plugin'
```

## Setup & Configurações

Se você já utilizou o VSCode, sabe que existe um plugin ~ eu diria que obrigatório ~ para integrar o editor ao Flutter. Para obter os mesmos benefícios no vim utilizei o [coc.vim](https://github.com/neoclide/) com a extensão `coc-flutter`.

### CoC.vim & coc-flutter

Primeiro, instale o coc.vim:

```
Plug 'neoclide/coc.nvim', {'branch': 'release'}
```

Em seguida, instale a extensão para o Flutter.

```
:CocInstall coc-flutter
```

<hr />

Você pode configurar o `Ctrl+Space` para abrir as janelas de sugestões.

![](https://user-images.githubusercontent.com/1223798/98305417-929e2c00-1fa0-11eb-9b96-c7fe8fc9c220.png)

Configuração:

```
inoremap <silent><expr> <TAB>
      \ pumvisible() ? "\<C-n>" :
      \ <SID>check_back_space() ? "\<TAB>" :
      \ coc#refresh()
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

inoremap <silent><expr> <c-space> coc#refresh()
```

Assim as sugestões aparecem ao digitar também e com o `<TAB>` se navega nas opções.

> [Confira no README do projeto um exemplo de configuração](https://github.com/neoclide/coc.nvim/blob/master/README.md#example-vim-configuration)

### Navegar para definição:

```
nmap <silent> gf <Plug>(coc-definition)
```

![(coc-definition)](https://user-images.githubusercontent.com/1223798/98306288-481daf00-1fa2-11eb-8bbf-66bd7b921e74.gif)

#### Ações de código
Com este recurso você consegue executar ações no seu código como adicionar, remover ou extrair um widget para uma classe ou método.

Seguindo o README, configuramos desta forma:

```
xmap <leader>a  <Plug>(coc-codeaction-selected)
nmap <leader>a  <Plug>(coc-codeaction-selected)
```

Assim você pode utilizar o comando `<leader>a` no modo visual/seleção ou `<leader>aw` se estiver no modo normal. Para receber apenas sugestões de imports ou organizar o arquivo você pode utilizar `<leader>aap`.

![`<leader>aw`](https://user-images.githubusercontent.com/1223798/98306593-e742a680-1fa2-11eb-90f7-a76b486be978.gif)

### Flutter: Run, Reload, Restart & DevLog
A extensão `coc-flutter` habilita os comandos do Flutter SDK e assim podemos listar os comandos:

```
CocList --input=flutter commands
```

Você pode configurar alguns atalhos:

```
nmap <leader>fc  :CocList --input=flutter commands<CR>
nmap <leader>fe  :CocCommand flutter.emulators<CR>
nmap <leader>fr  :CocCommand flutter.run<CR>
nmap <leader>fq  :CocCommand flutter.dev.quit<CR>
nmap <leader>fh  :CocCommand flutter.dev.hotRestart<CR>
nmap <leader>fl  :CocCommand flutter.dev.openDevLog<CR>
```

Os comandos `flutter.dev.*` só aparecem após a execução dos comandos `run` ou `attach`.

## Meu nvim config
Para ficar como exemplo, vou deixar aqui o meu `init.vim`. 
{% github enriquesaid/nvim-config %}

Qualquer coisa estamos ai nos comentários 😄
Um abraço!