😺

Neovimを:cdしたときに設定を切り替える

2022/02/06に公開

誰得

  • Neovimを起動してから、プロジェクトルートに :cd するのが常の人

結論

Working Directoryに追随して設定を切り替えるようにしました。

https://github.com/kyoh86/dotfiles/blob/996c9f7ee963ea469f9e00e0dd6ad0979bb40744/nvim/lua/local/etc/cwd/README.md
https://github.com/kyoh86/dotfiles/blob/996c9f7ee963ea469f9e00e0dd6ad0979bb40744/nvim/lua/local/etc/cwd/init.lua

cwd:setup({
    hooks = {
        ["example-inc"] = {
            match = function(self, fullpath)
                return string.match(fullpath, "/example-inc/") ~= nil
            end,
            enter = function(self, _)
                self.old_tabstop = vim.o.tabstop
                self.old_shiftwidth = vim.o.shiftwidth
                vim.o.tabstop = 2
                vim.o.shiftwidth = 2
                require("formatter").setup({
                    filetype = {
                        go = { require("local.opt.formatter").goimports },
                    },
                })
            end,
            leave = function(self, _)
                vim.o.tabstop = self.old_tabstop
                vim.o.shiftwidth = self.old_shiftwidth
                require("formatter").setup({
                    filetype = {
                        go = { require("local.opt.formatter").golines },
                    },
                })
            end,
        },
    },
})

こんなふうに、Working Directoryが特定の条件を(match)満たすかどうかで、
enter / leave で設定を切り替えられるようにしてあります。

背景

project localな設定をしたい

普段から Neovim を立ち上げて、その中で :cd してプロジェクトルートを開き、
違うプロジェクトに触れる時は別の Neovim インスタンスを立ち上げたり、立ち上げなかったり、
ともあれやはり :cd して... という生活をしています。

そうすると、たまに

  • プロジェクトごとに違うformatterを使いたい
  • プロジェクトごとにインデントサイズを替えたい

のように、Working Directoryで設定を切り替えたいシーンがあります。

enter / leaveが起こりうるのでなんとかしたい

local の vimrc をサポートするようなプラグインはいくつかあるのですが、
そのディレクトリ配下のファイルをいじったときに設定ファイルを読み込む という動作までしかサポートしないため、
その外のディレクトリに移動した時は設定を戻す、などの対応ができません。

やろうと思えばすべてのプロジェクトに戻す処理を置く、共通の設定を毎回読み込む、などの対応は可能ですが、
何かしらのパワーを消費している感があり望ましくありませんでした。

project localな設定をprojectのディレクトリに持ちたくない

  • gitignoreしない → 共同作業者にとっては邪魔
  • gitignoreする → うっかり消して変な苦労をする

と、このテの設定をディレクトリ内に置くことへの抵抗感が常々ありました。
つい先日も、共同作業しているリポジトリに、そのリポジトリのポリシーにない変なフォーマットをかけてしまい、
うっかりコミットしてPRに載せて差分の大きさに戸惑わせる、という事故を起こしました。
(セルフレビューしろって話ではある)

おわりに

日々変な使い方してるなと自覚しながらNeovimを自分に合わせています。
こういう変な使い方でも受け入れてくれる懐の広さは、昨今の拡張性に富んだエディタ界隈の競争の成果という感がありますね。

よき開発生活を。

Discussion