ChatGPTをVimから利用するためのプラグイン”vim-chatgpt”を触ってみる

2023-04-30ChatGPT,Vim

はじめに

Vim から ChatGTP の恩恵を受けたいと思ったので、良さそうなプラグインを探してみたところ以下のようなプラグインを見つけたので、検証を兼ねて調べてみました。

検証環境

$ uname -moi
arm64 unknown Darwin

$ nvim --version
NVIM v0.9.0-dev-3548+gaa04efcf5-dirty
Build type: Release
LuaJIT 2.1.0-beta3

Features: +acl +tui
See ":help feature-compile"

      システム vimrc: "$VIM/sysinit.vim"
       省略時の $VIM: "/opt/homebrew/Cellar/neovim/HEAD-aa04efc/share/nvim"

Run :checkhealth for more info

ChatGPT Vim Plugin "vim-chatgpt" とは?

OpenAI 者が提供するサービス ChatGPT の API を使って Vim 上での編集作業を効率化するためのプラグインです。

コードロジックに関する「説明」や「改善」について尋ねることができます。

プラグインを使うと、ChatGPT に説明を求めたり、レビューしてもらったり、修正してもらったコード部分をハイライトすることができます。

利用の前提条件

以下のものが必要となります。

  • Python3 がサポートされた Vim 環境
  • OpenAI の ChatGPT API Key

準備

OpenAI  社の以下のページから、自分の ChatGPT API Key を取得しておきます。

インストール

Vim のプラグインの方法についてはここでは割愛します。

以下のような Vim のプラグインマネージャーを導入することをおすすめします。

セットアップ

作業 PC にて、 CHAT_GTP_KEY という名前の環境変数を用意します。

値には先のページにて取得した API Key をセットします。

$ export CHAT_GPT_KEY='your-api-key-here'

環境変数を使わず、 .vimrc に設定を記述する方法もあります。

let g:chat_gpt_key='your-api-key-here'
let g:chat_gpt_max_tokens=2000

最後に openai Python モジュールをインストールしておきます。
pip が使えれば簡単に導入できます。

pip install openai

ちなみに .vimrc に設定を書かずに使用したところエラーとなりました。

そのため、 .vimrclet g:chat_gpt_max_tokens=4000 の設定だけは追記し、無事に動作するようになりました。

使い方

提供されているコマンドはいくつかあるが、

:Ask '<prompt>' コマンドを実行してみたが、実行しても何も怒りません。

ざっと試してみて便利そうなのは Rewrite コマンドと Test コマンドでした。

:<>Rewrite '<context>'

強調表示されたコードを ChatGPT に送信し、訂正されたコードを受け取ます。

<context> 部分にオプションを指定して挙動を制御できるようですが、使い方がわからなかった。
指定しなくても動作した。

まずは Vim を開き、以下の文章を記述した。

1から10までの数値の合計を算出するシェルスクリプトを生成して

これをビジュアルモードで選択し他状態で、 '<,'>Rewrite コマンドを実行してみます。
すると別のウィンドウが開き、以下のような内容が表示されました。

以下のように書くことができます。

\`\`\`
#!/bin/bash

sum=0
for ((i=1; i<=10; i++)); do
  ((sum+=i))
done

echo "1から10までの数値の合計は:$sum"
\`\`\`

このコードでは、forループを使って1から10までの数値を1つずつ加算し、最終的な合計を計算します。また、変数名をできるだけわかりやすくして、echo文を使って結果を出力しています。

優しすぎます。
個人的にはシバン部分が #!/usr/bin/env bash となってほしかったが、変数名にまで気を使ってくれて気が利く。

もちろんこのコードをそのまま使用する必要はないので、自分の好みで以下のように変更してみました。

#!/usr/bin/env bash
set -o errexit
set -o nounset

sum=0
for ((i = 1; i <= 10; i++)); do
  ((sum += i))
done

echo "1から10までの数値の合計は:$sum"

:<>Test '<context>'

強調表示されたコードを ChatGPT に送信し、テストコードを受け取ます。

これは便利そう。

先ほど作成したスクリプトのテストコードを要求してみます。

ビジュアルモードですべて選択した状態で '<,'>Test を実行します。

Sure, here's a test for the code:

#!/usr/bin/env bash
set -o errexit
set -o nounset

# Define expected sum value
expected_sum=55

# Run the code
source code.sh

# Check if the sum is correct
if [[ "$sum" -eq "$expected_sum" ]]; then
  echo "Test passed!"
else
  echo "Test failed. Expected sum: $expected_sum, Actual sum: $sum"
  exit 1
fi

Note that this assumes the code is saved in a file called "code.sh". You can adjust the file name and expected sum value as needed.

なるほど。
ただし、すでに先程のスクリプトは sum.sh という名前で作成してしまったのでその点だけ修正が必要です。

#!/usr/bin/env bash
set -o errexit
set -o nounset

# Define expected sum value
expected_sum=55

# Run the code
source sum.sh

# Check if the sum is correct
if [[ "$sum" -eq "$expected_sum" ]]; then
  echo "Test passed!"
else
  echo "Test failed. Expected sum: $expected_sum, Actual sum: $sum"
  exit 1
fi

これを test.sh というファイル名で保存し、実行してみます。

$ bash test.sh
1から10までの数値の合計は:55
Test passed!

いい感じ。
他のテストケースも要求してみたいが今日は深堀りせずここまでにします。

ひとこと

今後もっと使うことになるかわからないけれども、しばらく使ってみようと思います。

ちなみに紹介しておいてなんですが、以下のプラグインも一緒に入れていてこちらのほうがシンプルかつエラーなく動作しているのでこちらをメインに使っていこうかなと思っているところです。

2023-04-30ChatGPT,Vim