Neovimの勧め

## 初めに
今、エディタはVSCodeの一人勝ち状態ですよね
かつてはvim vs emacsやatom、Sublime Text、Eclipse、NetBeans、　Innteli　J、PHP Stormと開発者の数だけ異なった開発環境があるような印象さえ持っていました
（ここでは、エディタとIDEをどちらもコードを書くためのツールとして一纏めにします）

私がよく書くのはPythonで、続いてTypeScript、時折golangといったところです
Yaml、JSON、TOMLといった設定系を書くことも多く有ります

PythonならInnteli J、TypeScriptならVSCodeといった感じで適当に使い分けています
ちょっとしたきっかけでNeovimを使い始め、それの使い勝手が大変良く、もうこれで良いんじゃないかと思ったので、こちらをPostします

### VimとNeovimってどう違うの？
よく分かっていません
Vimの良いところはそのままに、メインブランチに取り込まれまれるのが難しそうなモダンな機能を盛り込んだものぐらいの認識です
新しい方が良いのではと思い、Neovimを使っています
→探してみたところ、この[記事](https://vim.blue/what-is-neovim/)で解説されていました

### 色々設定しないといけないんでしょ？
そうです、けど難しいものではありません

設定は大きく分けて、Vim自体な設定とプラグインの設定があります

基本的な設定は、適当に検索して丸々Copy&Pasteして、違和感あるところを変更していけば良いかと思います
プラグインの設定は、プラグインのサイト(Github)にサンプル設定が提示されていますので、まずはそれをCopy&Pasteすれば大丈夫です

## 設定とかプラグインとか
### 設定
init.luaを使っています
ディレクトリ構成は下のようにしています(なお、nvim-treeのスナップショットです)
Vim自体の設定をbase.luaとkeymap.luaに分けて、プラグインの設定はpluginディレクトリの置いています

![スクリーンショット 2023-10-20 12.00.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6748/70ba3571-0dda-d699-1614-095a1e96199f.png)

```base.lua
vim.scriptencoding = "utf-8"
vim.opt.encoding = "utf-8"
vim.opt.fileencoding = "utf-8"

vim.opt.backup = false
vim.opt.writebackup = false
vim.opt.number = true
vim.opt.hidden = true

vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.autoindent = true
vim.opt.smartindent = true
vim.opt.expandtab = true

vim.opt.signcolumn = "yes"
vim.opt.laststatus = 2

vim.cmd 'colorscheme tokyonight-storm'

vim.opt.mouse = 'a'
vim.g.mapleader = " "

vim.opt.updatetime = 300
vim.opt.signcolumn = "yes"
```

ポイントは、`vim.g.mapleader = " "` でしょうか
プラグインの呼び出しとかをspace + 任意のキーに割り当てられるので、いい感じに作業を進められます

keymapは下のようにしています
Cocの内容を含めるとかなり長くなるので、一部の掲載です

```keymap.lua
local builtin = require('telescope.builtin')

local keyset = vim.keymap.set
keyset('n', '<leader>f', builtin.find_files, {})
keyset('n', '<leader>g', builtin.live_grep, {})
keyset('n', '<leader>b', builtin.buffers, {})

keyset('n', '<leader>h', '<C-w>h')
keyset('n', '<leader>l', '<C-w>l')
keyset('n', '<leader>j', '<C-w>j')
keyset('n', '<leader>k', '<C-w>k')

keyset('n', '<leader>n', ':NvimTreeFocus<CR>')

keyset("n", "[g", "<Plug>(coc-diagnostic-prev)", {silent = true})
keyset("n", "]g", "<Plug>(coc-diagnostic-next)", {silent = true})

keyset("n", "gd", "<Plug>(coc-definition)", {silent = true})
keyset("n", "gy", "<Plug>(coc-type-definition)", {silent = true})
keyset("n", "gi", "<Plug>(coc-implementation)", {silent = true})
keyset("n", "gr", "<Plug>(coc-references)", {silent = true})
```
`<space>-b`でバッファの一覧をインクリメンタルに絞り込めますし、Windowの移動も`<space>-[hljk]`で出来ます
これらの設定で、自分がやりたい作業を直観的に出来るようになりました

###  _プラグインマネージャー_ 
プラグインのインストールを良い感じにやってくれます

luaベースだと、[packer.nvim](https://github.com/wbthomason/packer.nvim)がよく出てきますが、<font color="red">**unmaintained**</font>になっていますので、[lazy.nvim](https://github.com/folke/lazy.nvim)を使っています

### (個人的に)必須パッケージ
#### [Coc.Nvim](https://github.com/neoclide/coc.nvim)
補完とか、関数の定義元に移動したり、参照元を探したりしてくれるプラグイン
これがなければ、Nvimを使おうとは思いませんでした
このパッケージプラスcoc extensionsで幸せになれます

#### [nvim-tree](https://github.com/nvim-tree/nvim-tree.lua)
ファイラーです
ファイルに関する作業がvim内で完結出来るのは大きな利点かと思います
使い方が分からない場合は、`g?` で一覧が表示されるので、そちらを検索すれば問題なく作業を進められます

#### [telescope.nvim](https://github.com/nvim-telescope/telescope.nvim)
Emacsでいうanythingです（知っている方いらっしゃいますかね？）
特定ディレクトリとか作業中のファイルの一覧を出し、インクリメンタルに絞り込んでくれます
作業中ファイルの移動ストレスがかなり軽減されます

### お好みで

#### [FTerm](https://github.com/numToStr/FTerm.nvim)
ターミナルを表示したり、裏面に隠したりしてくれるプラグインです
コマンドを打って戻っての作業コストが激減します
[toggleterm](https://github.com/akinsho/toggleterm.nvim)等もっと多機能なプラグインもありますが、私の場合はこれで十分でした

#### [vim-commentary](https://github.com/tpope/vim-commentary)
良い感じにコメントアウトしてくれます

#### [nvim-cursorline](https://github.com/yamatsum/nvim-cursorline)
カーソル下と同じ変数等を教えてくれるプラグインです

#### [nvim-lualine](https://github.com/nvim-lualine/lualine.nvim)
画面下部のステータスラインをいい感じにしてくれるプラグインです
作業中のファイルが分からなくなったため、初めはステータスラインをセットしていましたが、こちらの方がテーマや配置をえらべるので使うようになりました

#### [notice.nvim](https://github.com/folke/noice.nvim)
:をうった後に出てくるコマンド入力欄を画面の真ん中に出したりするプラグインです
目線の移動が少なくて済む点や、罫線に色がついていたりして、少し楽しくなります


#### [Tokyo Night](https://github.com/folke/tokyonight.nvim)
今使っているカラースキームはこちらになります
[vimcolorschemes](https://vimcolorschemes.com/)から好みで選べば良いかと思います


### GUI
Vimを使うのに、ターミナルを起動して、vimコマンドを打ってというのは、繰り返すのを日々繰り返すのはアレですので、ラップしてくれるGUIを探しました
何種類か試した結果、[Neovim Qt](https://github.com/equalsraf/neovim-qt) が起動が早く、フリーズすることもなかったので、こちらを利用しています
私の環境はMacなので、brewでinstallしました。Dockに追加してそちらから起動しています


### 終わりに
使い始めてそんなに日数が経っていませんし、新たなプラグインを導入したり、設定を変えたり、やっぱりIntelli Jサイコーとか言って乗り換える可能性もありますが、今のところ気持ちよく使っています
もし、(Neo)vimの利用を検討されている方がいらっしゃり、その一助となれば嬉しく思います