Neovim Gemini 連携ガイドとはじめに
このドキュメントは、Neovimエディタ内から直接 gemini
CLIをシームレスに利用するためのカスタム設定について説明します。
と、スタートしてますがこの記事の90%はgemini-cliに書いてもらっております。
gemini-cliの導入方法は各場所にてご確認ください。
動作確認、エラー頻発しましたが、コマンドからのgemini操作で修正してもらってます。
エラー発生した際、詳細内容を伝えたほうが修正が早かったです。
トークン量の節約のためこの連携はgemini-2.5-flashを使用するようにしております。
1. 機能概要
この設定は、Neovimに以下の3つの主要な機能を追加します。
- 単発質問: プロンプトで質問し、結果を新しい垂直分割ウィンドウに表示します。
- 選択範囲への操作: ビジュアルモードで選択したコードなどについて、説明、リファクタリング、テスト作成などを依頼できます。
- インタラクティブチャット: 質問と回答の履歴を保持するチャットセッションを開始します。会話の文脈を記憶し、継続的な対話が可能です。
2. 前提条件
この設定が機能するためには、以下の環境が整っている必要があります。
- Neovim: Luaによる設定が有効であること。
-
gemini
CLI:gemini
コマンドラインツールがシステムにインストールされており、ターミナルからパス指定なしで実行できる状態であること。
3. 設定ファイル
この機能に関する設定は、主に以下のファイルに記述されています。
-
~/.config/nvim/lua/utils/gemini.lua
: 機能の中核となるロジックを実装しています。 -
~/.config/nvim/lua/keymaps.lua
: 上記の機能を呼び出すためのキーマッピングを定義しています。
-- Gemini
local gemini = require('utils.gemini')
vim.keymap.set('n', '<leader>ga', gemini.ask, { desc = 'Ask Gemini' })
vim.keymap.set('v', '<leader>ga', gemini.visual_action, { desc = 'Ask Gemini about selection' })
vim.keymap.set('n', '<leader>gc', gemini.chat, { desc = 'Chat with Gemini' })
vim.keymap.set('n', '<leader>gq', ":GeminiChatEnd<CR>", { desc = 'Quit Gemini Chat' })
return M
4. 使い方
リーダーキーについて
このガイドではキーマップの表記に <leader>
を使用します。実際のキーはあなたのNeovim設定に依存します(一般的には \
や <Space>
が設定されています)。
4.1. 単発の質問
一時的な質問を素早く行いたい場合に使用します。
- ノーマルモードで
<leader>ga
と入力します。 - 画面下部に
Ask Gemini:
というプロンプトが表示されます。 - 質問を入力し、
Enter
キーを押します。 -
gemini
がバックグラウンドで実行され、画面の右側に新しいウィンドウが垂直分割で開き、実行結果が表示されます。
4.2. 選択範囲への操作
コードの解説を求めたり、リファクタリングを依頼したりする際に便利です。
- ビジュアルモードでテキスト(コードなど)を選択します。
-
<leader>ga
と入力します。 - 画面下部に
What to do with the selection?
というプロンプトが表示されます。 - 選択範囲に対して行いたい操作(例:
explain this code
,refactor
,write tests for this
)を入力し、Enter
キーを押します。 - 選択範囲の内容とあなたの指示がGeminiに送信され、結果が新しいウィンドウに表示されます。
4.3. インタラクティブチャット
文脈を維持しながら対話形式で作業を進めたい場合に使用します。
-
チャットの開始:
- ノーマルモードで
<leader>gc
と入力します。 - 画面が左右に分割され、左側に質問用、右側に回答用のウィンドウが表示されます。
- ノーマルモードで
-
質問の送信:
- 左側の質問用ウィンドウに質問内容を入力します。
-
ノーマルモードで
Enter
キーを押すと、質問がGeminiに送信されます。
-
回答の確認:
- 右側の回答用ウィンドウに、Geminiからの回答がタイムスタンプ付きで追記されます。
- 回答が完了すると、カーソルは自動的に左側の質問用ウィンドウに戻り、インサートモードになるため、すぐに次の質問を入力できます。
-
チャットの終了:
- ノーマルモードで
<leader>gq
と入力します。 - チャットセッションが終了し、質問用・回答用の両方のウィンドウが閉じます。
- ノーマルモードで
-
履歴の永続化:
- チャットの履歴は
~/.cache/gemini_chat/
ディレクトリ内のquestions.md
とanswers.md
に自動で保存されます。 - 次回チャットセッションを開始した際、過去の履歴が文脈として読み込まれます。
- チャットの履歴は
5. キーマップ一覧
モード | キーマップ | 機能 | 呼び出し先 |
---|---|---|---|
Normal | <leader>ga |
Geminiに単発の質問をする | require('utils.gemini').ask |
Visual | <leader>ga |
選択範囲についてGeminiに質問する | require('utils.gemini').visual_action |
Normal | <leader>gc |
Geminiとのチャットセッションを開始する | require('utils.gemini').chat |
Normal | <leader>gq |
Geminiチャットを終了する | :GeminiChatEnd<CR> |
Normal |
<CR> (チャット中) |
質問を送信する | require('utils.gemini')._send_question |
これで、NeovimからシームレスにGeminiの力を借りることができるようになりました。
6.おわりに
とりあえず、このスクリプトはchromebookとAndroidのtermuxにて動作してますが、アップデートするたびに動かなくなる気がします。自分だけの力じゃこんなもん出来ないなぁと感じました。