[[Vim]]から[[Neovim]]に移行してみた記録。
## 経緯
[[Neovim]]を使う必要がなかったので[[Vim]]を使い続けていたが、逆に[[Vim]]を使い続ける理由もないので[[Neovim]]に移行してみようと思う。
サーバーのような共有環境では自分の設定を使うことはないし、自分の設定が使える環境なら[[Vim]]ではなく[[Neovim]]で環境整備できるため、その点も問題ない。
## [[Neovim]]インストール
[[Scoop]]でインストールする。
```console
scoop install neovim
```
バージョンは0.8.3。
## 設定ファイルの作成
基本的に[[Vim]]の設定が使えるという噂なので、[[vimrc|.vimrc]]を[[init.vim]]に書き換えてみる。
```console
cd ~/AppData/Local/
mkdir nvim
cd nvim
cp ~/.vimrc init.vim
```
## [[Vim]]で使っているプラグインのインストール
`nvim`コマンドで起動すると[[vim-plug]]関連のエラーが大量に出る。[[vim-plugをWindowsにインストール]]する。
```console
iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |`
ni "$(@($env:XDG_DATA_HOME, $env:LOCALAPPDATA)[$null -eq $env:XDG_DATA_HOME])/nvim-data/site/autoload/plug.vim" -Force
```
[[Neovim]]を起動して`PluginInstall`すればOK。
## [[coc.nvim]]のインストール
標準よりは少し重くなるけど、ほとんどのケースで利用できる便利プラグイン。設定もシンプルであり、[[LSP]]と戦う日々を思い出す必要もない。
```lua
" VSCode like
Plug 'neoclide/coc.nvim', {'branch': 'release'}
```
[[coc extensions]]のインストール。他にも気になるやつをいれればOK。
```console
:CocInstall coc-json coc-tsserver coc-css coc-yaml coc-rust-analyzer coc-sh coc-prettier coc-pyright
```
[[init.vim]]で設定をカスタマイズ。
```vim
" 定義に移動
nmap <silent> <C-]> <Plug>(coc-definition)
" 呼び出し元に移動
nmap <silent> <C-j>h <Plug>(coc-references)
" 実装に移動
nmap <silent> <C-j>i <Plug>(coc-implementation)
" 配下の定義を表示
nnoremap <silent> <M-s> :call CocActionAsync('doHover')<CR>
" 前後のエラーや警告に移動
nmap <silent> <M-k> <Plug>(coc-diagnostic-prev)
nmap <silent> <M-j> <Plug>(coc-diagnostic-next)
" Enterキーで決定
inoremap <silent><expr> <CR> coc#pum#visible() ? coc#pum#confirm()
\: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"
" quick fix (code actionの方がいいのでコメントアウト)
" nmap <M-CR> <Plug>(coc-fix-current)
" code action
nmap <silent> <M-CR> <Plug>(coc-codeaction-cursor)
" Find symbol of current document
nnoremap <silent><nowait> <C-j>o :<C-u>CocList outline<CR>
" Search workspace symbols
nnoremap <silent><nowait> <C-j>s :<C-u>CocList -I symbols<CR>
```
詳細は以下。
- [[coc.nvimでファイルを保存したら自動フォーマットをかける]]
- [[coc.nvimで定義に移動]]
- [[coc.nvimで呼び出し元に移動]]
- [[coc.nvimでカーソル配下をホバー表示]]
- [[coc.nvimでカーソル配下が指す関数の引数情報(ヒント)を表示]]
- [[coc.nvimでEnterキーで候補を決定]]
- [[coc.nvimで前後のエラーや警告に移動]]
- [[coc.nvimでクイックフィックス(quick fix)]]
- [[coc.nvimでシンボルのリネーム]]
- [[coc.nvimで補完候補(suggestions)にアイコンを表示]]
## [[Vim]]の不要設定削除
### カーソル形状
[[Neovim]]は設定しなくてもカーソル形状がモードによって変化するため削除。
```vim
" Insertモードのときカーソルの形状を変更
" let &t_SI="\<CSI>5\ q"
" let &t_SR="\<CSI>7\ q"
" let &t_EI="\<CSI>2\ q"
" https://github.com/vim/vim/issues/6576 が解決したら上記の代わりにコメントアウトを解除する
let &t_ti.="\e[2 q"
let &t_SI.="\e[5 q"
let &t_EI.="\e[2 q"
let &t_te.="\e[0 q"
```
## インストールしようとしてやめたもの
### [[telescope.nvim]]
```vim
Plug 'nvim-lua/plenary.nvim'
Plug 'nvim-telescope/telescope.nvim', { 'tag': '0.1.1' }
noremap <C-j>e <cmd>Telescope oldfiles<CR>
noremap <C-j>f <cmd>Telescope git_files<CR>
```
以下の問題があり解決できなかったので[[ctrlp.vim]]を使い続ける。それで十分だし。
- [[📝telescope.nvimの検索UIが閉じるのが遅い]]
- [[📝telescope.nvimを挿入モードで起動したい]]
#### #2023/03/17 追記
[[📜init.vimからinit.luaへ移行する]]と、上記問題は2つとも解決した。原因は不明...。[[init.lua]]の設定は以下の通り。
```lua
-- telescope
Plug 'nvim-lua/plenary.nvim'
Plug('nvim-telescope/telescope.nvim', { tag = '0.1.1' })
local actions = require("telescope.actions")
require("telescope").setup {
defaults = {
mappings = {
i = { ["<esc>"] = actions.close },
n = { ["q"] = actions.close },
},
layout_strategy = 'vertical'
}
}
local builtin = require('telescope.builtin')
vim.keymap.set('n', '<C-j>f', builtin.find_files, {})
vim.keymap.set('n', '<C-j>e', builtin.oldfiles, {})
```
#### #2023/03/21 追記
`:Telescope oldfiles`が最近利用した順には並んでくれなかったので、新たに[[telescope-frecency.nvim]]を導入。[[init.lua]]にも以下を追加。
```lua
require('telescope').load_extension('frecency')
local home = os.getenv("USERPROFILE")
vim.g.sqlite_clib_path = home .. "/dll/sqlite3.dll"
key('n', '<C-j>e', ':Telescope frecency<CR>', {silent = true, noremap = true})
```
## 移行してよかったこと
- [[Windows Terminal]] + [[PowerShell]]の環境で表示がバグることがなくなった
## その他 #2023/03/25 追記
- [[📜Neovimのプラグインマネージャーをvim-plugからpacker.nvimに移行してみた]]