【入門編】Neovimで独自ツール開発:Lua APIを使って自分専用のタスクランナーを作る方法 – 軽量・高機能テキストエディタ生産性向上バイブル

Neovimを「あなたの手足」にする:Lua APIで構築する専用タスクランナーの極意

世の中には便利なプラグインが溢れていますが、プラグインに依存しすぎると、エディタは「他人が作ったツール」の集合体になり、重く、カスタマイズが困難になります。

真のエンジニアが目指すべきは、「エディタを自分の思考の拡張機能に変えること」です。今回は、Neovimの強力なLua APIを駆使し、外部プラグインに一切頼らず、あなた専用の「タスクランナー」を構築する方法を伝授します。

—

1. なぜ「自作」なのか:アーキテクチャの視点

多くのIDEやプラグインは「汎用性」を重視しますが、あなたのワークフローには「あなただけの文脈」があるはずです。
例えば、`npm test`を実行する際、単にターミナルに出力するだけでなく、「特定のフォーマットで結果を解析し、エラー行にQuickfixを飛ばし、かつ現在のコンテキストを維持したまま浮動ウィンドウで表示したい」といった要求は、汎用ツールでは満たせません。

NeovimのLua APIを直接叩くということは、エディタのコアエンジンに直接命令を送るということ。これは、マクロを組むような低レイヤーの操作ではなく、エディタそのものを拡張する「開発」です。

—

2. 基盤となる「Job API」と「浮動ウィンドウ」の概念

今回作成するタスクランナーは、以下の3つのコンポーネントで構成されます。

1. `vim.fn.jobstart`: 非同期プロセス実行。メインスレッドをブロックせず、バックグラウンドでテストやビルドを回します。
2. `vim.api.nvim_open_win`: 浮動ウィンドウの生成。現代的なUIの要です。
3. `vim.api.nvim_buf_set_lines`: バッファへの流し込み。実行結果をリアルタイムに反映します。

これらを組み合わせることで、「非同期で動く、自分専用の通知センター」が出来上がります。

—

3. ステップ・バイ・ステップ:タスクランナー実装

まずは、`init.lua` またはプラグインディレクトリの中に、以下のコードを書いてみてください。

— タスクランナーのメインロジック
local function run_task(cmd)
— 1. 浮動ウィンドウ用のバッファを作成(表示用)
local buf = vim.api.nvim_create_buf(false, true)

— 2. ウィンドウ設定(画面中央に表示)
local opts = {
relative = ‘editor’,
width = 80, height = 20,
row = 5, col = 5,
style = ‘minimal’,
border = ‘rounded’
}
local win = vim.api.nvim_open_win(buf, true, opts)

— 3. 非同期ジョブの開始
vim.fn.jobstart(cmd, {
stdout_buffered = true,
on_stdout = function(_, data)
if data then
— 結果をバッファに追記
vim.api.nvim_buf_set_lines(buf, -1, -1, false, data)
end
end,
on_exit = function()
— 完了を通知(必要に応じて)
vim.api.nvim_buf_set_lines(buf, -1, -1, false, {“— TASK COMPLETED —“})
end
})
end

— 4. ユーザーコマンドとして登録
— :RunTask npm test のように呼び出せるようになります
vim.api.nvim_create_user_command(‘RunTask’, function(opts)
run_task(opts.args)
end, { nargs = 1 })

このコードが何をしているのか?

  • `jobstart`: この関数が呼び出された瞬間、NeovimはOSに対してシェルコマンドを投げます。重要なのは、Neovim本体の操作を全く止めないことです。
  • `on_stdout`: 出力データを受け取るたびに発火するコールバックです。ここを拡張することで、ログの色付けやエラーの自動抽出(Regexによる解析)が可能になります。

—

4. 精度を高めるための「次の一手」

このタスクランナーを「現場で使えるレベル」に昇華させるために、以下の拡張を検討してみてください。

  • Quickfixリストとの統合: `on_stdout`の中で、特定の行にファイルパスが含まれていれば `vim.fn.setqflist` を呼ぶ。これで、テストエラーの行に一瞬でジャンプできるようになります。
  • キーバインドの最適化:

vim.keymap.set(‘n’, ‘t’, ‘:RunTask npm test‘, {silent = true})

このようにマッピングすれば、コーディング中に「指が勝手に動く」レベルの速度でテストが実行されます。

—

最後に:なぜこれをやるのか

ツールを自作するということは、「自分の作業効率をハックする」という特権を得ることです。

世の中の便利なツールは、誰かの「あったらいいな」で作られたものです。しかし、あなたのプロジェクト、あなたのコードスタイル、あなたのマシン環境で最も効率が良いのは、「あなた自身が作り上げたツール」に他なりません。

このLuaの基礎をマスターすれば、次は「Gitの差分を動的に表示するパネル」や「プロジェクト内のドキュメントを検索する窓」など、あなたの指先一つで何でも作れるようになります。

さあ、エディタを「使うもの」から「創るもの」へ。この小さな一歩が、あなたのエンジニアとしての生産性を、数ヶ月後には劇的に変えているはずですよ。

タイトルとURLをコピーしました