🛠

Neovimを使ったモダンな開発環境を構築した話

2022/12/28に公開

前回に引き続き、開発環境の見直しをしていて、今回は以前から気になっていたNeovimを導入してみました。
導入するプラグインなどめちゃくちゃ悩んだので結構時間はかかってしまったのですが、結果結構使いやすいものができて感動しています。

https://neovim.io/

まだまだカスタマイズしきれていない部分もありますが、最終的にはこんな見た目になっています。

この環境を構築する上で導入したプラグインや詰まったことなどご共有できればと思います。
(ターミナル(Alacritty),zsh,tmuxのtrue color対応は前回前々回で完了した前提です。)

はじめに

(本題と全く関係ないので、読み飛ばしていただいて大丈夫です)
もともとメインのエディタとしてVimを使っていたのですが、ここ一年半くらいはVSCodeをメインで利用しています。
なのですが、キーバインドはVimのものを使いたいので、VSCodeVimという拡張機能を利用していました。
この拡張機能便利で愛用していたのですが、ときどきキーバインドが効かなくなることがあったり、やはりどうしてもマウスを使わなきゃいけない場面がでてきたり(カスタマイズすればできるのかもですが、そこに労力を割くほどの熱意が持てない...)して、Vimに戻したいなぁとはちょこちょこ思っていました。
という背景もあり、年末のこのタイミングで試してみるかってことでやってみました。

Neovimのinstall

本家にそってhomebrewでinstallしました。
正常にinstallされたのが確認できたあと、Neovimをvimコマンドで起動できるように.zshrcにaliasを追加しました。

alias vim="nvim"

Plugin manager

Plugin managerはdein.vimを採用しました。packerと悩んだのですが、luaに全く触れたことがなかったので、ちょっとハードル高いなと感じたのと、もともとVimではdein.vimを利用していたのもあったのでこちらにしました。

https://github.com/Shougo/dein.vim

なれてきたらpackerも試してみたいです。

install

dein.vim自体のinstallは公式 の通り、.config/nvim/init.vimに下のコードをコピペして完了でした。(2022/12執筆時点での話ですので、導入される際は公式を確認されることをおすすめします)

let $CACHE = expand('~/.cache')
if !isdirectory($CACHE)
  call mkdir($CACHE, 'p')
endif
if &runtimepath !~# '/dein.vim'
  let s:dein_dir = fnamemodify('dein.vim', ':p')
  if !isdirectory(s:dein_dir)
    let s:dein_dir = $CACHE . '/dein/repos/github.com/Shougo/dein.vim'
    if !isdirectory(s:dein_dir)
      execute '!git clone https://github.com/Shougo/dein.vim' s:dein_dir
    endif
  endif
  execute 'set runtimepath^=' . substitute(
        \ fnamemodify(s:dein_dir, ':p') , '[/\\]$', '', '')
endif

Plugin

あまり数は多くないのですが、導入したプラグインをご紹介します。

coc.nvim

https://github.com/neoclide/coc.nvim

vimをまるでVSCodeのようにしてくれる拡張機能です。
installすると補完、定義ジャンプ、エラー表示などいろいろ使えるようになります。
installはdein.vimの場合、init.vimに下の行を追記します。

call dein#add('neoclide/coc.nvim', {'merged': 0, 'rev': 'release'})

また、:CocInstallのコマンドもしくはconfigを直接編集して、使いたい拡張機能やLSPをinstallする必要があります。
例:

:CocInstall coc-json coc-tsserver

keymappingなどの設定は一旦READMEのものをそのまま使っています。(後でみなおしたい)
高機能なので、ゆっくり使い倒して行きたいです。

nightfox

https://github.com/EdenEast/nightfox.nvim

めっちゃ良い感じのcolor schemaです。特に設定はいじっていないです。
installはdein.vimの場合、init.vimに下記を追記します。

call dein#add('EdenEast/nightfox.nvim')
...
colorscheme firefox

詰まったこと

nightfoxと関係があったかはわかりませんが、僕の環境ではここで少しつまりました。
何度Neovimを立ち上げ直してもcolorschemeが反映されず、cannot find colorschemeというエラー出てしまっていました。
~/.cache/dein/repos/github.comを確認しに行くとリポジトリは存在しているので、cacheか?と思っていたら、こちらの記事を見つけました。
vimでもdeinを使っていたので、そことバッティングしたのか...?など思いつつ、原因は結局わからずなのですが、記事の通り

:call dein#recache_runtimepath()

を実行して解決しました。

nvim-tree

https://github.com/nvim-tree/nvim-tree.lua

つづいてはnvim-treeというファイラーです。
vimのときはNERDTreeというファイラーを使っていたのですが、名前もちかくて、今の所操作感もNERDTreeに似ている?と思っています。(NERDTreeとnvim-tree以外使ったことないのですがw)
Fernもちょっと気になるからあとで試してみようかなと思っています。

installはinit.vimに下記を追記します。

call dein#add('nvim-tree/nvim-tree.lua')
call dein#add('nvim-tree/nvim-wev-devicons')

nvim-web-deviconsはファイラーのアイコンなどに使われているようです。

余談ですが、僕はCtrl-Nでファイラーがトグルするように設定しました。

nmap <C-n> :NvimTreeToggle <CR>

lualine

https://github.com/nvim-lualine/lualine.nvim

お次はステータスラインです。
Themeも多く用意されており見た目もかなりカスタマイズできそうです。(僕はデフォルトのまま使っています。)

installはinit.vimに下記を追記です。


call dein#add('nvim-lualine/lualine.nvim')

telescope

https://github.com/nvim-telescope/telescope.nvim

fuzzy finderです。特に設定はしていませんが、デフォルトでも普通に使えています。

call dein#add('nvim-telescope/telescope.nvim', {'rev': '0.1.x'})

Rust

最近はRustのお勉強をしているので、それ用の設定もしました。
まず、rust.vimをinstallします。

https://github.com/rust-lang/rust.vim

call dein#add('rust-lang/rust.vim')

つづいて、rust-analyzerをhomebrew経由でinstallします。

https://github.com/rust-lang/rust-analyzer

brew install rust-analyzer

最後にcoc-rust-analyzer をinstallします。

https://github.com/fannheyward/coc-rust-analyzer

:CocInstall coc-rust-analyzer

これでRustを書くと、rust-analyzerが動いて補完や型の表示などができるようになりました🙌

おわりに

なんかやりきった風に記事を書いてしまっているのですが、Key mappingとかまだ全然納得いっていなくて、これから少しずつ育てていきたいなと思います。
正直昨日環境構築が終わって、上にかいたpluginたちもまだ全然使いこなせていない&理解できていないいない部分も多いので、これからガシガシ使い倒していきたいです。
この記事がNeovim導入してみたい!という方の助けになれば幸いです。

参考:
https://zenn.dev/yano/articles/vim_plugin_top_10
https://qiita.com/mziyut/items/05e35977ef44de030d9d
https://zenn.dev/ymgn____/scraps/13b28214ebd19f

Discussion