【期間限定】HHKBスターターキットが特別価格 3/28 13時まで

【Mac】statuscol.nvimでNeovimのステータスカラムをかっこ良くカスタマイズする

7 min

こんにちは。ナミレリです。この記事ではstatuscol.nvimを使ってNeovimのステータスカラムをカスタマイズする方法を紹介します。

カスタマイズ後のステータスカラム

カスタマイズ後のステータスカラム
Lazy.nvimの導入や初期設定について

Lazy.nvimの導入や初期設定、LSP環境の構築については下の記事を参考にしてください。

この記事はこんな人にオススメ

  • Neovimを使い始めて、見やすく便利な環境を整えたい初心者
  • Neovimの行番号やステータスカラムを自由にカスタマイズしたいユーザー
  • 他のプラグイン(デバッグやGit関連)と連携させより実践的に使いこなしたい方
  • Luaによる設定に興味があり、実用的なカスタマイズ例を探している人
この記事のMac環境
Parallels Desktop 20 for Macの無料トライアル もありますので、ぜひダウンロードして試してみてください。M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。

このブログではプラグインマネージャにLazy.nvimを用い、設定ファイルは以下の構成です。

ディレクトリ・ファイル説明
~/.config/nvim/init.luaLazy.nvimのブートストラップスクリプトを書きます。
~/.config/nvim/lua/plugins/このディレクトリ配下の個別ファイルにプラグインを記述。
~/.config/nvim/lua/plugins/plugins_lazy.luaインストールするプラグインをこのファイルに列挙。
~/.config/nvim/lua/core/このディレクトリ配下に、プラグイン以外の基本的な設定を記述。
~/.config/nvim/lua/user/このディレクトリ配下に、個別カスタマイズの設定を記述。
スクロールできます

今回追加するファイル

~/.config/nvim/
├── init.lua
└─lua/
       ├── plugins/
       │       ├── plugins_lazy.lua

       │       ├── statuscol_cfg.lua<= 追加
       │       ├── lualine_cfg.lua
       │       ├── neo-tree_cfg.lua
       │       ├── lsp_cfg.lua
       │       └── nvim_cmp_cfg.lua
       ├── core/
       │       ├── autocmds.lua
       │       ├── keymaps.lua
       │       └── options.lua<= 編集
       └── user/
               ├── icons.lua
               ── ui.lua

statuscol.nvimとは

statuscol.nvimは、Neovimのステータスカラム(行番号や折りたたみ記号が表示される領域)を柔軟にカスタマイズできるプラグインです。Neovimデフォルトのステータスカラムは好みに合わせた調整が難しいことがあります。statuscol.nvimを使用することで、ステータスカラムの表示内容やクリック時の動作をカスタマイズすることができます。

https://github.com/luukvbaal/statuscol.nvim

カスタマイズ後のステータスカラム

カスタマイズ後のステータスカラム

statuscol.nvimの基本設定

プラグインマネージャにLazy.nvimを用いて、statuscol.nvimの設定を紹介していきます。

まず、基本の設定は下のようになります。具体的なステータスカラムの設定はsegments = {}に書いていきます(後述)。

~/.config/nvim/lua/plugins/statuscol_cfg.lua

statuscol_cfg.lua

return {
    "luukvbaal/statuscol.nvim",
    config = function()
        local builtin = require("statuscol.builtin")
        require("statuscol").setup({
            relculright = true,
            foldfunc = "builtin",
            setopt = true,
            segments = {
                ------------------------------
                -- ここに設定内容を書く
                ------------------------------
            }
        })
    end,
}
オプション説明
relculrigh = true相対行番号表示を右寄せする設定
foldfunc = "builtin"折りたたみ(folding)をプラグインのビルトイン関数で表示
setopt = true自動的にNeovimのオプションを設定(デフォルトでtrue
スクロールできます

Neovim側で折りたたみ機能(folding)を有効にしておく

Neovim側で折りたたみ機能(folding)を有効にしておきます。私は以下のように設定しています。

~/.config/nvim/lua/core/options.lua

options.lua

-- folding
vim.o.foldenable = true
vim.o.foldmethod = "indent"
vim.opt.foldcolumn = "1"
vim.o.foldlevel = 99
vim.opt.fillchars:append({
    fold = " ",
    foldopen = "",
    foldsep = " ",
    foldclose = "",
})
オプション説明
vim.o.foldenable = true折りたたみ機能(folding)を有効にする
vim.o.foldmethod = "indent"インデントの深さに応じて自動的に折りたたむ設定
vim.opt.foldcolumn = "1"ステータスカラムの横に折りたたみ用の列を表示(数字は列の幅を意味)
vim.o.foldlevel = 99ファイルを開いたときにどの深さまで折りたたみを展開するか
(99で折りたたみは全て開いた状態でスタート)
vim.opt.fillchars:append({...})折りたたみ時に表示される文字や記号をカスタマイズ
スクロールできます

segmentsの設定

ステータスカラムはsegmentsという単位で管理し、各segmentの設定を細かくカスタマイズすることができます。各segmentは以下の設定が可能です。

segments オプション説明
text表示する文字列や関数のテーブル
clickクリック時の関数ラベル
hlハイライトグループのラベル
conditionセグメントの表示条件を定義するブール値や関数のテーブル
signsignセグメントを構成するフィールドのテーブル
スクロールできます

なお、signセグメントは以下の設定が可能です。

sign オプション指定する値の型・例説明
namespaceテーブル形式表示するサインを特定のnamespace(プラグイン名や識別名)で指定
name正規表現、文字列、テーブル表示するサイン名を正規表現等で指定
maxwidth数値サイン表示エリアの最大表示幅
colwidth数値実際に確保する列幅
autoブール値(true / false)表示するサインがない場合に、スペースを詰める(false)か
空白を確保する(true)かを指定
wrapブール値(true / false)折り返し表示の行に対してもサインを繰り返し表示するかを指定
スクロールできます

~/.config/nvim/lua/plugins/statuscol_cfg.lua

ステータスカラムの左から、gitsignsdiagnostic、折りたたみ(folding)、空白、その他のサイン、行番号、空白の7つとしています。

statuscol_cfg.lua

return {
    "luukvbaal/statuscol.nvim",
    config = function()
        local builtin = require("statuscol.builtin")
        require("statuscol").setup({
            ft_ignore = { "help", "terminal", "neo-tree", "alpha" },
            thousands = true,
            -- relculright = true,
            foldfunc = "builtin",
            setopt = true,
            segments = {
                {
                    -- gitsigns
                    sign = {
                        namespace = { "gitsigns" },
                        -- maxwidth = 1,
                        -- colwidth = 1,
                        -- auto = true
                    },
                    click = "v:lua.ScSa",
                },
                {
                    -- diagnostic
                    sign = {
                        namespace = { "diagnostic" },
                        -- maxwidth = 1,
                        -- colwidth = 1,
                    },
                    click = "v:lua.ScSa",
                },
                {
                    -- fold
                    text = { builtin.foldfunc },
                    -- maxwidth = 1,
                    -- colwidth = 1,
                    click = "v:lua.ScFa",
                },
                {
                    -- 境界
                    text = { " " },
                },
                {
                    -- その他のサイン
                    sign = {
                        name = { ".*" },
                        -- maxwidth = 1,
                        -- colwidth = 1,
                    },
                },
                {
                    -- 行番号
                    text = { builtin.lnumfunc },
                    click = "v:lua.ScLa",
                },
                {
                    -- 境界
                    text = { " " },
                },
            },
        })
    end,
}

maxwidthcolwidthautoはコメントアウトしていますが、必要に応じて設定してください。
私の環境では、ステータスカラムの各項目の表示位置は固定されており、見やすく整った状態です。

その他のサインには、下の記事でも詳しく紹介していますが、SmoothCursor.nvimのアイコンを表示しています。SmoothCursor.nvimの記事もぜひご覧ください。

クリックハンドラーの種類と役割

先程の設定内で、gitsignsdiagnosticにはclick = "v:lua.ScSa"、折りたたみにはclick = "v:lua.ScFa"、行番号にはclick = "v:lua.ScLa"を設定しました。

そもそもこのclickオプションは、ステータスカラムをクリックした際の動作を指定します。例えばステータスカラム内のgitのマークや「行番号」や「折りたたみ記号」をクリックした際に、特定の機能が実行されるよう設定することができます。

ここで指定されているv:lua.ScSav:lua.ScFav:lua.ScLaは、クリックされた領域ごとの動作を指しています。

設定セグメントクリックハンドラー意味
gitsigns
diagnostic
v:lua.ScSaSign(GitマークやLSP診断マーク)S
Git差分や診断情報の表示
折りたたみv:lua.ScFaFold(折りたたみ記号)F
折りたたみを開閉する
行番号v:lua.ScLaLine NumberL
その行に移動する
スクロールできます

その他のカスタマイズ

特定のファイルタイプでステータスカラムを表示しない

ft_ignoreオプションを使用して、特定のファイルタイプでステータスカラムの表示を無効にできます。例ではhelpや、terminal、neo-tree、alphaでステータスカラムの表示を無効にしています。

require("statuscol").setup({
    ft_ignore = { "help", "terminal", "neo-tree", "alpha" },
})

カスタムハイライトの適用

テキストエレメントにはhlフィールドを使用してハイライトを適用することができます。

{
    -- 行番号
    text = { builtin.lnumfunc },
    click = "v:lua.ScLa",
    hl = "MyCustomHighlight",
},

最後に

最後まで読んでいただきありがとうございます。「statuscol.nvimでNeovimのステータスカラムをかっこ良くカスタマイズする」はいかがでしたでしょうか。

statuscol.nvimを活用することで、Neovimのステータスカラムをカスタマイズできて、モチベを向上させることができたと思います。

おすすめ記事

Neovimをかっこ良くクールに使う設定

関連記事