🤖

NeovimからChatGPTを使えるようにするプラグインを作った

2023/03/26に公開

最近、ChatGPTがtwitterを騒がせていますね。
僕も仕事の際に補助的な役割で使わせてもらっているんですが、ChatGPTがない頃に戻るのが難しいくらいに便利です。ただ、ChatGPTのためにChromeのウィンドウに毎回カーソルを持ってきたりするのが結構めんどくさかったので、今回はVim(Neovim)の中からChatGPTを触れるプラグインを作ってみました。
まだ全然開発途中なのでバグが色々潜んでいると思いますが、一応動くようになったので紹介したいと思います。

作ったもの

https://github.com/IwasakiYuuki/ai-assistant.nvim

こちらのリポジトリで公開しています。
今回はNeovimの機能であるリモートプラグインを使って作っているので、ほとんどPythonのファイルになっています。

機能

  • ChatGPTとのチャットが出来るインターフェス
  • 非同期でチャットのリクエストを送るため、ノンブロッキングな処理で邪魔にならない
  • チャット履歴の保持・リフレッシュ機能
  • チャット履歴のコピペ機能

とりあえず、今実装済みなのはこんな感じです。
一応Web上のChatGPTと大体同じような使用感な気がしますが、チャットの保存機能(セッション機能的な)やユーザ・AIの過去のメッセージ編集機能などはまだ未実装です。

インストール

lazy.nvimを使っている方用にインストール方法を書いています。
(設定項目がほぼないので、他のパッケージマネージャでもあまり違いはないですが)

lazy.nvim
{
  "rcarriga/nvim-notify",
},
{
  "IwasakiYuuki/ai-assistant.nvim",
  branch = "develop",
  build = ":UpdateRemotePlugins",
  dependencies = { "rcarriga/nvim-notify" },
}

リクエスト開始、メッセージ受信などの通知でnotifyを使っているので、それが入っていないと動きません(これは改善点です...w)

使い方

インターフェスの表示

READMEのUsageにも書いてあるように、AIAssistantToggleというプラグインのコマンドでChatGPTとやり取りをするインターフェスを表示します。(Toggleとあるように、表示切替をするコマンドなので閉じたいときはもう一度実行します)

設定ファイルに<leader>cなどを:AIAssistantToggle<cr>をマッピングすることでちょっと快適になると思います。

チャット送信

インターフェスが開いたら、自動的に入力用のプロンプトバッファにカーソルが入っている思います。この状態でメッセージを入力し、insertモードでEnterキーを押すとChatGPTのチャット補完(生成)が実行されます。

返信の確認

ChatGPT APIからレスポンスが返ってくると、"Message received"という通知(notifyの機能)と共にインターフェスのチャット履歴部分が更新されます。

形式としては

チャット履歴
user
<ユーザの入力 1>

AI
<ChatGPTの返答 1>

user
<ユーザの入力 2>

AI
<ChatGPTの返答 2>

...

という感じで下にチャットが追加されるようなイメージです。(ウィンドウの一番下までチャットが到達すると、自動的に一番下の最新のメッセージまでスクロールします。これ実装するときちょっと躓いた...)

あと注意点として、ChatGPT APIは基本的にこれまでのチャット履歴をすべて(ユーザ、AIどちらのも)コンテキストとして入力に加えています。そのため、脈絡のない質問をするときに不要な履歴を残しておくと課金額が一気に増えてしまうので、こまめに履歴の削除(インターフェース内にいるときはCtrl-rにマッピングしてある)をしましょう。

返信をコピペ

インターフェース内にいるときはCtrl-oでチャット履歴ウィンドウに入ることが出来ます。(入力プロンプトに戻るときはCtrl-iです。)なので、チャットの返答をコピーしてコードに貼り付けたいときには、ウィンドウに入りそのままコピー、インターフェースを閉じる、という感じでできます。

まとめ

とりあえず形になったので簡単な紹介記事を書いてみました。
まだ改善したい部分は山ほどあるので、自分で使いながらちょっとずつ開発していこうと思います。

Discussion