nvim-scrollbarにOneDarkのカラーテーマを適用させる

Neovimにスクロールバーを追加するnvim-scrollというNeovim向けのプラグインがある。
これを使うと、コード全体のどこでLSPエラーが起きているかや、今のカーソル位置がNeovimのスクロールバーに表示される。
また、他のプラグインと連携することで、検索した単語がどこにあるのかや、コードに対して追加・変更・削除した場所が表示される。

各プラグインの設定例をコピペしただけだと自分が使っているOneDarkの検索ハイライトにならなかったため、ちゃんと調査した。
そして色を調整したらプラグイン追加毎(というかプラグインキャッシュコンパイル毎)にロードエラーが出るようになったため、そこも調整することにした。

# できたもの
- 検索ハイライトとgitの変更点を、OneDarkのカラースキーム設定を用いてnvim-scrollbarに表示するようにした。
![スクリーンショット 2023-04-30 0.41.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320986/bcbaf180-0355-e093-b0b5-70adb37da84e.png)

# やったこと
- OneDarkのカラーテーマを取得してnvim-scrollbarに渡す
- gitsignsとnvim-hlslensをnvim-scrollbarと連携させる
- packerで起動順の依存をちゃんと指定する

# 環境
以下の環境でやった
- Neovim 0.9.0 (Release)
- [wbthomason/packer.nvim](https://github.com/wbthomason/packer.nvim)(コミットID:`dac4088`)
- [navarasu/onedark.nvim](https://github.com/navarasu/onedark.nvim)(コミットID:`89dde49`)
- [petertriho/nvim-scrollbar](https://github.com/petertriho/nvim-scrollbar)(コミットID:`f3a5469`)
- [lewis6991/gitsigns.nvim](https://github.com/lewis6991/gitsigns.nvim)(コミットID:`e5edefd`)
- [kevinhwang91/nvim-hlslens](https://github.com/kevinhwang91/nvim-hlslens)(コミットID:`5e3e908`)

:::note info
メモ程度にコミットIDを記入したが、多分気にしなくてよい
:::

# 細かい手順
## OneDarkのカラーテーマを取得してnvim-scrollbarに渡す
OneDarkには`'dark', 'darker', 'cool', 'deep', 'warm', 'warmer', 'light'`と、複数のカラーテーマがある。
以下のようにすればテーマごとの色が取得できるが、テーマを変えると`[カラーテーマ]`も編集する必要があって面倒。
```lua
local color = require('onedark.palette')
print(color.[カラーテーマ].black)
```
ところが`require('onedark.color')`を使うと、Oneテーマを読み込むときに設定したカラーテーマの値を取得できる。

`require('onedark').setup {style = [カラーテーマ]}`で設定したものが`vim.g.onedark_config.style`に代入される。
```lua:onedark.nvim/lua/onedark/colors.lua
local colors = require("onedark.palette")

local function select_colors()
	local selected = { none = "none" }
	selected = vim.tbl_extend("force", selected, colors[vim.g.onedark_config.style])
	selected = vim.tbl_extend("force", selected, vim.g.onedark_config.colors)
	return selected
end

return select_colors()
```
これで、setupで設定したOneDarkのカラーテーマのテーブルを取得できる。

あとはnvim-scrollbarの設定サンプルを参考に設定する。
```lua:config/nvim-scrollbar.lua
local colors = require('onedark.colors')

require('scrollbar').setup({
  marks = {
    Search = { color = colors.orange },
  },
}
```

## gitsignsとnvim-hlslensをnvim-scrollbarと連携させる
これはnvim-scrollbarのREADME.mdにある設定例をそのまま使った。

https://github.com/petertriho/nvim-scrollbar#setup

- gitsigns
    ```lua:gitsignsに対しての設定
    use {
      "lewis6991/gitsigns.nvim",
      config = function()
        require('gitsigns').setup()
        require("scrollbar.handlers.gitsigns").setup()
      end
    }
    ```
- vim-hlslens
    ```lua:nvim-hlslensに対しての設定
    use {
      "kevinhwang91/nvim-hlslens",
      config = function()
        -- require('hlslens').setup() is not required
        require("scrollbar.handlers.search").setup({
            -- hlslens config overrides
        })
      end,
    }
    ```

## packerで起動順の依存をちゃんと指定する

ここまででも動くことには動くが、プラグインを追加して`:PackerCompile`を実行するたびエラーが発生する。
これはgitsignとvim-hlslensの起動順がonedarkとnvim-scrollbarに依存しており、プラグインのロード順が正しく設定されていないためである。

ロード順を設定するために、nvim-srollbar, gitsign, vim-hlslensそれぞれに`wants`オプションを付ける。
これをつけることで、該当するプラグインを読み込む前に指定したプラグインを読み込むことができる。
こうすることで、onedark→nvim-scrollbar→gitsign, vim-hlslensの順に読み込める。
```lua:plugins.lua
-- nvim-scrollbar
use {
    "petertriho/nvim-scrollbar",
    config = function()
      require('config.nvim-scrollbar')
    end,
    wants = { 'onedark.nvim' }
  }
-- gitsigns.nvim
  use {
    'lewis6991/gitsigns.nvim',
    config = function()
      require('config.gitsigns')
    end,
    wants = { 'nvim-scrollbar' },
  }
-- search highlight
  use {
    'kevinhwang91/nvim-hlslens',
    config = function()
      require('config.nvim-hlslens')
    end,
    wants = { 'nvim-scrollbar' },
  }
```
# おわりに
- 各プラグインのドキュメントや、ソースコードを読むとやりたい設定がちゃんとできることがよく分かった。一次ソース確認は大事。
- 参考になるかは分かりませんが、ここで設定したものはこちらに置いています。

https://github.com/mitsu-yuki/dotfiles/tree/v0.0.1


# 参考文献
- [爆速で起動する Neovim を作る - Qiita](https://qiita.com/delphinus/items/fb905e452b2de72f1a0f)
起動順周りで大変お世話になりました。