feline.nvim: is the order a cool and fast status bar?

私の Neovim は起動時間が長い。 180 ms もかかっていた。 1 秒もかかっていないので、気にするほどのことでもないのかもしれないが、 生の Neovim が 5ms 程度で起動することを考えると、速さを追い求めたくなってしまう。 速さにこそ本質がある。

起動・動作の高速化のためにいくつかのことを行ってみたが、 ここではステータスバーを vim-airline から feline.nvim に変更してみた。

もともと airline はなんかかっこいいという程度の理由で使っており、 大した設定もしていなかった。よく意味もわからず表示していたものもあり、今回はこれを見直すことにした。

feline.nvim は lua で書かれたプラグインで、 vimscript で書かれたものよりも高速に動作することが期待できる。 lua で書かれたステータスバープラグインは他にもあるが、 なんとなく feline.nvim を使うことにした。

結果として、 Neovim の起動時間が半分程度になり( 118ms 程度 → 64ms 程度)、 なかなか良い見た目のステータスバーとなった。

本稿では、 vim-airline と feline.nvim の起動時間の比較と、私の設定を紹介する。

環境

PC

Neovim

feline.nvim の導入

README に書かれている通りにインストールする。 私の場合は、 vim-plug を使用しているので、以下のようにインストールした。

Plug 'feline-nvim/feline.nvim'

ステータスバーに表示されている内容は以下の通りである:

feline.nvim の設定

プラグインの設定は lua で記述する必要がある。 README のリンクにあったこの例を参考に設定を記述した。

しかし、この例では Diagnostics の情報を builtin lsp からとるようになっており、私が使用している coc.nvim には対応していない。 そのため、 coc.nvim の Diagnostics の情報をとってくる部分は自分で書く必要があった。1

実装をみる限りでは、builtin lsp の各 severity の個数をとってきて表示しているようなので、 これを coc.nvim から取得できるように実装すれば良い。

実装すべきなのは以下の 2 つ:

coc.nvim の diagnostics の情報は、辞書型の変数 b:coc_diagnostic_info に格納されている。 よって、この変数を lua で読み取るような関数を実装する。

-- ある severity の diagnostics が存在するかを判定
local function diagnostics_exist(severity)
    local info = vim.b.coc_diagnostic_info
    if (not info) then
        return false
    else
        local count = info[severity]
        if count > 0 then
            return true
        else
            return false
        end
    end
end

-- ある severity の diagnostics の個数を返す
local lsp_get_diag = function(str)
    local info = vim.b.coc_diagnostic_info
    if (not info) then
        return ''
    else
        local count = info[str]
        if (not count) then
            return ' 0 '
        else
            return ' '..count..' '
        end
    end
end

以上の設定はここにある。

起動時間の比較

ここでは vim-airline と feline.nvim を読み込んだときの起動時間を比較する。 使用した init.vim は次の通り。

filetype off

call plug#begin('/tmp/nvim/plugged_airline')
Plug 'vim-airline/vim-airline'
call plug#end()

set termguicolors

filetype plugin indent on
filetype off

call plug#begin('/tmp/nvim/plugged_feline')
Plug 'feline-nvim/feline.nvim'
call plug#end()

set termguicolors

lua << EOF
require('feline').setup()
EOF

filetype plugin indent on

それぞれ :PlugInstall を行った後、 10 回ずつ起動して startuptime を記録し、その起動時間の平均をとった。

# log startuptime
$ repeat 10 nvim -u init_feline.vim --startuptime /tmp/startuptime_feline.log
$ repeat 10 nvim -u init_airline.vim --startuptime /tmp/startuptime_airline.log

# calculate average
$ cat /tmp/startuptime_airline.log | grep "NVIM STARTED" | awk '{m+=$1} END{print m/NR;}'   
57.5417
$ cat /tmp/startuptime_feline.log | grep "NVIM STARTED" | awk '{m+=$1} END{print m/NR;}'
19.2784

確かに、 feline.nvim のほうがだいぶ起動時間が短いことがわかる。

本稿では、 vim-airline から feline.nvim に変更してみた結果を紹介した。 また、 feline.nvim で coc.nvim の diagnostics 情報を読み取る方法も書いた。

参考


  1. lua を触るのは初めてだったので、よくわからずに書いた。 ↩︎