ChatGPT APIを使って差分からコミットメッセージを作るVimプラグインを作った
ChatGPTのAPIが使えるようになりましたね!特に、これまでと比べて料金が猛烈に安いと話題に(なってるよね!)。というわけで、早速いろいろ触っていたんですけど、ふとVimの中からコミットメッセージを作ってもらえたら自分で使うかもなーと思ったのでプラグインを作ってみることにしました。
CLIやgit hooksにかますような同様のソフトウェアはあるみたいなんですけど、自分のワークフローと合わなくて、あくまで補足する感じでVimから使いたいなと思っていたことと、そもそもずっとVimプラグイン作ってみたいなーと思っていたこともあるし、まあ別に自分だけが使う用途で全然いいやって感じもあるし挑戦してみることに。
プラグインの紹介
コードはGitHubで管理してます。なんか変な所あると思うんでもし見つけたらぜひ教えてください。あと、GitHubのスターが!とっても欲しいです!
使い方は、シンプルに:GPTCommitMsg
コマンドを実行すると、変更点を要約した内容のコミットメッセージを3つほど作ってくれるので、その中から好みのものを選択して<CR>
するとヤンクしてくれるっていうプラグインです。
ChatGPTもそんな完璧なコミットメッセージ作ってくれるわけじゃないんで、いくつかの候補から選択したくてこのような使い方にしました。
想定としては、git commit
した時に立ち上がるVim上から呼び出して、コピペしつつ必要に応じて修正するみたいにイメージしてます。なので:GPTCommitMsg
する前にgit add
などで変更点をステージしておく必要はあります。
ちなみにgpt-commit-msg.vimのコミットログはほぼこのプラグイン使って作ったやつです。
料金はもちろん差分の量によって変わってきますけど、gpt-commit-msg.vimプロジェクトくらいの小さい差分なら1コミットで0.1〜0.2円くらいですかねー。
設定
APIキー
APIキーの設定は必須です。https://platform.openai.com/account/api-keys から取得できます。
let g:gpt_commit_msg = {}
let g:gpt_commit_msg.api_key = "<YOUR_API_KEY>"
プロンプトのカスタマイズ
プロンプトを独自の内容にしたい場合は、以下2つの変数を変更したらいけます。デフォルトの内容は plugin/gpt_commit_msg.vim を見てもらえれば。デフォルトだと結果を3つだすためにThreeって書いてありますけど、そこをFiveとかにしたら例文の数を簡単に増やせます。
let g:gpt_commit_msg.prompt_header = ""
let g:gpt_commit_msg.prompt_body = ""
header,bodyとわかれてますけど大した意味はなくて、一応headerには設定っぽい内容、bodyには命令文を入れています。
送信データ量の制限
APIに送信するデータが肥大化しないように、デフォルトでは2,000行以上のデータは送信しないようにしています。増減させたい場合は、以下の設定値を変更します。
let g:gpt_commit_msg.max_lines_to_send = 2000
出力結果のカスタマイズ
APIの出力結果を置換等できるようにしています。例えば、私はコミットメッセージの文頭は全部小文字にしているんですけども、ChatGPTが出してくる結果はそうじゃないことが多いんですね。なので、ユーザーが任意のテキストを変換できるようなフィルタリング用の関数を追加できるようにしています。
文頭を小文字にする場合は以下のようにします。こういった処理が不要であれば書かなくても動きます。
function! g:gpt_commit_msg.result_filter(text) abort
return substitute(a:text, '^\(.\)', '\L\1', '')
endfunction
他には…文末にピリオドを付けるとかもできそうですね。
Vimプラグインを作ってみて
なかなか大変ですけど楽しかったですね。みんなもっとやるといい!
去年、Vimの基礎知識を改めておさらいしておくかと思い、ゴリラさんの「Vimが好きになる本」を読んで、そのときからプラグインを作ってみたかったのですよね。今回のプラグインは、結構シンプルに作れそうだったので、思いついたら即実行という感じでガーッと勢いに任せてやってしまいました。
プラグインの開発でもかなりChatGPTのお世話に。やつ、、Vimスクリプトも詳しいんですよね。文字列の置換方法とか教えてもらった思い出。READMEも雑にお願いしたらわりとしっかり作ってくれたり。
そして最も苦労したのは、実はヘルプファイルの作成という。いくつかのプラグインを眺めて、フォーマットは割と色々あるなぁというのはわかったので適当に書いてみたのですが、いざ h
コマンドを使っても補完候補にでてこない!なにこれ!
小一時間格闘してやっとhelptags
を使わないといけないということがわかるという自体…。ヘルプファイル諦めそうになった。ちゃんとしたドキュメント読まないとダメだったやつだよ…。はじめてプラグインを開発する人向けにhelptags
のことを伝えたくてこの記事を書いたと言っても過言ではない。マジでだいじ。
というわけで、わりとちゃんと必要なファイル類も用意して作れたかなあという気持ちがあり、なかなかの達成感が。今後またなんか作りたいなと思った時に挑戦しやすくなったようにも思うし、つくって良かったです。
Discussion