このエントリを書いた頃から、codecompanion.nvim を使ってAIと対話してプログラムを書くことを意識して行なってます。 使い始めてしばらく経ち、見えてきたことや感じたことがあるので、現状の設定と所感をまとめておきます。
現状の設定
現在の設定は以下に置いてあります。
今のところ、手軽に利用できる GitHub Copilot のみを使っています。
ドキュメントによると、さまざまなモデルを指定できるようですが、僕は今のところデフォルトのままで運用しています。1
タスクの特性に応じて他のモデルも試してみたいのですが、まだそこまで手が回っていません。
チャット履歴の保存・管理
コミュニティ発のチャット履歴管理用の拡張プラグインがリリースされたので、現在はそれを利用しています。
チャットの自動保存やタイトルの自動命名に対応していて便利です。
僕は基本的にエディタを終了するタイミングでタスクも完了しているため、チャット履歴の自動復元機能はオフにしています。
slash command とファイル共有
チャットバッファでAIにコンテキストを渡すには、変数とslash commandの2つの方法があります。
変数を利用する場合、は#buffer のTODOを解消して のようにAIに指示することで、バッファの内容を共有しつつタスクを依頼できます。#buffer は直前にカーソルがあったバッファの内容を表す変数です。
#buffer の他には、#lsp や #viewport が定義されてます。詳細は、変数のヘルプ を参照してください。
slash command はより自由で、例えば /file slash commandがあります。
/file を実行すると、ファイル選択pickerが起動されファイルを選択することでAIのコンテキストに追加できます。
この他にも バッファを共有する /buffer やWeb上のコンテンツを共有する/fetch 、ターミナルバッファの内容をAIに読ませる/terminalがあります。
僕は、/file と /fetch を頻繁に利用してます。
AIへの前提情報共有
AIに良い応答をさせるには、.cursorrulesや.github/copilot-instructions.md に纏めた前提情報を渡すことが求められます。
codecompaion.md にも workspace 機能と言って、前提情報を纏めて渡す仕組みはありますが、専用の形式なので利用者が自分のみの状態だとメンテコストが掛かるので利用しにくいです。
そのため、僕は任意のファイルを選んでコンテキストに追加できる、slash command の /file を使って手動で選択して共有してます。
ただし、デフォルトではファイルの候補に . で始まるファイル(つまり、.github/copilot-instructions.md や .cursorrulesなど)が表示されません。
そのため、ファイル選択用のpicker に snacks.nvim を指定し、さらに隠しファイルを表示する設定を加えています。
picker を指定する際にオプションを個別に渡す手段はなさそうだったため、グローバルな設定で対応しています。
チャットバッファを開いた時に自動で共有しても良いですが、やらせたいタスクにとって不要な場合もあるので都度選んで共有してます。
コードレビュー用のカスタムプロンプト
PRのレビューの時にAIの力を借りられると便利そうだったので、差分を共有してレビューを依頼するカスタムプロンプトを定義しています。
ただ、GitHubから直接レビューしてしまう時が多いので利用場面は少ないです。 Copilot review で済んでしまう場合が多いことも理由の一つです。
エージェントモード
codecompaion.nvim でエージェントモードを使う時は、@で始まるツールを使います。2
例えば、@file 1~10まで足し算する関数を実装して のようにチャットバッファで指示するとAIが自分でファイルを選んで作成、編集などをして実装します。
基本的には差分を表示してくるので、その差分に対して 適用してと追加で指示を出すと実際にファイルを更新してくれます。
指示の与え方が悪かっただけだと思いますが、既存のファイルを新規作成しようとして失敗することがありました。その時は 既存のファイルを編集して と追加で指示して軌道修正させたり、もう一回やって のような曖昧な指示でも繰り返すと原因を理解したのか、AIが編集に切り替えて成功しました。
@web_search 〜〜について調べて のようにするとWeb上のコンテンツも検索可能なようですが、まだ利用経験はありません。
今後はモデルの切り替えやプロンプト設計など、もう少し使いこなしてみたいと思っています。