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)を開いたら、コロン(:)に続けて、こんなふうに入力します。
あくまでも例ということで、つまらん課題ですが御容赦ください。
すると、こんな形で答えが返ってきます。
おお、なかなか便利そうです。
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 を活用して、ソフトウェア設計者の皆様をファームロジックスがお手伝いしていきたいと考えております。