Neovim向け機能山盛りプラグインmini.nvimの概要と設定の紹介
先日redditでmini.nvimというNeovimプラグインが発表され、俄に話題になりました。
現時点で15のモジュール(サブプラグイン)を内包しており、今後も増やす予定とのことで、 「どこがminiじゃい!」 と突っ込みたくなるほどの山盛りプラグインです。
導入してみたところ、なかなか使いやすく感じたので、プラグイン自体の概要と、個人的な設定について紹介します。
思想
最初は作者が自分用に既存のプラグインを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
-
f
やt
によるジャンプで、前後の行にもジャンプできるようになります。 - 類似プラグイン:rhysd/clever-f.vim
-
-
mini.misc
- 便利関数の詰め合わせパックです。個別モジュールになる感じではない関数がいろいろ定義されています。
- 筆者は現在のバッファをフローティングウィンドウで開く
zoom
のみ使っています。
-
mini.pairs
- auto-pair系のモジュールです。
(
を入力すると)
を補うなど、対応する文字を自動で入力してくれます。 - 類似プラグイン:jiangmiao/auto-pairs
- auto-pair系のモジュールです。
-
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
- 行末スペースを強調表示するハイライトと、それらを削除するコマンドを追加します。
- ちなみに、全角スペースなどの強調表示については以前記事を書いています:Vimで全角スペースその他不可視文字をハイライトする設定
- 類似プラグイン:[ntpeters/vim-better-whitespace]
個人的設定
上記のモジュールは、基本的にデフォルト設定のまま使用しているのですが、一部のモジュールは調整を加えているので紹介します。
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
はデフォルトではput
とput_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