💤

lazy.nvimのインストール方法とその使い方

2024/05/13に公開

はじめに

ありがたいことに、最近になって身の回りでVim/Neovimに興味を持つ人がポツポツと現れてきました。いままでエンジニアとして働いてきたなかで、興味を持ってくれる人や使っている人に出会ったことがなかったためとても嬉しい話です。
さらにプラグインにも興味持ってもらえればな〜と思い、プラグインマネージャーのlazy.nvimの使い方を紹介していこうと思います。
https://github.com/folke/lazy.nvim

lazy.nvimはNeovimで使用可能なプラグインマネージャーで、とても人気のあるプラグインです。筆者もこれを愛用しています。
闇の力に手を染めるほどカスタムしたい訳ではないので、自分にはこのぐらいがいいのかなーと思っています。(Vimを使っていたときはvim-plugを利用していました。)

他のプラグインマネージャーについては、以下の記事がとても参考になるので興味があれば一読をオススメします。
https://zenn.dev/shougo/articles/dpp-vim-beta

lazy.nvimを使うために必要なもの

2024年5月現在、lazy.nvimを使うために必要なのは以下になります。

  • Neovim >= 0.8.0
  • Git >= 2.19.0
  • Nerd Font(optional)

Nerd Fontについては必須ではないですが、導入すると見た目がかっこよくなるのでできれば対応しているフォントを導入してみましょう。

上記がインストールされていない場合は適宜インストールもしくはアップデートしてください。

init.lua

次にinit.luaにlazy.nvimのセットアップスクリプトを書いていきます。と、その前に。
どのディレクトリにinit.luaを置けばよいのか、どこのinit.luaが読みこまれるのかわからない場合は以下のコマンドを実行してみてください。

nvim -V1 -es -c "echo stdpath('config') . '/init.vim'" -cq

表示されたパスのinit.luaが読み込まれるので、そこにスクリプトを書いていきましょう。
ファイルが存在しなければ、touchコマンドなどを使ってファイルを作成します。

ちなみに、上記のコマンドについて解説すると、

  • -V1: ログ出力レベルを設定します。1〜16まで設定でき、それぞれのレベルに応じた出力をします。(参照)
  • -es: スクリプトモード、サイレントモード、バッチモードなどと呼ばれているモードです。呼び名が多いですね。ExモードでNeovimを起動します。(筆者もあまり詳しくありませんが、UIなしでExコマンドを実行するモードと思っています。)
  • -c: コマンドラインから直接Exコマンドを指定して実行します。こちらは-esとは異なりUIが起動します。
  • -cq: -c "q"と等価です。

(上記の説明で致命的に間違えているところありましたらコメントください。)

各オプションについて詳しくは以下を参照してください。
https://neovim.io/doc/user/starting.html

lazy.nvimをインストールするスクリプトをinit.luaに書く

README.mdに記載されている以下のスクリプトをinit.luaに追加しましょう。

init.lua
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
  vim.fn.system({
    "git",
    "clone",
    "--filter=blob:none",
    "https://github.com/folke/lazy.nvim.git",
    "--branch=stable", -- latest stable release
    lazypath,
  })
end
vim.opt.rtp:prepend(lazypath)

このスクリプトにより、Neovim起動時にlazypathへlazy.nvimがインストールされているか確認するようになります。
インストールされていなければgit cloneを使ってlazypathへlazy.nvimがインストールされます。

プラグインのインストール

インストールしたいプラグインをスクリプトに追加していきます。
例えば、folke/noice.nvimというプラグインをインストールしたければinit.luaに以下のようにスクリプトを追加します。

init.lua
require("lazy").setup({
  -- ここに追加したいプラグインを書く。
  -- GitHubに公開されているプラグインなら、"ユーザー名/リポジトリ名"のフォーマットで記載する。
  "folke/noice.nvim",
})

追加したらNeovimを実行してみてください。上記の設定をNeovim上で実施していたなら、一度終了して再度実行してみてください。なにやらかっこいいUIが立ち上がって、プラグインがインストールされるはずです。
他にも追加したいプラグインがあれば、上記のコードと同様に記載していけば起動のタイミングで自動インストールされます。どんどん追加していきましょう。

プラグインごとの設定方法

ここまででlazy.nvimを使ったプラグインのインストール方法がなんとなくわかったと思います。
さらにプラグインごとの設定を追加してみましょう。
lazy.nvimではこちらに記載されているPlugin Specにならって記載することでいろいろな設定ができるようになっています。
どんな設定ができるのか筆者がよく使うものを紹介します。

dependencies

先ほど設定したnoice.nvimですが、実はこれを動かすためには他にプラグインが必要なため単体では動作しません。nui.nvimを追加する必要があります。このように、プラグインを動作させるための前提になるプラグインがある場合にはdependenciesを使いましょう。

noice.nvimのREADMEではInstallationに以下のコードが記載されています。

-- lazy.nvim
{
  "folke/noice.nvim",
  event = "VeryLazy",
  opts = {
    -- add any options here
  },
  dependencies = {
    -- if you lazy-load any plugin below, make sure to add proper `module="..."` entries
    "MunifTanjim/nui.nvim",
    -- OPTIONAL:
    --   `nvim-notify` is only needed, if you want to use the notification view.
    --   If not available, we use `mini` as the fallback
    "rcarriga/nvim-notify",
    }
}

dependenciesには、MunifTanjim/nui.nvimrcarriga/nvim-notifyの2つのプラグインが記載されています。このように設定することで、nui.nvimとnvim-notifyはNeovim起動時にインストールされ、noice.nvimが読み込まれるタイミングでこの2つのプラグインがロードされるようになります。

これを先ほど設定したスクリプトに組み込むと、init.luaは以下のようになります。

init.lua
require("lazy").setup({
- "folke/noice.nvim",
+ {
+   "folke/noice.nvim",
+   event = "VeryLazy",
+   opts = {
+     -- add any options here
+   },
+   dependencies = {
+     -- if you lazy-load any plugin below, make sure to add proper `module="..."` entries
+     "MunifTanjim/nui.nvim",
+     -- OPTIONAL:
+     --   `nvim-notify` is only needed, if you want to use the notification view.
+     --   If not available, we use `mini` as the fallback
+     "rcarriga/nvim-notify",
+     }
+ }
})

このようにプラグインを使うために他にロードが必要なプラグインがある場合はdependenciesに設定しましょう。

opts / config

プラグインが用意している設定を行いたいときは、optsもしくはconfigを使います。

ほとんどのプラグインはsetupという関数を用意していて、これを呼び出すことでプラグインが使用可能な状態になります。あわせてsetupの引数にテーブルで設定項目を渡し、ユーザの好みに合わせてカスタマイズできるようになっているつくりもよく見る形式です。

optsに対してプラグインが用意しているオプションを設定すると、lazy.nvimの内部的にsetup(opts)が呼び出されてオプションの内容がそのプラグインに反映されます。
setupを呼び出すだけでなく、もっと複雑な設定を行いたいときにはconfigを使用しましょう。configには関数を設定でき、その関数の内部にセットアップで必要な処理を記載し、プラグインがロードされるタイミングで設定した関数が呼び出されます。
また、プラグインに対して設定する項目がない(デフォルトの設定を使用したいだけの場合)は、config = trueとすることで内部的にsetp({})が呼び出されてプラグインが設定されます。

optsconfigは設定したい内容によって使い分けてみてください。

event

Neovim起動時にすべてのプラグインを読み込むようにしていると、起動のたびに時間がかかってしまいストレスです。そのため最近のプラグインマネージャーでは遅延ロードが基本的には搭載されています。
lazy.nvimのデフォルトの設定では遅延ロードがオフになっており、特になにも設定していなければ起動時に読み込みを行います。
特定のタイミングで読み込むようにしたい場合はeventを使います。
例えばバッファを新規作成したタイミングでプラグインをロードしたいのであれば、event = "BufNewFileと設定する必要があります。インサートモードになったときにプラグインを読み込むのであれば、event = "InsertEnter"です。
複数のeventを設定することももちろん可能で、その場合はevent = { "BufNewFile", "InsertEnter" }のように設定します。
これを設定することで、そのイベントが実行されるまでプラグインはロードされません。どのようなイベントがあるのかについては以下を参照してください。
https://neovim.io/doc/user/autocmd.html#autocmd-events

また、lazy.nvimはいくつか独自のイベントを追加しています。こちらも見ておくとよいです。なかでもよく使うのはVeryLazy(VimEnter相当?)です。
https://vim-jp.org/vimdoc-ja/autocmd.html#autocmd-events

ft / cmd / keys

他にも特定のファイルタイプのファイルを開いたとき、特定のコマンドを実行したとき、特定のキー入力があったときをトリガーにプラグインを遅延ロードすることもできます。
それぞれftcmdkeysを使って設定でさます。

この中で特にkeysは便利で、こちらに設定をすることでマッピングと遅延ロードの設定が1つの設定で可能になります。
どういうことかというと、lazy.nvimでは例として以下のコードがREADMEに掲載されています。

-- Example for neo-tree.nvim
{
  "nvim-neo-tree/neo-tree.nvim",
    keys = {
      { "<leader>ft", "<cmd>Neotree toggle<cr>", desc = "NeoTree" },
    },
    config = function()
      require("neo-tree").setup()
    end,
}

この場合、<Leader>ftが入力されたタイミングでneo-tree.nvimが読み込まれるようになります。
かつ、<Leader>ft<cmd>neotree toggle<cr>というマッピングを設定しています。

eventとあわせて使って、必要なタイミングで必要なプラグインを読み込むようにすることで、時々で不要なプラグインを読み込まずにスピーディーにNeovimを起動できるようになります。

設定ファイルの分割

これまではinit.luaにすべての設定を記載してきましたが、これを続けて使用するプラグインの数が100や200となっていくとファイルが非常に大きくなってしまいます。
気にならない方はそれでも大丈夫ですが、分割したいという人も一定数いると思います。

lazy.nvimはデフォルトで~/.config/nvim/lua/plugins/*.luaに格納されているLuaファイルは自動で読み込むようになっています。
そのため、こちらに分割したい単位でファイルを作成し、Plugin Specの形式でテーブルをreturnするように記載することで分割することができます。

また、特定のディレクトリ配下のLuaファイルを読み込むようにしたい場合は、require("lazy").setup({ spec = {}})を使いましょう。
例えば、筆者はspec = { { import = "config.plugins" } }と設定しています。これににより~/.config/nvim/lua/config/plugins/*.luaが読み込まれるようになります。

詳細は以下のセクションを確認してください。
https://github.com/folke/lazy.nvim/blob/main/README.md#-structuring-your-plugins

使い方

ここではlazy.nvimのコマンドについて説明します。

:Lazy / :Lazy home

:LazyもしくはLazy homeを実行すると、lazy.nvimのUIが起ち上がります。
この画面では、どのプラグインがロードされているのか、ロードされていないのか、いつロードされる設定になっているのかなどの情報を確認できます。

また、上部にInstall (I)の括弧内に記載されている文字を入力すると、その画面に遷移して各コマンドが実行されます。

:Lazy install

:Lazy installを実行すると、インストールされていないプラグインをインストールします。
他の画面からこちらに遷移してきた場合も同様にインストールを試みます。

また、プラグインをインストールすると同時にlazy-lock.jsonというファイルが生成されます。
こちらには、インストールしているプラグインのコミットハッシュが記録されています。
:Lazy restoreコマンドを実行した際に、このファイルを参照して現在インストールされているバージョンとlazy-lock.jsonのバージョンが異なる場合は、lazy-lock.jsonに記載されているバージョンに戻す動作をします。

:Lazy update / :Lazy check

:Lazy updateを実行すると、プラグインのアップデートを行います。
:Lazy checkではプラグインの更新情報だけを取得し、アップデートは行いません。

:Lazy clean

:Lazy cleanを実行すると、使用していないプラグインを削除します。
使用していないプラグインになにがあるのかは、:Lazy homeのClean欄で確認できます。

まとめ

lazy.nvimの使い方について説明しました。
かなりのところを端折ってしまっているので、もっと使い方を知りたい場合はリポジトリのREADMEを読んでみてください。

Discussion