🎍

久しぶりにNeovimの設定を見直してみる

2022/01/16に公開

動機

ここしばらくプライベートで技術的に何かをする余裕を失っていて、
久々にNeovimの設定をメンテナンスしたので記事化。

tl;dr

  • vim.keymap.set が素敵
  • lua のフォーマッタは StyLua が非常にいい感じ
  • galaxyline.nvim の後継は feline.nvim が良さそう

vim.keymap.set いいぞ

--- a/nvim/lua/my-telescope.lua
+++ b/nvim/lua/my-telescope.lua
@@ -50,60 +50,61 @@ end

 -- Keymaps =================================================================================

+local builtin = require("telescope.builtin")
-vim.api.nvim_set_keymap(
+vim.keymap.set(
   "n",
   "<leader>ff",
-  '<cmd>lua require("telescope.builtin").find_files()<cr>',
+  builtin.find_files,
   {noremap = true, silent = true}
 )
-vim.api.nvim_set_keymap(
+vim.keymap.set(
   "n",
   "<leader>f:",
-  '<cmd>lua require("telescope.builtin").command_history()<cr>',
+  builtin.command_history,
   {noremap = true, silent = true}
 )

よき… 地味だけど、このluaの中でluaを呼び出すvim scriptを書かなくていい!
(本質的ではないんでしょうけど)

StyLuaは良いぞ

telescope.nvimのソースを何気なく眺めていて気づきましたが、
luaのformatterは色々あった中で StyLua がいい感じのようですね。

どのformatterも中途半端だったのに、StyLuaはprettierなみにかゆいところへ手が届く、良いformatterです。

  • ブレがちなところをきちんとフォローしてくれる
    • 関数呼び出しのカッコや、文字列のクォーテーションなど
  • stylua.tomlによる設定をサポート
  • rust製

ステータスラインプラグイン

前提: どんな使い方をしているか

ステータスにやたらと色々と表示するのは、めったに役に立たない割にリソースや領域を消費するので、
できるだけモノを減らすようにしています。

削りに削って今の所

  • モード
  • CWD
  • ファイル名・種類・編集済フラグ
  • Diagnostics

だけは私のNeovim生活スタイルにおいては無いと厳しいようです。

今までは?

galaxyline.nvim を使ってたのですが、原作者のglepnirが音信不通になってしまって以降、
まともに引き継ぐ人も現れず、危険な香りがしていました。

選択肢は?

新しく探した範囲では

  • lightline.vim に戻す
  • nvim-lualine/lualine.nvim
  • tjdevries/express_line.nvim
  • feline-nvim/feline.nvim

あたりが引っかかりましたが、

  • lightline.vim
    • 相変わらずミニマルで軽くて素敵
    • 個人的にvim scriptに飽きているので今は良いや、という気持ちに。
      • vim9 本格的に使おうという気持ちになったら 選択肢の筆頭
    • ドキュメントがとても丁寧
  • lualine.nvim
    • 比較的軽い
    • airline系の血を感じる
    • 変なところで固定されたフレームワークに閉じ込められがちで却下
    • ドキュメントが丁寧
  • express_line.nvim
    • telescopeと作者が同じ?
    • wipらしい
    • telescopeと思想がよく似ている…
    • ちょっと重い
    • telescopeの設定部分が深いところでドキュメンテーションされてなくてきっついので、今回は忌避
    • ドキュメントが難解
  • feline.nvim
    • 比較的軽い。lualineよりはちょっとモサるかも?
    • galaxyline.nvim みたいなカスタム性
    • 作者が謙虚 。READMEの書き味、ドキュメントの書き味、好き。
    • ネーミングセンスが好き。
    • ドキュメントが丁寧(USAGE.md)

といったところです。

feline.nvim どんな感じ?

設定のカスタム範囲が割とわかりやすいのが良いですね。

...

local component_file = {
  provider = function()
    return vim.fn.fnamemodify(vim.fn.getcwd(), ":t")
  end,
  hl = {
    fg = 'black',
    bg = 'lightmagenta',
  },
  right_sep = {
    str = '>',
    hl = {
      fg = 'red',
      bg = 'white',
    },
  },
}

...

require("feline").setup({
  components = {
    active = {{
      -- left
      component_mode,
      component_cwd,
      component_file,
    }, {
      -- mid
      ...
    }, {
      -- right
      'diagnostics_errors',
      'diagnostics_warnings',
      ...
    }}, 
    inactive = {
      ...
    },
})

コンポーネント内の各プロパティは、それと同じ形の値を返すfunctionで置き換え可能、ってのも大変わかりやすいですね。

ただ、component単位で非同期化したいとか、どこぞのイベントに応じて一部のcomponentを書き換えたい、
みたいな要求がある場合は結構工夫を要求されそうです。
そういう複雑な制御をしたい場合はexpress_line.nvimの方が良いかもしれません。

Discussion