Nim言語で開発するときのNeovimの設定

# はじめに
この記事は[Nimアドベントカレンダー2022](https://qiita.com/advent-calendar/2022/nim)9日目の記事です。

NeovimでNimを書くときのプラグイン設定メモを書き下します。

# Nimのインストール
choosenimというNimの仮想環境構築ツールがあります。 [^1] [^2]

```bash
$ curl https://nim-lang.org/choosenim/init.sh -sSf -o /tmp/init.sh &&\
    chmod +x /tmp/init.sh &&\
    /tmp/init.sh -y &&\
    rm /tmp/init.sh
$ export PATH="/home/u1and0/.nimble/bin:${PATH}"
$ choosenim -y stable
```

## nimlsp
Languageサーバー入れたいが、どうなっていたか...[^3]

```
$ sudo pacman -Syu --noconfirm go zeromq &&\
    go install github.com/mattn/efm-langserver@latest
$ nimble refresh &&\
    nimble -y install nimlsp inim jupyternim

```

> `pacman -S nim` でも一式入ってくる(nimgrep nimsuggest 等)
> `nimble install nimlsp` は用意されているが、pacmanでnimをインストールしたから？
> `nimlsp`のインストールに失敗する。
> `choosenim`のほうがいいのか。

## Jupyter Notebookと連携
Zeromqが必要らしい？[^4][^5]
> Instal Nim language sever & Repl
> Zeromq いる？？ jupyternimと一緒に同梱されているみたい
> Installing zmq@>= 1.2.1 & < 1.3.0
> Downloading https://github.com/nim-lang/nim-zmq using git
> Verifying dependencies for zmq@1.2.1
> Installing zmq@1.2.1
> Success: zmq installed successfully.


[^1]: [choosenimでnim環境構築](https://qiita.com/honeytrap15/items/2c7ebe20cb69df8c53c9)
[^2]: [choosenim](https://github.com/dom96/choosenim)
[^3]: [nimlsp](https://github.com/PMunch/nimlsp)
[^4]: [INim](https://github.com/inim-repl/INim)
[^5]: [JupyternotebookでNimを使い，グラフの可視化まで](https://qiita.com/SatoshiTerasaki/items/281c578c47f8ee497f3c)


# autocmd
autocmdの設定を書きます。

```vim:.config/nvim/autocmd.rc.vim
if executable("nim")
    augroup MyNimCmd
        " nimファイル開いたときにfiletypeを勝手にnimにしてくれないのでわざわざautocmdで書く
        autocmd BufNewFile,BufRead *.nim,*.nimble set filetype=nim
        " 保存するたびにフォーマッタによる整形
        autocmd BufWritePost *.nim,*.nimble !nimpretty %
        " 実行
        autocmd FileType nim command! -nargs=* NimRun :sp <Bar> term nim c -r <args> %
        " ビルド
        autocmd FileType nim command! -nargs=* NimBuild :sp <Bar> term nim c <args> %
        " ライブラリとしてビルド(Pythonとの連携なんかに使う)
        autocmd FileType nim command! -nargs=* NimBuildLib :!nim c --tlsEmulation:off --app:lib --out:%:t:r.so <args> %
        " Space + R で実行
        autocmd FileType nim nnoremap <buffer> <Leader>r :NimRun<CR>
        " Space + B でビルド
        autocmd FileType nim nnoremap <buffer> <Leader>b :NimBuild<CR>
    augroup END
endif
```

NimをインストールしたときにNim開発のサポートツール[^6]が入っているので、シンタックスハイライト以外のことは、autocmdの設定次第で何とかなりそうです。


[^6]: `~/.nimble/bin`下にあるこのへんだろうか nimgrep, nimlsp, nimpretty, nimsuggest


# deinプラグイン
deinでインストールするプラグインです。
tomlファイルで管理しています。

```toml:.config/dein/lazy.toml
# Nim lang plugins
[[plugins]]
repo = 'zah/nim.vim'
on_ft = ['nim', 'nimble']
if = '''executable('nim')'''''
hook_add = '''
fun! JumpToDef()
 if exists("*GotoDefinition_" . &filetype)
     call GotoDefinition_{&filetype}()
  else
    exe "norm! \<C-]>"
  endif
endf
" Jump to tag
nn <M-g> :call JumpToDef()<cr>
ino <M-g> <esc>:call JumpToDef()<cr>
'''

[[plugins]]
repo = 'prabirshrestha/asyncomplete.vim'
hook_add = '''
let g:asyncomplete_smart_completion = 1
let g:asyncomplete_auto_popup = 1
'''

[[plugins]]
repo = 'alaviss/nim.nvim'
on_ft = ['nim', 'nimble']
hook_add = '''
au User asyncomplete_setup call asyncomplete#register_source({
  \ 'name': 'nim',
  \ 'whitelist': ['nim'],
  \ 'completor': {opt, ctx -> nim#suggest#sug#GetAllCandidates(
  \     {start, candidates -> asyncomplete#complete(opt['name'], ctx, start, candidates)})}
  \ })
'''
```

1. 'zah/nim.vim'[^7]はシンタックスハイライトと自動インデント。
1. 'alaviss/nim.nvim'[^8]は補完。
1. 'prabirshrestha/asyncomplete.vim'[^9]は 'alaviss/nim.nvim'の動作に必要です。

Kでヘルプホバーが出てくれたり出てくれなかったりすることがあります。
やや補完が効きすぎで打ちにくいですが、 補完自体は速いので、ハマるとサクサク打てて気持ちが良いです。
Definitionはnimsuggestでジャンプしてくれるようですが、ジャンプしてくれてたりしてくれなかったりすることがあります。

各プラグインのREADMEをさっと読んだくらいで、細かくいじってはいません。


[^7]: https://github.com/zah/nim.vim
[^8]: https://github.com/alaviss/nim.nvim
[^9]: https://github.com/prabirshrestha/asyncomplete.vim