肩から力を抜いてvimからneovimへ移行する方法

## あらすじ

1. お、このプラグイン良さげだな
1. なんだ neovim オンリーかよ
1. じゃあ neovim 使うか

みたいな時に、難しく考えず簡単に移行する方法と置き換え先となるプラグインを、段階的に解説します。

neovim 移行とか設定の記事って、どうしても極限まで設定を詰めまくった後の『オレの最強設定。こんぐらいしないと neovim 使う意味ないですよね？』なものが多い気がしたので。

別にいいじゃん、所詮ツールなんだし気軽に使おうよ。

## 基礎知識

### init.vim

neovim の設定ファイル。vim で言うところの`vimrc`にあたるファイル

`~/.config/nvim/`に作成することで、記述された設定を neovim に読み込ませることができる。

### init.lua

neovim の設定ファイル。`init.vim`は vim スクリプトで記述するのに対して、こちらは lua スクリプトで記述する。

配置場所は`init.vim`と同じく`~/.config/nvim/`となる。

`init.vim`と`init.lua`は、両方同時に配置することはできない。

## フェーズ０：neovim インストール

パッケージマネージャーを使う方法もあるけど、バージョンが古かったりするので、公式リポジトリの Releases からパッケージをダウンロードする方法をおすすめします。

現在であれば、ver. 7.2 がおすすめ。最新安定版は 8.0 ですが、プラグインとの相性もあったりするので、少し古いバージョンを選択した方が詰まったりしないと思います。

GitHub (neovim) : https://github.com/neovim/neovim

## フェーズ１：vimrc を init.vim に全コピ

vim の設定ファイルである`.vimrc`は、vim スクリプトで設定が記述されていますが、この点は neovim の設定ファイルである`init.vim`も同様なので、基本的には同じ設定を引き継ぐことが可能です。

今まで育ててきた`.vimrc`の内容を`~/.config/nvim/init.vim`にそのまま全てまるっとコピーしてやりましょう。

この際、プラグインマネージャーを使っている場合は、neovim で使用する場合の導入方法に従って再導入してください。

私の場合は`vim-plug`を使用しているので、neovim 向けのコマンドを実行するだけで完了します。

GitHub (vim-plug) : https://github.com/junegunn/vim-plug

コピペが完了したら`nvim`コマンドで neovim を起動してみましょう。

初回のみプラグインが足りないとか色々文句を言われると思いますが、プラグインインストールコマンドを叩けば、基本的には全て動くようになる筈です。

## フェーズ２：プラグインを neovim 向けに交換

### init.vim への lua スクリプト記述

neovim にしか対応していないプラグインや、動作が高速化されたり改善されたりしたプラグインを、既存のものと置き換える感じで導入していきます。

> 例： `NERDTree` => `nvim-tree`

この際、neovim 用のプラグインマネージャーである [packer](https://github.com/wbthomason/packer.nvim)　の使用を推奨されている場合がありますが、無理に導入する必要は全くありません。今までのプラグインマネージャーで必要十分です。

実際、neovim 用のプラグインであっても、大抵は以下のように複数のインストール方法が提示されているかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569749/f4fa9096-39a6-153f-b5ca-00ee242b4a70.png)

※例：[nvim-tree](https://github.com/nvim-tree/nvim-tree.lua)の場合

問題となってくるのは、設定が以下のように vimscript で記述されていない場合です。

```init.lua
-- examples for your init.lua

-- disable netrw at the very start of your init.lua (strongly advised)
vim.g.loaded = 1
vim.g.loaded_netrwPlugin = 1

-- empty setup using defaults
require("nvim-tree").setup()

-- OR setup with some options
require("nvim-tree").setup({
  sort_by = "case_sensitive",
  view = {
    adaptive_size = true,
    mappings = {
      list = {
        { key = "u", action = "dir_up" },
      },
    },
  },
  renderer = {
    group_empty = true,
  },
  filters = {
    dotfiles = true,
  },
})
```

上記の設定例は`nvim-tree`から引用していますが、これは`lua`言語によって記述されており、`init.vim`に同じ内容を記述してもエラーが発生してしまいます。

本来であれば、この設定は、例の中にもあるように`init.lua`という lua スクリプトで作成された設定ファイルに記述するのですが、lua スクリプトによる設定の記述方式は従来の物と大きく違うため、置き換えには時間がかかります。その上、neovim は`init.vim`か`init.lua`のどちらかしか使用できない仕様となっているため、必要な部分だけを`init.lua`に記述するといった使い方はできません。

なので、こうします。

```init.vim
lua require("nvim-tree").setup()
```

頭に`lua`をつけてやると、その行は一時的に lua スクリプトとして解釈され、実行されるのです。

これにより、`init.lua`を使用することなく、`init.vim`に lua 言語で設定を書き込むことが可能となります。

なお、複数行に渡って　lua スクリプトを記述する場合は、以下の通りに記載します。

```init.vim
lua << EOF
require('nvim-treesitter.configs').setup({
      ensure_installed = { 'python', 'javascript', 'html', 'css', 'bash', 'lua', 'vim', 'c' },
      auto_install = true,
      highlight = {enable = true,},
      rainbow = {enable = true, extended_mode = true, max_file_lines = 999,
      colors = { "#5f87d7", "#af87ff", "#00af87"}
      }
    })
EOF
```

lua スクリプトの最初と最後を`lua << EOF`と`EOF`で囲むことで、複数行の lua スクリプトによる設定を記述できるようになります。

まとめると、neovim のプラグイン記述は、次のように記載することになります。

```init.vim
" プラグインの読み込み
call plug#begin()
  Plug 'kyazdani42/nvim-tree.lua'
call plug#end()

" プラグインの有効化
lua require('nvim-tree').setup()
```

その他、設定などは、プラグインを公開しているリポジトリなどを参考にしてみてください。

### 新規導入／置き換え先プラグイン

新しく導入したり、置き換えることで色々と改善されたプラグインに絞って紹介

#### floaterm => toggleterm

[akinsho/toggleterm.nvim](https://github.com/akinsho/toggleterm.nvim)

neovim 上でターミナルを起動する。動作が安定した（気がする）。

#### scrollbar

[Xuyuanp/scrollbar.nvim](https://github.com/xuyuanp/scrollbar.nvim)

バッファ上にスクロールバーを表示する。

ドラッグ＆ドロップで移動することはできないものの、サイズの大きいファイル内で現在位置を知るために使う事が可能

#### LSP 関連

`vim-lsp`から neovim のビルトイン LSP へ移行

移行時の参考にした記事は[こちら](https://github.com/xuyuanp/scrollbar.nvim)が一番わかりやすかった。

#### indentLine => indent-blankline

[lukas-reineke/indent-blankline.nvim](https://github.com/lukas-reineke/indent-blankline.nvim)

インデントを可視化してネストされたコードの可読性を向上させる。

VSCode などに実装されている『現在のネストの範囲をハイライトする』機能を実装する場合の設定例は、次の通り。

```init.vim
lua << EOF
require("indent_blankline").setup({
         context_patterns = {
          "body", "class", "function", "method", "block", "list_literal", "selector",
          "^if", "^table", "if_statement", "while", "for",  "type", "var",
          "import", "declaration", "expression", "pattern", "primary_expression",
          "statement", "switch_body"
        },
          space_char_blankline = " ",
          show_end_of_line = true,
          show_current_context = true,
          show_current_context_start = true,
      })
EOF
```

#### vim-rainbow => nvim-ts-rainbow

[p00f/nvim-ts-rainbow](https://github.com/p00f/nvim-ts-rainbow)

ネストされたカッコの色をそれぞれ別の色にすることで可読性を上げるプラグイン。

`vim-rainbow`は他のプラグインとの干渉があったり動作が重かったりしたが、移行で改善された。

#### previm => markdown-preview

[iamcco/markdown-preview.nvim](https://github.com/iamcco/markdown-preview.nvim)

マークダウンファイルのプレビュー用プラグイン。

プレビュー画面が編集箇所へ自動的に追従してくれるようになり、かつ、動作も軽快になった。

## フェーズ３：lua への完全移行

設定を`init.lua`などの lua スクリプトで全て記述し、neovim の高速化を目指す段階です。

が、当初の目的である、neovim 向けプラグインを使用するだけなら、そこまでする必要はありません。

高速な lua スクリプトへの移行はパフォーマンス面から見ても望ましい事であり、かつ、設定も lua で書く事を推奨されていますが、まだ急いで完全移行する必要は、現時点では存在しないと思います。

もちろん、更に設定を詰めまくって、ミリ秒単位で起動時間を短縮したり、設定ファイルを複数に分けて管理を合理化したりする事は十分に意味がありますし、ニッチなテキストエディターを愛する上で一番楽しい部分でもあるので、自分のパッションに従って追求していけばいいでしょう。

## まとめ

- neovim 用プラグインを使用する場合は neovim への移行が必要
- `init.vim`に`.vimrc`の内容をコピペすれば、最低限の移行はすぐに完了
- lua スクリプトによるプラグイン設定などは`init.vim`にも記述することが可能
- lua スクリプトへの完全移行は（現時点では、まだ）必要ない。

それでは、良きテキストエディターライフを。