VimからNeovimへの段階的移行(#10)

はじめに

VimmerVimからNeovimに移行したいと考えるきっかけは色々あると思います。

私は半年ほど前からVimを利用していますが、もっとシンタックスハイライトをよりカラフルにしたい」「カッコよくカーソル移動したい」といった欲望がありました。

nvim-treesitter/nvim-treesitter: Nvim Treesitter configurations and abstraction layerより引用

https://neovide.dev/assets/AnimatedCursor.gif
Features - Neovideより引用

一方で、それらを実現するプラグインがNeovimにしか対応していないことは少なくありません。

本記事では、VimからNeovimへの段階的移行とその魅力について紹介します。 移行方法の記事は既に多く存在していますが、あくまでも著者視点で楽しくお伝えできれば幸いです。

1. VimとNeovimの違い

多くの初心者が、「VimとNeovimって何が違うの?」という疑問を持っていると思います。

違いを説明しようと思いましたが、文章よりも断然分かりやすい動画を見つけてしまったので共有します。

youtu.be

Neovim公式ドキュメントにもいくつかFeaturesとして掲載されています。

個人的には、

  • 設定やプラグインLuaで書ける
  • LSPの組み込みサポート
  • モダンなターミナル機能(カーソルの形状やイベントフォーカス、bracketed-pasteなど)
  • ASTを生成する構文解析エンジン(Tree-sitter)による高速で正確なシンタックスハイライト
  • tmuxのようにUIをデタッチしてエディタセッションを実行し続けることが可能

などが印象的でした。

技術書典17で購入した『いまからはじめる Vim コマンド実践入門』でも、「カスタマイズしなくても使いやすい」という点でNeovimから使い始めることが推奨されていました。ただし、VimとNeovimそれぞれの優位性が挙げられていたので気になる方はぜひ読んでみてください。

私もVim初心者のときに真っさらな.vimrcからスタートして、快適にコーディングできるようになるまでかなりカスタマイズが必要でした。

Neoという接頭辞のイメージに引っ張られがちですが、NeovimがVim初心者にとって有力な選択肢となっているのは間違いなさそうです。

2. VimからNeovimへの移行

いきなりNeovimに完全移行するのはハードルが高いと感じるかもしれません。

今回は段階的移行を目指して、公式ドキュメントのTransitioning from Vimをやってみます。

$ brew install neovim
$ nvim

素のNeovimが起動する

次に、公式ドキュメント通りに「Neovimコマンドでinit.vimを作成」→「init.vimに内容追加」→「Neovimの再起動」を行います。

Neovimを使ってNeovimに移行しているのが面白いです。

適当なPythonファイルを編集した時の様子

Vimの設定をNeovimに引き継ぐことができました。私はvim-plugを利用していたので、Neovimを再起動してから:PlugInstallすることでエラーは全て消えました。

NeovimでもVimscriptで設定を書くことができます。~/.config/nvim/init.vimをよく見ると、Vimのruntimepathを指定したり、Vimの設定ファイルを実行したりしていることが分かります。

一旦は実家のような安心感を得ることができましたが、せっかくNeovimなのでLuaサポートの恩恵を受けたいですし、モダンなプラグインマネージャーにも変更したいです。

~/.config/nvim/init.luaを作成するにあたって、公式ドキュメントに以下のような記載があります。

Using Lua files on startup

Nvim supports using init.vim or init.lua as the configuration file, but not both at the same time. This should be placed in your config directory, which is typically ~/.config/nvim for Linux, BSD, or macOS, and ~/AppData/Local/nvim/ for Windows. Note that you can use Lua in init.vim and Vimscript in init.lua, which will be covered below.

init.viminit.luaの両方を同時には利用できませんが、init.luaでVimscriptを利用できるようです。

やや強引ですが、以下のようにinit.lua内でVimコマンドを実行することもできます。

$ mv ~/.config/nvim/init.vim ~/.config/nvim/_init.vim
$ echo "vim.cmd('source ~/.config/nvim/_init.vim')" > ~/.config/nvim/init.lua

ここから少しずつLuaの設定を増やしていく方向性もあり得るかもしれません。

私は結局、真っさらなNeovimから始めることにしました。理由は、Neovimで快適にコーディングできるようになるまでは使い慣れたVimでも十分だと思ったからです。

3. lazy.nvimのインストール

プラグインマネージャーとしてVimではvim-plugを利用していましたが、高速な起動とパワフルなUI、そして何よりNeovim専用のプラグインマネージャーであることに憧れていたのでlazy.nvimに移行します*1

github.com

lazy.nvimは公式ドキュメントのInstallationAdding Pluginsにしたがってインストールしました。

:Lazyコマンドで表示されるUIが綺麗

lazy.nvimをインストールするついでに、プラグインとしてdashboard-nvimダッシュボード)とmonokai-pro.nvim(カラースキーマ)を追加しました。テンションが上がるのでオススメです。

現時点でのディレクトリ構成は以下の通りです。

$ tree ~/.config/nvim
/Users/azuma/.config/nvim
├── init.lua
├── lazy-lock.json
└── lua
    ├── config
    │   └── lazy.lua
    └── plugins
        ├── dashboard.lua
        └── monokai-pro.lua

4 directories, 5 files

lua/plugins/*.luaプラグインが、lua/config/lazy.luaで以下のようにインポートされています。

-- Setup lazy.nvim
require("lazy").setup({
  spec = {
    -- import your plugins
    { import = "plugins" },
  },
  -- 省略
})

プラグインが大量にある場合は、ファイル分割のおかげで見通しが良くなりそうです。

公式ドキュメントにもありますが、specに{ "LazyVim/LazyVim", import = "lazyvim.plugins" }と追記すると、LazyVimというlazy.nvimのためのセットアップが手に入ります。

www.lazyvim.org

LazyVimを利用すると一瞬で本格的なIDEになりますが、プラグインを1つ1つ追加するワクワク感が無くなりそうだったのでやめました。

Neovim盆栽を楽しみます。

4. nvim-treesitterのインストール

冒頭でもお伝えしたように、Vimシンタックスハイライトが足りないと感じる場面があります。

Vim(左)とVS Code(右)で同じGoのファイルを開いたときの比較

私の.vimrcではsyntax enableシンタックスハイライトを有効化し、coc.nvimのためのGoのLSPであるcoc-goが詳細なシンタックスハイライトを提供してくれているはずです。それでもVSCodeにカラフルさで劣ってしまいます。

Neovimではnvim-treesitterというプラグインを利用できます。

github.com

そもそもTree-sitterはパーサー(構文解析器)を自動生成するツールであり、インクリメンタルな分析ができるC言語で書かれたライブラリです。nvim-treesitterはTree-sitterのインターフェースをNeovimで利用するためのシンプルで簡単な方法を提供してくれているそうです。

WikiのInstallation#lazy.nvimにしたがってインストールします。

このタイミングでLSP周りの設定も必要になりますが、以前利用していたcoc.nvimではなくNeovimのBuitin LSPを利用することにしました。慣れていない私には設定が少し複雑でしたが、以下の記事が基本的な内容から解説してくれていて非常に参考になりました。

zenn.dev

:LspInstall goplsでGoのLSPをインストールした後、シンタックスハイライト確認します。

NeovimでGoのファイルを開いたときの様子

NeovimでもVS Codeと同じくらいカラフルなシンタックスハイライトが付与されるようになりました。

5. Neovideのインストール

待ちに待ったカーソル移動アニメーションを実現する日が来ました!(知人に「それ要らなくない?」と言われました…これは浪漫です)

実はNeovideにはそれ以外にも本当に多くの機能があります。

neovide.dev

Smooth ScrollingとAnimated Windowsは特に便利そうです。

左がNeovim、右がNeovideです。

スムーズなスクロールはもちろんですが、もっと驚いたのは解像度です。Neovideではすごく鮮明にテキストが表示されています。

これからはalias vim=neovideとしたうえで、さらにカスタマイズも楽しんでいきたいです。

まとめ

本記事ではVimからNeovimに段階的に移行する方法を簡単に紹介し、いくつか印象的なプラグインGUIをインストールしてみました。

まだまだNeovimに入れるべきプラグインはたくさんありますが、盆栽がある程度落ち着いたらオススメのプラグインをまとめようと思います。

参考までに私のdotfilesリポジトリのURLも掲載しておきます。

github.com

*1:プラグインマネージャーの変遷については以下の記事が詳しいです。プラグインマネージャーの歴史と新世代のプラグインマネージャー dpp.vim