Claude CodeでNeovim configのVimScriptからLuaへのマイグレーション

Table of Contents

1. はじめに

みなさん、Neovimの設定ファイル、メンテナンスしてますか?

私は1年前にVimを本格的に使い始め、その際にVimScriptで書いたNeovimの設定ファイルを使い続けていました。 「いつかLuaに移行しなきゃなぁ…」と思いながらも、面倒くさくてずっと後回しにしていました。

そんな中、最近話題のClaude Codeを触る機会があり、「これを使ったら設定ファイルを楽にマイグレーションできるんじゃないか?」と思い立ちました。 重い腰を上げて、ついにVimScript → Luaの移行に挑戦してみることにしたのです。

私の既存の設定は、「マスタリングVim」にインスパイアされて作成し、使っていきながら様々なプラグインやキーバインドを追加していったものでした。 プラグイン管理にはvim-plugを使い、基本設定からキーマッピング、カスタム関数まで全て “単一の” VimScriptファイルに記述していたため、管理するのが辛いものとなっていました。

特に抱えていた課題としては:

  • 新しいLuaベースのプラグインを導入しにくい
  • 設定の可読性・保守性が悪い
  • パフォーマンスの問題(起動が遅い)

といった点がありました。

2. Neovimの設定について

Neovimは従来のVimScriptに加えて、Lua言語での設定記述をサポートしています。 Luaを使うことで以下のメリットが得られます:

  • 豊富なエコシステム: 多くの新しいプラグインがLuaベースで開発されている
  • 保守性: 管理しやすいようにディレクトリ・ファイルへの分割が容易
  • 可読性: より直感的で読みやすい文法
  • 高速: VimScriptと比べて大幅に高速

特に最近のNeovimプラグインの、nvim-treesitter、nvim-lspconfig, none-lsなどを利用して、楽にそして柔軟に設定の管理を行いたいモチベーションがありました。

3. 移行戦略の立案

既存のVimScript設定を分析してみると、大きく以下のカテゴリに分類できることがわかりました:

  • プラグイン管理: vim-plugによるプラグインのインストールと管理
  • 基本設定: オプション設定、外観設定
  • キーマッピング: 基本的なキーバインドとカスタムマッピング
  • プラグイン設定: 各プラグインの個別設定
  • カスタム関数: 自作の関数やコマンド

Lua設定では、これらを機能ごとにファイル分割して整理しやすいが大きなメリットです。 移行後は以下のような構造で整理しました:

~/.config/nvim/
├── init.lua                    # エントリーポイント
├── after/
│   └── lsp/                    # LSP固有設定
│       ├── gopls.lua
│       └── lua_ls.lua
└── lua/
    ├── config/                 # 基本設定群
    │   ├── edit.lua            # 編集関連設定
    │   ├── lazy.lua            # プラグイン管理(lazy.nvim)
    │   ├── search.lua          # 検索関連設定
    │   ├── view.lua            # 見た目関連設定
    │   ├── window.lua          # ウィンドウ関連設定
    │   └── langs/              # 言語固有設定
    │       ├── c.lua
    │       ├── go.lua
    │       ├── terraform.lua
    │       └── yaml.lua
    └── plugins/                # プラグイン設定群
        ├── completion.lua
        ├── copilot.lua
        ├── deepl.lua
        ├── edit.lua
        ├── lang.lua
        ├── lsp.lua
        ├── navi.lua
        ├── search.lua
        ├── session.lua
        ├── sql.lua
        └── view.lua

この構造により、機能ごとに設定が整理され、管理しやすくなりました。

既存のVimScript設定をClaude Codeに丸ごと読み込ませ、自分の好みを伝えつつディレクトリやファイルの分割を指示することで、とてもスムーズにマイグレーションの計画を立てることができました。

4. 実際の移行作業

実際にVimScriptの設定をどのようにLuaにマイグレーションしたのか、いくつか具体例を紹介します。

4.1. 基本設定の移行

VimScriptの set コマンドによる設定を、Luaの vim.opt APIに移行しました。

VimScript(移行前):

set number
set cursorline
set expandtab
set tabstop=4
set shiftwidth=4
set autoindent

Lua(移行後 - config/edit.lua, config/view.lua):

-- config/view.lua
vim.opt.number = true
vim.opt.cursorline = true

-- config/edit.lua
vim.opt.expandtab = true
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4
vim.opt.autoindent = true

このように機能別にファイルを分割することで、設定の意図が明確になりました。

4.2. キーマッピングの移行

VimScriptの nnoremap 等を、Luaの vim.keymap.set APIに移行しました。

VimScript(移行前):

inoremap jj <Esc>
nnoremap x "_x
vnoremap <Tab> >gv
vnoremap <S-Tab> <gv

Lua(移行後 - config/edit.lua):

vim.keymap.set("i", "jj", "<Esc>")
vim.keymap.set("n", "x", '"_x')
vim.keymap.set("v", "x", '"_x')
vim.keymap.set("v", "<Tab>", ">gv")
vim.keymap.set("v", "<S-Tab>", "<gv")

Luaでは第一引数でモードを明示的に指定するため、より分かりやすくなりました。

4.3. プラグイン管理の移行

vim-plugからlazy.nvimへの移行は最も大きな変更の一つでした。

VimScript(移行前):

call plug#begin('~/.config/nvim/plugged')
Plug <旧LSPプラグイン>
Plug <旧formaterlinterプラグイン>
call plug#end()

" 設定は別の場所に散在

Lua(移行後 - plugins/lsp.lua):

return {
  {
    "neovim/nvim-lspconfig",
    config = function()
      -- LSP keymaps
      vim.api.nvim_create_autocmd("LspAttach", {
        callback = function(ev)
          local opts = { buffer = ev.buf }
          vim.keymap.set("n", "K", vim.lsp.buf.hover, opts)
          vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts)
          -- その他のキーマップ...
        end,
      })
    end,
  },

  {
    "nvimtools/none-ls.nvim",
    config = function()
      local null_ls = require("null-ls")
      null_ls.setup({
        sources = {
          null_ls.builtins.formatting.stylua,
          null_ls.builtins.formatting.gofmt,
          -- その他のフォーマッター...
        },
      })
    end,
  },
}

lazy.nvimでは、プラグインの宣言と設定を同じ場所に書けるため、設定の関連性が明確になりました。

4.4. 言語固有設定の分離

各言語の設定を個別ファイルに分離しました。

移行後(config/langs/go.lua):

vim.api.nvim_create_autocmd("FileType", {
  pattern = "go",
  callback = function()
    vim.opt_local.tabstop = 4
    vim.opt_local.shiftwidth = 4
    vim.opt_local.expandtab = false
  end,
})

4.5. オートコマンドの改善

VimScriptの autocmd を、Luaの vim.api.nvim_create_autocmd に移行しました。

VimScript(移行前):

augroup colors
  autocmd!
  autocmd ColorScheme * highlight Comment ctermfg=249
augroup END

Lua(移行後 - config/view.lua):

vim.api.nvim_create_autocmd("ColorScheme", {
  callback = function()
    vim.cmd("highlight Comment ctermfg=249 guifg=#b2b2b2")
  end,
})

Luaではコールバック関数を直接定義できるため、より直感的な書き方ができるようになりました。

これらのVimScriptからLuaへの単純な書き換え作業は、Claude Codeがほぼ100%の精度で行ってくれたおかげで、マイグレーションをとても高速に行うことができました。

5. まとめ

Claude Codeを活用したNeovimの設定移行は、想像以上にスムーズに進めることができました。

長年使い続けてきたVimScript設定に別れを告げるのは少し寂しい気持ちもありましたが、Lua設定への移行により、Neovimの真の力を引き出せるようになったと感じています。

同じように移行を検討している方の参考になれば幸いです。

最後まで読んでいただき、ありがとうございました。

参考資料