🔌

Neovim向け機能山盛りプラグインmini.nvimの概要と設定の紹介

2021/11/28に公開

先日redditでmini.nvimというNeovimプラグインが発表され、俄に話題になりました。

https://www.reddit.com/r/neovim/comments/q7fiov/mininvim_collection_of_minimal_independent_and/

現時点で15のモジュール(サブプラグイン)を内包しており、今後も増やす予定とのことで、 「どこがminiじゃい!」 と突っ込みたくなるほどの山盛りプラグインです。

https://github.com/echasnovski/mini.nvim

導入してみたところ、なかなか使いやすく感じたので、プラグイン自体の概要と、個人的な設定について紹介します。

思想

最初は作者が自分用に既存のプラグインをluaで書き直していたところ、どんどんイマジネーションと実装が増えてきたことで、まとめて公開するに至ったとのことです(redditのコメントで書かれています)。

プラグイン自体の設計は以下のようになっています。

  • プラグインは特定の機能を提供するモジュールからなっており、プラグインを読み込んだだけでは何も動作しません。
  • モジュール同士は独立していて、必要なものだけを選択して読み込むことができます。
  • 各モジュールは、mini.xxxという名前になっています。

モジュール紹介

機能が非常に多いので、以下では概要を列挙するに留めます。
どういったことができるかを掴んだ上で、GitHubのREADME(スクリーンショットやデモ動画も載っている)やヘルプを見るとわかりやすいかと思います。

  • mini.base16
    • カラースキーム定義です。
    • base16という、設定された色を変数名や関数名などに適切に割り振り、16色だけで良い感じのカラースキームを作成するプラグインの機能を実装しています。
    • 類似(というかネタ元)プラグイン:chriskempson/base16
  • mini.bufremove
    • バッファを削除する機能を提供します。
    • 類似プラグイン:mhinz/vim-sayonara
  • mini.comment
    • ファイルタイプに応じたコメントアウト機能を提供します。
    • 類似プラグイン:tpope/vim-commentary
  • mini.completion
    • 入力時の補完機能です。
    • 筆者は現在coc.nvimの機能で補完しているため、使用していません。
    • 類似プラグイン:hrsh7th/nvim-cmp
  • mini.cursorword
    • 現在カーソルのある位置の単語および画面内にある同じ単語をハイライトします。
    • 筆者は現在coc.nvimの機能でハイライトを行っているため、使用していません。
    • 類似プラグイン:itchyny/vim-cursorword
  • mini.fuzzy
    • fuzzy finderです。
    • 筆者はcoc.nvimのプラグインとしてfzf-preview.vimを使っているので、こちらは使用していません。
    • 類似プラグイン:nvim-telescope/telescope-fzy-native.nvim
  • mini.jump
    • ftによるジャンプで、前後の行にもジャンプできるようになります。
    • 類似プラグイン:rhysd/clever-f.vim
  • mini.misc
    • 便利関数の詰め合わせパックです。個別モジュールになる感じではない関数がいろいろ定義されています。
    • 筆者は現在のバッファをフローティングウィンドウで開くzoomのみ使っています。
  • mini.pairs
    • auto-pair系のモジュールです。(を入力すると)を補うなど、対応する文字を自動で入力してくれます。
    • 類似プラグイン:jiangmiao/auto-pairs
  • mini.sessions
    • セッション系機能です。開いているバッファなどの状態を保存・復旧できます。
    • 筆者は使用していません。
    • 類似プラグイン:mhinz/vim-startify
  • mini.starter
    • スタート画面のモジュールです。ファイルを指定せずにNeovimを起動したとき、最近開いたファイルなどにアクセスできるメニューを提供します。
    • 類似プラグイン:mhinz/vim-startify
  • mini.statusline
    • ステータスラインの調整を行うモジュールです。
    • lewis6991/gitsigns.nvimと連携して、変更行数を表示できます。
    • LSPと連携して、エラーの数などを表示できます。
    • 類似プラグイン:nvim-lualine/lualine.nvim
  • mini.surround
    • 括弧や引用符を操作する機能を提供するモジュールです。
    • vim-sandwichの基本機能とほぼ同じですが、自動で括弧を選択してくれる機能がなかったり、少し弱い印象です。ただ、個人的には十分なので使用しています。
    • 類似プラグイン:machakann/vim-sandwich
  • mini.tabline
    • 開いているバッファを上部のtablineに表示します。
    • バッファを確認しやすくて良いと思いました。これを導入してから、:bn``:bp(実際は]b``[bにマッピング)で移動する機会が増えました。
    • 類似プラグイン:akinsho/bufferline.nvim
  • mini.trailspace

個人的設定

上記のモジュールは、基本的にデフォルト設定のまま使用しているのですが、一部のモジュールは調整を加えているので紹介します。

mini.base16

mini.base16は自分で色の設定が必要です。
筆者は以前使っていたsonokaiの色設定を参考にしています。

-- https://github.com/sainnhe/sonokai/blob/master/alacritty/README.md shusia
-- https://github.com/chriskempson/base16/blob/master/styling.md
require('mini.base16').setup({
  palette = {
    -- Default Background
    base00 = "#2d2a2e",
    -- Lighter Background (Used for status bars, line number and folding marks)
    base01 = "#37343a",
    -- Selection Background
    base02 = "#423f46",
    -- Comments, Invisible, Line Highlighting
    base03 = "#848089",
    -- Dark Foreground (Used for status bars)
    base04 = "#66d9ef",
    -- Default Foreground, Caret, Delimiters, Operators
    base05 = "#e3e1e4",
    -- Light Foreground (Not often used)
    base06 = "#a1efe4",
    -- Light Background (Not often used)
    base07 = "#f8f8f2",
    -- Variables, XML Tags, Markup Link Text, Markup Lists, Diff Deleted
    base08 = "#f85e84",
    -- Integers, Boolean, Constants, XML Attributes, Markup Link Url
    base09 = "#ef9062",
    -- Classes, Markup Bold, Search Text Background
    base0A = "#a6e22e",
    -- Strings, Inherited Class, Markup Code, Diff Inserted
    base0B = "#e5c463",
    -- Support, Regular Expressions, Escape Characters, Markup Quotes
    base0C = "#66d9ef",
    -- Functions, Methods, Attribute IDs, Headings
    base0D = "#9ecd6f",
    -- Keywords, Storage, Selector, Markup Italic, Diff Changed
    base0E = "#a1efe4",
    -- Deprecated, Opening/Closing Embedded Language Tags, e.g. <?php ?>
    base0F = "#f9f8f5",
  },
  use_cterm = true,
})

mini.misc

mini.miscはデフォルトではputput_textのみ有効となっています。
筆者はzoomを有効にして、<Cmd>lua MiniMisc.zoom()<CR>にキーマッピングを設定して使っています。

require('mini.misc').setup({
  make_global = { 'put', 'put_text', 'zoom'}
})

zoom状態のフローティングウィンドウ内ではstatuslineやtabbarが表示されなくなるので、ちょっとしたZen Modeぽくなります。

左:通常 右:zoom状態

mini.statusline

mini.statuslineはデフォルトではNeovim builtin LSPのdiagnosticsを表示するのですが、筆者はcoc.nvimを使用しているので、そちらの出力を表示するようにしています。
また、error/warningなどで色を分けています。

function diagnostics_table(args)
  local info = vim.b.coc_diagnostic_info
  if MiniStatusline.is_truncated(args.trunc_width) or info == nil then
    return {}
  end
  local table = {}
  table.e = (info['error'] or 0) > 0 and 'E'..info['error'] or ''
  table.w = (info['warning'] or 0) > 0 and 'W'..info['warning'] or ''
  table.h = (info['hint'] or 0) > 0 and 'H'..info['hint'] or ''
  table.i = (info['information'] or 0) > 0 and 'I'..info['information'] or ''
  table.s = vim.g.coc_status
  return table
end

function status_config()
  local mode, mode_hl = MiniStatusline.section_mode({ trunc_width = 120 })
  local git           = MiniStatusline.section_git({ trunc_width = 75 })
  local diagnostics   = diagnostics_table({ trunc_width = 75 })
  local filename      = MiniStatusline.section_filename({ trunc_width = 140 })
  local fileinfo      = MiniStatusline.section_fileinfo({ trunc_width = 120 })
  local location      = MiniStatusline.section_location({ trunc_width = 75 })

  return MiniStatusline.combine_groups({
  { hl = mode_hl,                  strings = { mode } },
  { hl = 'MiniStatuslineDevinfo',  strings = { git, diagnostics['s'] } },
  { hl = 'MiniStatuslineError',  strings = { diagnostics['e'] } },
  { hl = 'MiniStatuslineWarning',  strings = { diagnostics['w'] } },
  { hl = 'MiniStatuslineInfo',  strings = { diagnostics['i'] } },
  { hl = 'MiniStatuslineHint',  strings = { diagnostics['h'] } },
  '%<', -- Mark general truncate point
  { hl = 'MiniStatuslineFilename', strings = { filename } },
  '%=', -- End left alignment
  { hl = 'MiniStatuslineFileinfo', strings = { fileinfo } },
  { hl = mode_hl,                  strings = { location } },
  })
end

require('mini.statusline').setup({
  content = {
    active = status_config
  },
})

MiniStatusline...のハイライトグループは独自に定義しています。色味は前述のmini.base16の赤橙青緑を流用しています。

highlight MiniStatuslineError ctermfg=203 ctermbg=238 guifg=#f85e84 guibg=#423f46
highlight MiniStatuslineWarning ctermfg=215 ctermbg=238 guifg=#ef9062 guibg=#423f46
highlight MiniStatuslineInfo ctermfg=110 ctermbg=238 guifg=#7accd7 guibg=#423f46
highlight MiniStatuslineHint ctermfg=107 ctermbg=238 guifg=#9ecd6f guibg=#423f46

おわりに

機能山盛りプラグインのmini.nvimの紹介でした。
機能もそうですが、statuslineとcoc.nvimの連携がうまくできたので、これを紹介したくて記事にした次第です。

プラグイン自体はminiではないですが、他のプラグインを置き換えられる(かもしれない)ので、設定ファイルや読み込み負荷は少しminiになる…かもしれません。
興味のある方は試してみてください。

Discussion