LazyVim に移行する

カテゴリー:  Tech タグ:  editor vim

Neovim

普段Neovimを愛用していて、昨年Neovimの設定をVimScriptから LuaScriptに移行しました。 快適に使っているのですが、Neovimコミュニティはプラグインの開発が盛んで 更新に対応させ最新を維持するのが結構しんどいなと感じていました。

今回は自分で作った設計を一回捨てて、 LazyVim に移行することにしました。デフォルトのカラースキーマーが私が使っているものと同じ であるのも気に入った点です。

LazyVimとは

LazyVim とは、Neovimのプラグインマネージャーである lazy.nvimを利用して、Neovimでよく使われる 設定を予め組み込み、かつカスタマイズや設定の効率化を目指したパッケージです。

LazyVim

以下のような機能があります。

  • NeovimをVisual Studio Code以上に本格的なIDEのような使い勝手を得ることができます
  • lazy.nvim を使って、カスタマイズや拡張が容易にできます
  • lazy.nvimを使っているため、プラグインの読み込みが非常に高速です
  • オプションやAutocmd、キーマップについて合理的なデフォルトが提供されています
  • 多数のプラグインが事前に設定されており、すぐに利用可能です

LazyVimへの移行方法

移行用法は Instrationガイドを読めば およそわかると思います。

次の4ステップです。

  1. 既存環境のバックアップ
  2. LazyVim Starterの取得
  3. LazyVim Starterから不要なファイルを削除
  4. Neovimの起動(設定されているプラグインが'lazy.nvim'により自動的にインストールされます)

いかが具体的な手順です。

# Step1
mv ~/.config/nvim{,.bak} # required
mv ~/.local/share/nvim{,.bak} # optional but recommended
mv ~/.local/state/nvim{,.bak} # optional but recommended
mv ~/.cache/nvim{,.bak}  # optional but recommended

# Step2
git clone https://github.com/LazyVim/starter ~/.config/nvim

# Step3
rm -rf ~/.config/nvim/.git

# Step4
nvim

以上です。驚くほど簡単です。

LazyVimのパーソナライズ

~/.config/nvim以下に作成されたLazyVimの設定ファイルは以下のような構造になっています。

 .
├──  init.lua
├──  lazy-lock.json
├──  lazyvim.json
├──  LICENSE
├──  lua
│   ├──  config
│   │   ├──  autocmds.lua
│   │   ├──  keymaps.lua
│   │   ├──  lazy.lua
│   │   └──  options.lua
│   └──  plugins
│       ├──  coding.lua
│       └──  example.lua

lua/config以下のファイルがカスタマイズを記述するファイルで、 lua/plugins以下のファイルが自身で追加するプラグインなどの設定を置く場所です。

lua/config 配下の設定

lua/config配下には4つのファイルが配置されていますが、 lazy.lua以下のファイルは空です。私は、 autocmds.luaoptions.luaのみ設定しました。

autocmds.luaについては、MarkdownやJsonファイルで Concealingされるが嫌なので以下の設定を 入れています。

vim.api.nvim_create_autocmd("FileType", {
  pattern = { "markdown", "json" },
  callback = function()
    vim.wo.conceallevel = 0
  end,
})

LazyVimではすでにいい感じにVimオプションを設定してくれているので、 options.luaは基本的には好みで設定すればよいと思います。 しかし、日本語環境では以下の設定は行ったほうがよいと思います。

local opt = vim.opt

vim.scriptencoding = "utf-8"
opt.encoding = "utf-8"
opt.fileencoding = "utf-8"
opt.spelllang = vim.opt.spelllang + "cjk"

lua/plugins 配下の設定

lua/plugins配下はデフォルトではexample.luaしか入っておらず、設定例となっており 実際の設定は無効化されています。

このフォルダ配下に、hogehoge.luaというファイル名でlazy.nvimの形式でプラグインの設定 を書けばプラグインを拡張することもできますし、LazyVimですでに組み込まれているプラグインの カスタマイズもこちらで行えます。

現時点では、以下の3点のみカスタマイズしています。

  • autodate.vimの追加
  • 組み込み済みのfriendly-snippetsにローカルのスニペット定義をソースとして追加
  • 組み込み済みのgitsigns.nvimでマークを自分の好みに変更

具体的な設定はcoding.luaというファイル名で以下のような設定を行っています。

return {
  {
    --  --------------------------------------------
    --   Setting for Autodate
    --  Timestamp format Output example
    --  %Y/%m/%d    2004/09/27
    --  %H:%M:%S    13:06:32
    --  %y%m%d-%H%M 040927-1308
    --  %d-%3m-%Y   27-Sep-2004
    --  %Y/%m/%d %H:%M:%S   2004/09/27 13:06:32
    --  %c  Sun Apr 27 11:49:23 1997
    --  %Y %b %d %X 1997 Apr 27 11:53:25
    --  %y%m%d %T   970427 11:53:55i
    --  --------------------------------------------
    "vim-scripts/autodate.vim",
    event = "BufWritePre",
    config = function()
      -- let g:autodate_format = '%Y-%m-%d %H:%M:%S'
      vim.g.autodate_format = "%Y-%m-%d %H:%M:%S"
    end,
  },
  {
    "rafamadriz/friendly-snippets",
    config = function()
      require("luasnip.loaders.from_vscode").lazy_load()
      require("luasnip.loaders.from_snipmate").load({ paths = { "~/.config/nvim/snippets" } }) -- Load snippets from my-snippets folder
    end,
  },
  {
    -- Adds git releated signs to the gutter, as well as utilities for managing changes
    "lewis6991/gitsigns.nvim",
    event = { "BufReadPre", "BufNewFile" },
    opts = {
      signs = {
        add = { hl = "GitSignsAdd", text = "+", numhl = "GitSignsAddNr", linehl = "GitSignsAddLn" },
        change = { hl = "GitSignsChange", text = "~", numhl = "GitSignsChangeNr", linehl = "GitSignsChangeLn" },
        delete = { hl = "GitSignsDelete", text = "", numhl = "GitSignsDeleteNr", linehl = "GitSignsDeleteLn" },
        topdelete = { hl = "GitSignsDelete", text = "", numhl = "GitSignsDeleteNr", linehl = "GitSignsDeleteLn" },
        changnedelete = { hl = "GitSignsChange", text = "~", numhl = "GitSignsChangeNr", linehl = "GitSignsChangeLn" },
        untracked = { text = "▎" },
      },
      on_attach = function(buffer)
        local gs = package.loaded.gitsigns

        local function map(mode, l, r, desc)
          vim.keymap.set(mode, l, r, { buffer = buffer, desc = desc })
        end

        -- stylua: ignore start
        map("n", "]h", gs.next_hunk, "Next Hunk")
        map("n", "[h", gs.prev_hunk, "Prev Hunk")
        map({ "n", "v" }, "<leader>ghs", ":Gitsigns stage_hunk<CR>", "Stage Hunk")
        map({ "n", "v" }, "<leader>ghr", ":Gitsigns reset_hunk<CR>", "Reset Hunk")
        map("n", "<leader>ghS", gs.stage_buffer, "Stage Buffer")
        map("n", "<leader>ghu", gs.undo_stage_hunk, "Undo Stage Hunk")
        map("n", "<leader>ghR", gs.reset_buffer, "Reset Buffer")
        map("n", "<leader>ghp", gs.preview_hunk_inline, "Preview Hunk Inline")
        map("n", "<leader>ghb", function() gs.blame_line({ full = true }) end, "Blame Line")
        map("n", "<leader>ghd", gs.diffthis, "Diff This")
        map("n", "<leader>ghD", function() gs.diffthis("~") end, "Diff This ~")
        map({ "o", "x" }, "ih", ":<C-U>Gitsigns select_hunk<CR>", "GitSigns Select Hunk")
      end,
    },
  },
}

LazyVim Extras

LazyVimはデフォルトでは有効になっていないが、よく使われる設定も多数組み込まれています。 本当に多数です。

これらは LazyVim Extras と呼ばれており :LazyExtrasコマンドにより個々の設定を簡単に オンオフすることができます。

    ● editor.mini-files  mini.files
    ● formatting.black  mason.nvim  conform.nvim  none-ls.nvim
    ● formatting.prettier  mason.nvim  conform.nvim  none-ls.nvim
    ● lang.markdown  headlines.nvim  markdown-preview.nvim  mason.nvim  nvim-lspconfig  nvim-treesitter  none-ls.nvim  nvim-lint
    ● ui.mini-animate  mini.animate
    ● ui.mini-starter  mini.starter
    ● util.dot  nvim-treesitter

まとめ

LuaScriptに移行は 数日かかりましたが、LazyVimを使うと2〜3時間で上記のようなわずかな設定で モダンなVim環境が簡単に手に入ります。

また、設定ファイルの配置が合理的に考えられているので、各プラグインが更新された際には LazyVimが対応してくれれば個別の対応はかなり限定的になるので維持も手間がかなり楽になると 思います。

Neovim使いの方はこに記事を記述してください。

コメント

Comments powered by Disqus