rafi-vim-config

vimというよりはneovimの話になる。

rafi/vim-config vim用のconfigのレポジトリ

個人というよりContributorsが多数いる非常に多機能なneovimの設定を目指したレポジトリ。

rafi/vim-config: Lean mean Neovim machine, carefully crafted with Use with latest Neovim.

  • エラーメッセージが出ている状態だと非常にもっさりする
  • 初回インストール時に大量のプラグインがインストールされる(好みが分かれそうなポイント)

インストール

~/.config/nvim 配下になるようにgit cloneすれば良い。 私はghqを使っているので

ghq get https://github.com/rafi/vim-config.git
cd ~/.config/
ln -s ~/workspace/git/github.com/rafi/vim-config ./nvim

現在の管理方針

2026年時点では、Neovim 本体の設定は rafi/vim-config を upstream として使い、個人差分は別リポジトリに分ける方針にしている。

  • ~/.config/nvim
    • rafi/vim-config 本体
  • ~/.config/nvim/lua/config
    • 個人設定用リポジトリ tin-machine/nvim_config
  • ~/.config/nvim/lua/plugins
    • 個人プラグイン設定用リポジトリ tin-machine/nvim_plugins
  • ~/.config/nvim/lazyvim.json
    • :LazyExtras で有効化した extras の状態

rafi 側の README でも、現在の前提は Neovim 0.11 系で、ユーザー拡張は lua/configlua/plugins に置く構成になっている。 そのため、Ubuntu Desktop でも rafi 本体を直接 fork して改造するより、upstream の lua/rafi 配下には触らず、個人差分だけを別 repo で symlink する方が追従しやすい。

Ubuntu Desktop で再現する場合は、概ね次の形になる。

mkdir -p ~/.config
git clone https://github.com/rafi/vim-config.git ~/.config/nvim

git clone git@github.com:tin-machine/nvim_config.git ~/ghq/github.com/tin-machine/nvim_config
git clone git@github.com:tin-machine/nvim_plugins.git ~/ghq/github.com/tin-machine/nvim_plugins

rm -rf ~/.config/nvim/lua/config
rm -rf ~/.config/nvim/lua/plugins
ln -s ~/ghq/github.com/tin-machine/nvim_config ~/.config/nvim/lua/config
ln -s ~/ghq/github.com/tin-machine/nvim_plugins ~/.config/nvim/lua/plugins

rm -rf ~/.config/nvim/lua/configrm -rf ~/.config/nvim/lua/plugins は rafi 側に既存ディレクトリがある場合に置き換えるための破壊的操作。 実行前に ls -la ~/.config/nvim/lua/config ~/.config/nvim/lua/plugins で中身を確認する。

旧 PC の nvim.old は dein.vim ベースの Vimscript 設定だった。 内容としては termguicolors、行番号、クリップボード、2スペース indent、simo-zz-2 などの colorscheme、vim-lsp 系の Go LSP、UltiSnips、Neomake の JavaScript lint が中心だった。 現在の Lua 構成では、多くは rafi/LazyVim/lazy.nvim 側に寄せ、必要な差分だけ nvim_confignvim_plugins に残している。

主な個人差分は次の通り。

  • nvim_config/options.lua
    • OSC52 clipboard、clipboard=unnamedplusp/P を yank register から貼るマッピング、textwidth=160termguicolors
  • nvim_config/autocmds.lua
    • colorscheme 透過、Go 保存時の gofmt、Go 保存後の neotest 実行、Terraform 保存時の terraform fmt -
  • nvim_config/keymaps.lua
    • 前バッファへ戻る leader leader、Go test 実行用 leader tq
  • nvim_plugins/*.lua
    • cyberdream colorscheme、table mode、nvim-lspconfig、nvim-lint、nvim-dap、nvim-dap-ui、neotest、avante.nvim、mcphub.nvim

Ubuntu Desktop 側で別途必要になりやすいもの。

sudo apt install -y git ripgrep fd-find fzf lazygit nodejs npm python3 python3-pynvim \
  lua-check ruby ruby-dev rubygems-integration tree-sitter-cli yamllint

Ubuntu の fd-find package は実行ファイル名が fdfind になる。 rafi/vim-config やプラグインが fd コマンド名を期待する場合は、~/.local/bin/fd などへ symlink を作る。

mkdir -p ~/.local/bin
ln -s /usr/bin/fdfind ~/.local/bin/fd

Go/Terraform/Python debug まで使うなら、次も必要。

go install github.com/go-delve/delve/cmd/dlv@latest
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
go install github.com/nametake/golangci-lint-langserver@latest

tree-sitter-clilazygit は LazyVim の health check 対応、ruby-dev は Mason の erb-lint が依存する native extension build に必要だった。 terraform-lshadolintshellcheckmcp-hubosc などは、利用する機能に応じて追加する。 これらは Neovim 起動後に :checkhealth:Lazy:Mason:LspInfo で不足を確認する。

現時点の不確定要素。

  • options.lua は tmux から #{client_tty} を取得して osc copy -d を使うため、Ubuntu Desktop の通常ターミナル直下や tmux 外では追加分岐が必要かもしれない。
  • osc コマンドは Ubuntu 標準 package だけでは入らない可能性がある。OSC52 を使うなら theimpostor/osc の導入方法を別途決める。
  • mcphub.lua の build は volta install mcp-hub@latest なので、Ubuntu Desktop 側に Volta を入れるか、npm/aqua 管理に寄せるか決める必要がある。
  • lazyvim.json は rafi/vim-config の upstream 管理ファイルではなく、LazyExtras の選択状態としてローカルに作られる。再現性を上げるなら、このファイルをどこかの個人 repo で管理するか、同等の import を nvim_plugins 側へ明示する。
  • rafi/vim-config は upstream の変化が速いので、lua/configlua/plugins の読み込み仕様はアップデート時に README と実ファイルで確認する。

ファイラは Snacks Explorer に寄せる

2026-05時点の方針として、ファイラは Neo-tree ではなく Snacks Explorer に寄せる。 理由は、LazyVim の現行新規インストールでは explorer の第一候補が editor.snacks_explorer であり、rafi/vim-config 側にも Snacks Explorer 用の設定が入っているため。

ローカルの lazyvim.json には次を明示する。

"lazyvim.plugins.extras.editor.snacks_explorer"

また、tin-machine/nvim_plugins/snacks.lua に Snacks Explorer を無効化する override がある場合は削除する。 この override は次のような内容で、enabled = false により Snacks Explorer を止めてしまう。

return {
  {
    "folke/snacks.nvim",
    opts = {
      picker = {
        explorer = {
          enabled = false,
        },
      },
    },
  }
}

lazyvim.jsoninstall_version は、ファイラだけを切り替える目的なら無理に 8 へ変更しない。 install_version: 7 は既存 LazyVim 環境の互換判定に使われ、explorer 以外の picker などのデフォルト選択にも影響する可能性がある。 そのため、今回は lazyvim.plugins.extras.editor.snacks_explorer を明示して、変更範囲をファイラに限定する。

確認は headless 起動で行う。

nvim --headless '+lua local Config=require("lazy.core.config"); print("snacks_extra=" .. tostring(LazyVim.has_extra("editor.snacks_explorer"))); print("neo_tree_extra=" .. tostring(LazyVim.has_extra("editor.neo-tree"))); print("snacks_plugin=" .. tostring(Config.plugins["snacks.nvim"] ~= nil)); print("neo_tree_plugin=" .. tostring(Config.plugins["neo-tree.nvim"] ~= nil)); print("Neotree_cmd_exists=" .. tostring(vim.fn.exists(":Neotree"))); vim.cmd("qa")'

期待値は次の通り。

snacks_extra=true
neo_tree_extra=false
snacks_plugin=true
neo_tree_plugin=false
Neotree_cmd_exists=0

主なキーバインドは次の通り。

  • <Space>e / <Space>fe
    • Snacks Explorer を root dir で開く
  • <Space>E / <Space>fE
    • Snacks Explorer を cwd で開く
  • ;e
    • rafi 側の localleader remap 経由で root dir の Snacks Explorer を開く
  • ;E
    • rafi 側の localleader remap 経由で cwd の Snacks Explorer を開く
  • ;a / ;A
    • 現在のファイルを Snacks Explorer で reveal する

Neo-tree 前提だった :Neotree は使わない。 明示的に開くなら :lua Snacks.explorer() を使う。

rafi upstream への追従方針

rafi/vim-config の checkout は read-only upstream として扱う。 lua/rafi 配下や rafi 側の tracked file には個人差分を commit しない。 個人設定は lua/configlua/plugins の symlink 先、つまり tin-machine/nvim_configtin-machine/nvim_plugins に閉じ込める。

狙いは、rafi 側を常に origin/mastergit pull --ff-only で追従できる状態に保つこと。 rafi 側で merge commit、rebase、個人 patch 管理をしない。

現在の構成では次のように分担する。

  • rafi/vim-config
    • upstream 本体。init.lualua/rafi/**、upstream の lazy-lock.json を持つ。
  • tin-machine/nvim_config
    • ~/.config/nvim/lua/config の実体。個人 option、autocmd、keymap を持つ。
  • tin-machine/nvim_plugins
    • ~/.config/nvim/lua/plugins の実体。個人 plugin spec を持つ。
  • ~/.config/nvim/lazyvim.json
    • :LazyExtras の選択状態。rafi upstream の tracked file ではない。

ローカル checkout では、status ノイズを減らすために rafi 側の .git/info/exclude へ次を入れる。

/lazyvim.json
/lua/config
/lua/plugins

.git/info/exclude はローカル専用なので、rafi upstream には影響しない。 ここに入れるのは untracked の lazyvim.json と symlink だけにする。 tracked file である lazy-lock.json は ignore では隠れないし、隠さない。

lazy-lock.json は rafi upstream の tracked file なので、Lazy sync 後に dirty になっても rafi repo では管理しない。 これは個人 plugin も含めて lazy.nvim が解決した結果であり、upstream 追従用 checkout では生成物として扱う。

日常の更新手順は次の通り。

git -C ~/.config/nvim fetch origin
git -C ~/.config/nvim status --short --branch
git -C ~/.config/nvim restore lazy-lock.json
git -C ~/.config/nvim pull --ff-only
nvim --headless '+Lazy! sync' '+qa'
nvim --headless '+checkhealth lazyvim' '+silent write! /tmp/nvim-health-lazyvim.txt' '+qa'

更新後に upstream へ追従できているか確認する。

git -C ~/.config/nvim fetch origin
git -C ~/.config/nvim rev-parse HEAD origin/master
git -C ~/.config/nvim status --short --branch
git -C ~/.config/nvim log --oneline --decorate -n 5

rev-parse HEAD origin/master の 2 行が同じ commit hash なら、fetch 時点の rafi upstream 最新に追従している。 status --short --branch## master...origin/master だけなら、rafi checkout は clean。 Lazy sync 後に lazy-lock.json だけ dirty になることは、この運用では正常。 次回 pull 前に git restore lazy-lock.json で戻す。

もし git pull --ff-only が失敗した場合は、まず rafi checkout の tracked 変更を確認する。

git -C ~/.config/nvim status --short
git -C ~/.config/nvim diff --name-only

lazy-lock.json だけなら restore して再実行する。 lua/rafi/** や他の tracked file が dirty なら、個人差分が rafi checkout 側へ混入している可能性が高い。 その場合は差分を nvim_config または nvim_plugins 側へ移す。

この運用では git pull --ff-only を維持しやすい一方で、個人 plugin まで含めた完全な lock 再現性は弱くなる。 必要になった場合だけ、lazy-lock.jsonnvim_config など別リポジトリへ snapshot として保存する。

コンテナ上での注意点

初回起動時、大量のプラグインのインストールが発生する。 またmacOS上のdocker環境のnvimでrafi/vim-configを使った場合、画面表示が非常に崩れた。それもあって動作がもっさりしている。 Linux上で検証した場合には発生しなかった。何かdocker環境上で使う場合、CUIの表示に難ありかもしれない。

超強力なmacOS(M2 32GBメモリ)上のコンテナより、ラズパイ4ベアメタルでの表示の方がスムーズだし、プラグインのインストールもスムーズに終了する。

設定用ディレクトリ

設定の追加は rafi/vim-config: Lean mean Neovim machine, carefully crafted with Use with latest Neovim. を参考にした。

オフィシャルのStructureのディレクトリ構成の説明が参考になる。

2023/12時点では下記の構成になる。
lua/configユーザーの設定
lua/pluginsユーザーのプラグイン設定
snippets個人的なsnippets

config配下には更に下記のファイルを置ける。

| ————————- | – | | lua/config/autocmds.lua | auto comand | | lua/config/options.lua | カスタムオプション | | lua/config/keymaps.lua | キーマップ | | lua/config/setup.lua | 設定のオーバーライド |

プラグインの追加

オフィシャルの情報を見ると、 ~/.config/nvim/lua/plugins/配下にファイルを設置するらしい。 rafi/vim-config: Lean mean Neovim machine, carefully crafted with Use with latest Neovim.

例えば ~/.config/nvim/lua/plugins/add.lua に下記内容を置くと、次回起動時、自動的にインストールされる。

return {
  {
    'mattn/vim-maketable',
    lazy = false,
  },
  {
    'dhruvasagar/vim-table-mode',
 lazy = false,
  }
}

記述方法は folke/lazy.nvim: 💤 A modern plugin manager for Neovim に書いてある。

私が追加しているプラグイン

nvim-treesitter/nvim-treesitter の設定を追加しているのは、phpのsyntaxが一時的にだと思うがインストールできなかったため外している。

またmacのhammerspoonのEmmyLuaの設定を追加している。 このEmmyLuaはLuaのLSP向けの設定で、hammerspoonの補完を行ってくれる。 例えば一枚のluaのファイルを開いた時、「Undefined global …」と表示されるが、 この設定とSpoons/EmmyLua.spoon/annotationsの設定を追加すると、そのエラーが消える。 ファイルを上記URLからダウンロード、展開したディレクトリを~/.config/hammerspoon/Spoons/EmmyLua.spoon/に配置する。 その上で下記の設定を行う。

更にterraform-lsの設定を追加している。terraform-lsはterraformのLSPで、nvim-lspconfigで設定を追加することで、terraformのファイルを開いた時にLSPが有効になる。

LSPが有効になっているかの確認は :LspInfo で確認できる。

return {
  -- テーブル関連のプラグイン
 { 'mattn/vim-maketable', lazy = false, },
 { 'dhruvasagar/vim-table-mode', lazy = false, },

  -- GitHub's Copilot を有効に
  { import = 'rafi.plugins.extras.coding.copilot' },

  -- Change built-in plugins' options
  {
    'nvim-treesitter/nvim-treesitter',
    opts = {
      ensure_installed = {
        'bash', 'comment', 'css', 'diff', 'dockerfile', 'fennel', 'fish',
        'gitcommit', 'gitignore', 'gitattributes', 'git_rebase', 'go', 'gomod',
        'gosum', 'gowork', 'graphql', 'hcl', 'html', 'javascript', 'jsdoc',
        'json', 'json5', 'jsonc', 'jsonnet', 'lua', 'make', 'markdown',
        'markdown_inline', 'nix', 'perl', 'pug', 'python', 'regex',
        'rst', 'ruby', 'rust', 'scss', 'sql', 'svelte', 'terraform', 'toml',
        'tsx', 'typescript', 'vim', 'vimdoc', 'vue', 'yaml', 'zig',
      },
    },
  },

  -- Lua の LSPの設定を変更
  {
    'neovim/nvim-lspconfig',
    opts = {
      servers = {
        lua_ls = {
          settings = {
            Lua = {
              workspace = {
                checkThirdParty = false,
                library = {"~/.config/hammerspoon/Spoons/EmmyLua.spoon/annotations"}
              },
              completion = { callSnippet = 'Replace' },
            },
          },
        },
        terraformls = {  -- Terraform LSP の設定を追加
          filetypes = { "terraform", "tf" },
          cmd = { "terraform-ls", "serve" },
          flags = {
            debounce_text_changes = 150,
          },
        },
      },
    }
  }
}

個人の設定の追加

lua/config/options.lua にカスタムオプションを設定する。

折返しの設定幅を短くする設定を追加した。

vim.opt.textwidth = 160     -- 折返し幅を160文字にした
vim.o.clipboard = vim.o.clipboard:gsub(",?unnamedplus", "") -- macでクリップボード連携をオフにした
vim.opt.termguicolors = true -- 24ビットカラーをサポート

カラースキームの設定

neovimを起動し :echo g:colors_name で現在のカラースキームを確認できる。 デフォルトの設定は ./rafi/plugins/colorscheme.luaneohybrid に設定されていた。

ターミナルの半透明の設定を有効にしてもneovimの時だけ透過しなかった。 テーマの設定を上書きたいので下記の設定を追加した。

~/.config/nvim/lua/config/autocmds.lua <- ファイル名は autocmds.lua である必要がある

-- 新しく MyGroup という名前の自動コマンドグループを作成しています。
-- { clear = true } は、このグループに既存の自動コマンドがあった場合はクリア(削除)して再作成します。
-- 重複や意図しない動作を防ぐため、毎回グループをクリアしてきれいな状態にするための設定です。
vim.api.nvim_create_augroup('MyGroup', { clear = true })
-- イベント:ColorScheme
-- カラースキームが読み込まれるたびに自動で実行されます。
-- グループ:先ほど作成した MyGroup にこの自動コマンドを属させます。
-- パターン:'*'
--   すべてのカラースキームに対して有効です(特定のカラースキーム名を指定することも可能)。
vim.api.nvim_create_autocmd('ColorScheme', {
        group = 'MyGroup',
  pattern = '*',
        -- Normalグループ(Neovim上のテキスト部分全体)の背景色を完全に透明に設定します。
  -- ctermbg=NONE はターミナル上の背景色を削除します。
  -- guibg=NONE はGUI(Neovim GUIや端末の真の色設定が可能な環境)の背景色を削除します。
  command = 'highlight Normal ctermbg=NONE guibg=NONE',
})

別のカラースキーマを使う( cyberdream )

rafi/vim-configのExtra Pluginsでいくつかのカラースキームがサポートされている そのうち cyberdream

Transparency-first design - all design decisions are made with transparency in mind. とあり透過に向いているらしいのでこれを使ってみる neovim起動後、 :LazyExtras で cyberdreamを検索、xで選択、neovim再起動する。

カラースキームのインストール後、カラースキームが使われるようにするのが

  • rafi/vim-config はカラースキームの設定を vim-config/lua/rafi/plugins/colorscheme.lua で行っている
    • デフォルトは neohybrid
  • vim-config/lua/rafi配下のディレクトリはrafi管理なので、別ファイルで設定を変更したいね…

別の設定ファイルを書いてみる

~/.config/nvim/lua/plugins/colorscheme-cyberdream.lua に書きを書いてみた。が、上手く反映できない

return {
  {
    'scottmckendry/cyberdream.nvim',
    lazy = false,
    priority = 1000,
    config = function()
      require('theme-loader').setup({
        initial_colorscheme = 'cyberdream',
        fallback_colorscheme = 'cyberdream',
      })
    end,
  },
}

下記を行ってみてもNG

rm -rf ~/.local/share/nvim ; rm -rf ~/.local/state/nvim ; rm -rf ~/.cache/nvim

上記で使用されている theme-loader は last-used 、最後に使ったカラースキームを記憶してくれるらしい。 ただ私の環境では上手く動作してくれなかった。

こちらのコードを見ると、最後に使用したカラースキームは ~/.local/share/nvim/theme.txt に保存される。このファイルを確認するとデフォルトのものが記載されており、下記のようにカラースキームを指定して反映してもファイルが変更されなかった

:colorscheme cyberdream

下記で現在のカラースキームが変わっている事を確認した

:echo g:colors_name

デフォルトのまま

cat ~/.local/share/nvim/theme.txt
neohybrid⏎

逆に保存されるファイル側を書き換えてみる

echo cyberdream > ~/.local/share/nvim/theme.txt

この方法で目的のカラースキームを起動時に読み込ませる事ができた

次はカラースキームをカスタマイズしたい

neovimを起動してからLazyExtrasでプラグインを追加できる

https://github.com/rafi/vim-config?tab=readme-ov-file#extend-plugins

:LazyExtras を打ってから現れるダイアログで x を押すと追加できる(反映にneovimを再起動する必要がある)

LazyExtrasについて参考になった

何かプラグイン関連で反映されない時はキャッシュを削除してみる

rm -rf ~/.local/share/nvim ; rm -rf ~/.local/state/nvim ; rm -rf ~/.cache/nvim