Vimエディタの中で、ChatGPTにコーディングを手伝って貰おう

(更新

Integrating ChatGPT with the Vim text editor. Let ChatGPT write the program inside the editor.

相模原市で IoT 設計を受託しているファームロジックスです。

以前に、GitHub Copilot というサービスが話題になりました。テキストエディタでプログラムコードを書いているときに、自然文で指示をすると(コメントを書くと)、AI がプログラムコードの断片を書いてくれる、というものです。

つまり、プログラマ(我々)が機長だとすると、AI が副操縦士(copilot)だという訳です。面白いネーミングだと感心しました。

前々回前回の記事で取り上げたように、巷では ChatGPT にプログラミングを手伝って貰うという話題で持ちきりです。世の中の優秀な方々が、ChatGPT と何を組み合わせたら面白いことができるだろうと、毎日、頭をひねっている様子が目に浮かびます。

今回も、ChatGPT にプログラミングを手伝って貰う話ですが、テキストエディタに ChatGPT を統合するというテーマを取り上げたいと思います。最近の若いプログラマの方はあまり利用なさらないかも知れませんが、vi(Vim)というテキストエディタには根強いニーズがあるようで、Vim に ChatGPT をインテグレーションするというプロジェクトを見つけました。

テキストエディタと、ChatGPT のウェブ UI の間を行ったり来たりすることなく、テキストエディタの中だけで作業ができるという訳で、これは便利そうなアイデアです。

どんなことができるんだろう?

インストール方法は後回しにして、まずはどんなことができるか御紹介しましょう。

インストール後に Vim(以下の例では gVim)を開いたら、コロン(:)に続けて、こんなふうに入力します。

2つの引数を取る関数で、その引数の最大公約数を返すものを書いてください。

あくまでも例ということで、つまらん課題ですが御容赦ください。

すると、こんな形で答えが返ってきます。

以下は、2つの引数の最大公約数を返す関数の例です。この関数は、ユークリッドの互除法を使用して最大公約数を計算します。 ```python def gcd(a, b): while b != 0: a, b = b, a % b return a # 例をテストする num1 = 24 num2 = 36 result = gcd(num1, num2) print("最大公約数:", result) ``` この例では、`gcd`関数は2つの引数`a`と`b`を受け取ります。`while`ループを使用して、`b`が0になるまで、`a`と`b`の値を更新します。ユークリッドの互除法によって、最終的に`a`には最大公約数が格納されます。最後に、結果を出力します。 この例では、`num1`に24、`num2`に36を与えてテストしています。最大公約数は12ですので、出力は「最大公約数: 12」となります。

おお、なかなか便利そうです。

vi エディタユーザーは(Emacs ユーザーもそうだと思いますが)、何か作業をするときにマウスを操作するのを嫌うので、プログラミング中の作業がエディタの中で完結するというのは、喜ばれそうです。

次に、関数に docstring でコメントを書いて貰いましょうか。

:Ask 'docstring形式でコメント(英語)を追加してください。' 

と入力します。すると、次のようになりました。

素晴らしいですね。

ところで、このソフトウェア(Vim プラグイン)の優れたところは、何でも :Ask で指示するのではなく、次のような専用のコマンドが数多く用意されているということです。

  • :<>Review
  • :GenerateCommit
  • :<>Explain
  • :<>Rewrite
  • :<>Test
  • :<>Fix
  • :<>Document

ここで <> というのは、エディタで編集中のプログラムコードの一部を選択して指示を与えるという意味です。vi ユーザーの方ならお分かりですね?  V コマンドでヴィジュアルに選択することもできるので、例を示しましょう。

バックグランドが灰色になっている部分が選択部分です。コードを選択したら、コロン(:)を押して、Explainというコマンドを入力してみましょう。この関数の説明をしろ、という訳ですね。

こんな感じです。

すると、次のような結果が得られました。

いいですね!

ちなみに、V コマンドでビジュアルに選択することなく、往年の vi ユーザーならば、:.,+3とか、:.+1,$ のような指定もできますので、御安心を!

インストールの話

この Vim プラグイン vim-chatgpt には丁寧な README が付いていますので、インストールそのものは難しくありません。私は NeoBundle を使ってインストールしました。

問題はその後です。

このプラグインは Python の openaiライブラリを利用するので、エディタの中から Python を起動するのですが、私のように pyenv を使用していると、openai がインストールされているバージョンの Python を正しく認識してくれない、ということがあります。

私の場合は、.vimrcの先頭に次のような記述をすることで対応しました。

set pythonthreehome=/Users/yokoyama/.pyenv/versions/3.9.11

つまり、pyenv でインストールした 3.9.11 にopenaiライブラリが pip install されている、ということです。これで無事に動くようになりました。

ちょっとした改良

ところで、vim-chatgptには ChatGPT との対話の言語(日本語とか英語とか)を指定する機能があるのですが、私のように、会話は日本語がいいけど、プログラム中のコメントは英語がいいな、という方もあるでしょう。

そこで、次のようなパッチを考えてみました。(コミット 0f3d4fc に対する修正です。)

diff --git a/chatgpt.vim b/chatgpt.vim
index 5cbc81b..b721474 100755
--- a/chatgpt.vim
+++ b/chatgpt.vim
@@ -45,6 +45,10 @@ if !exists("g:chat_gpt_lang")
   let g:chat_gpt_lang = ''
 endif
 
+if !exists("g:chat_gpt_comment_lang")
+  let g:chat_gpt_comment_lang = ''
+endif
+
 " Function to show ChatGPT responses in a new buffer
 function! DisplayChatGPTResponse(response, finish_reason, chat_gpt_session_id)
   call cursor('$', 1)
@@ -97,7 +101,9 @@ def chat_gpt(prompt):
   model = str(vim.eval('g:chat_gpt_model'))
   temperature = float(vim.eval('g:chat_gpt_temperature'))
   lang = str(vim.eval('g:chat_gpt_lang'))
+  comment_lang = str(vim.eval('g:chat_gpt_comment_lang'))
   resp = lang and f" And respond in {lang}." or ""
+  resp += comment_lang and f" But code comments must be in {comment_lang} always." or ""
   systemCtx = {"role": "system", "content": f"You are a helpful expert programmer we are working together to solve complex coding challenges, and I need your help. Please make sure to wrap all code blocks in ``` annotate the programming language you are using. {resp}"}
 
   try:

これで、chat_gptを Japanese にして、chat_gpt_comment_lang を English にすれば、チャットは日本語で、コメントは英語で、ということができます。

ただし、なぜか、指定した通りの言語にならないこともあります。もう少し検討が必要そうです。

もう一点。本当は GPT-4 モデルを使用してみたかったのですが、まだ、私の OpenAI API 利用料金が US$1 に達していない、ということで、GPT-4 モデルは利用できませんでした。今後、機会があったら試してみたいです。

今後もオープンソースと AI を活用して、ソフトウェア設計者の皆様をファームロジックスがお手伝いしていきたいと考えております。

お問い合わせはお気軽に!

お問い合わせを頂いた後、継続して営業活動をしたり、ニュースレター等をお送りしたりすることはございません。
御返答は 24時間以内(営業時間中)とさせて頂いております。もし返答が届かない場合、何らかの事情でメールが不達となっている可能性がございます。大変お手数ですが、別のメールアドレス等で督促頂けますと幸いです。