Neovim Gemini 連携ガイドとはじめに
このドキュメントは、Neovimエディタ内から直接 gemini CLIをシームレスに利用するためのカスタム設定について説明します。
と、スタートしてますがこの記事の90%はgemini-cliに書いてもらっております。
gemini-cliの導入方法は各場所にてご確認ください。
動作確認、エラー頻発しましたが、コマンドからのgemini操作で修正してもらってます。
エラー発生した際、詳細内容を伝えたほうが修正が早かったです。
トークン量の節約のためこの連携はgemini-2.5-flashを使用するようにしております。
1. 機能概要
この設定は、Neovimに以下の3つの主要な機能を追加します。
- 単発質問: プロンプトで質問し、結果を新しい垂直分割ウィンドウに表示します。
- 選択範囲への操作: ビジュアルモードで選択したコードなどについて、説明、リファクタリング、テスト作成などを依頼できます。
- インタラクティブチャット: 質問と回答の履歴を保持するチャットセッションを開始します。会話の文脈を記憶し、継続的な対話が可能です。
2. 前提条件
この設定が機能するためには、以下の環境が整っている必要があります。
- Neovim: Luaによる設定が有効であること。
-
geminiCLI: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にて動作してますが、アップデートするたびに動かなくなる気がします。自分だけの力じゃこんなもん出来ないなぁと感じました。