🌨️

Vim Plugin開発にもNix

2024/12/13に公開

本記事はNix Advent Calendar 2024の13日目の記事になります。

はじめに

Nixは強力なパッケージマネージャです。VimやNeovim (以降まとめてVimと表記) との相性も良く例えば以下のようにして執筆時に利用していた環境を簡単に得られます。 [1]

nix run github:ttak0422/dotfiles-nvim/2024-12-12#bundler-nvim-main

昨今dotfiles的な用途での人気が高いですが、通常の開発とも相性が良いです。Vimプラグインの開発を題材に開発用途でもNixのポテンシャルが高いことを確認します。

作成するプラグイン

Light系のカラースキームを自作します。このカラースキームはVim環境でも利用したいためVim sciprtで実装します。実装にあたってicebergを参考にしました。

https://github.com/ttak0422/sorairo

プラグイン開発にあたって以下の3点を満たす環境が欲しいです。

  • ビルド環境:テンプレートエンジンpgmnt.vimが導入されたVim環境
  • テスト環境:最小限のプラグインと設定がされた環境
  • 開発環境:ビルド環境やテスト環境が影響を受けない普段利用している環境。

Nixで実現する

ビルド環境

一般的なパッケージマネージャで利用できるように成果物をリポジトリに含めることにします。pgmnt.vimが導入されたVim環境を構築すれば非対話的に実行することで目標を達成可能です。以下の様にflakeで定義します。
https://github.com/ttak0422/sorairo/blob/044e694641469df5e7be20694001823a9a48a83b/nix/apps/default.nix#L26-L36

https://github.com/ttak0422/sorairo/blob/044e694641469df5e7be20694001823a9a48a83b/Makefile#L7-L10

テスト環境

同様にflakeで定義します。絶賛開発中ですがnvim-treesitterの動作を確認したいためparser付きで導入したNeovim環境を用意しました。
https://github.com/ttak0422/sorairo/blob/044e694641469df5e7be20694001823a9a48a83b/nix/apps/default.nix#L37-L61
Nixを導入済みであれば、以下のコマンドで共通のテスト環境のVimを起動可能です。

# vim
nix run github:ttak0422/sorairo#test-vim

# neovim
nix run github:ttak0422/sorairo#test-nvim

test-app

PRなどで動作を確認する機会は多いかと思います.そういった場合も以下のようにしてテスト環境を利用できます。環境を汚染することなく変更について確認が可能です。

# vim
nix run github:ttak0422/sorairo/feature/advent-calendar-2024#test-vim --refresh

# neovim
nix run github:ttak0422/sorairo/feature/advent-calendar-2024#test-nvim --refresh

reject

開発環境

お好きな環境 (Vimなど) を利用下さい。ビルド環境もテスト環境も独立しているため、特に対応することなく同時に環境を触ることが可能です。(上:テスト環境、下:開発環境)
テスト環境と開発環境を同時に編集する画像

またコードの品質を保つためにpre-commitを導入します。git-hooks.nixを利用して対応します。Nixのために nixfmtstatixdeadnix、Vimのためにvint、LuaのためにluacheckStyLuaを導入します。checksを利用しているためGithub Actionsでも簡単に実行可能です。

https://github.com/ttak0422/sorairo/blob/044e694641469df5e7be20694001823a9a48a83b/flake.nix#L33-L62

direnvを利用するようにしていれば開発ディレクトリに移動しただけで構築が完了します。

direnv

さいごに

今回、利用例としてVimプラグインの開発を上げましたが、利用していたのはflakeの標準的な機能になるため、一般的な開発でも知見がそのまま活用できます。Nixを利用して良き開発ライフを。

脚注
  1. あくまで純粋なNeovim環境であるためフォントやターミナル、依存しているSKKサーバまでは再現できません。更新の程度に差があるためdotfilesdotfiles-nvimのように分けて管理する方針を取っています。2つを組合せることで全てを再現できるようにしています。 ↩︎

Discussion