Focusing on ChatGPT’s impact, this post explores advanced text editor configurations for Vim, aiding programmers in managing files and automating tasks more effectively.
相模原市で IoT 設計を受託しているファームロジックスです。
前回のブログ記事を書いてから、1ヶ月近くが経ってしまいました。取引先様向けの案件が少し落ち着いたので、この 1ヶ月間に見つけたネタを、少しまとめてみたいと思います。いずれも ChatGPT 関連です。
得意でない分野のコーディングは ChatGPT に相談しよう
どんなテキストエディタを使ってますか?
私事ですが、私は、テキストエディタは vi(Vim)と Emacs の両刀遣いです。これは学生頃からずっと続いていて、基本的に、プログラミングには vi、日本語を含む文章の執筆には Emacs を使っています。
御存知のように、いずれのエディタも、プログラマブルにカスタマイズ可能な柔軟性の高いエディタなのですが、1990年代頃はともかく、周囲に Emacs LISP で init.el をスラスラ書けたり、Vim のマクロを書けたりする人を見つけるのは難しいのではないでしょうか。私が学生の頃は、大学の研究室でそんな話をすると、「どこそこ研のナントカさんが、Emacs LISP に詳しい」なんていう助けを得ることもできましたが、一般企業の勤務、あるいは自営業などでは、それも夢でしょう。
Vim でこんなことをしたい
そんな折、Vim エディタで以前から「こんな機能があったら良いのに」と思っていた機能がありました。
いま、Vim で 2つのバッファ(ウィンドウ?)を開いており、a というファイルを編集しているとしましょう。そのとき、新しいファイル b を編集したいのですが、a を参考にしたいので、隣のウィンドウに a を移動して、続けて表示しておいて欲しい。そんなことはありませんか?(私だけかも)
つまり、最新の編集中のファイルは横に押しやって(プッシュ)、新しいファイルを現在のウィンドウで開きたいのです。私の場合は通常、2つのウィンドウを左右に開いて、Ctrl-w + l、Ctrl-w + h で左右にフォーカスを移動しながらファイル編集することが多いです。大抵、メインのウィンドウは左側で、右側のウィンドウのソースコードを参照しながら編集します。そんなとき、現在編集中のファイルを右に押しやり、新しいファイルを左側のウィンドウで開きたい、ということです。
Vim のマクロなんて書いたことない…
問題は、私は Vim マクロなんてまったく書いたことがない、ということです。いろんな拡張機能を追加したり、ネット上の情報を参考に .vimrc を編集したことはありますが、新しい機能の設計なんて無理、と思っていました。
しかし、思いつきました。それこそ、ChatGPT に聞いてみたら良いのではないでしょうか!?
ChatGPT にマクロを書いて貰った
以下、チャットを全て列挙すると長くなりすぎますので、ポイントだけ押さえて御紹介します。今回は、ChatGPT Plus の GPT-4 エンジンを使用しています。
私:
vim でいま、2つのウィンドウを開いています。カーソルのあるウィンドウでは a.py を編集し、別のウィンドウでは b.py を編集しています。このとき、新たに :3b とか :e とかのコマンドでファイルを開いたとき、b.py のウィンドウにa.py を動かし、a.py のウィンドウで新しいファイルを開くことはできませんが、つまり常に興味のある最新の 2つのファイルが画面に開いていて欲しいです。あまり参照していないファイルは、ウィンドウから追いやりたいです。
ChatGPT:
Vim で複数のファイルを効率的に扱いたいというご要望にお応えするために、特定の Vim のプラグインやカスタムコマンドを使用することが一つの解決策となります。ただし、ご質問の内容に直接対応する既存のコマンドや設定はないため、独自の関数を作成するか、プラグインを活用する必要があります。
以下に、Vim での作業を効率化するための一般的なアイデアをいくつか提案します。
(略)
私:
以下を自動化できないでしょうか。
-
- Ctrl-w r で、ウィンドウをスワップする
- Ctrl-w w でウィンドウを移動する
- :Nb コマンドで隠れているファイルを開く
(略)
この後。いくつかのやり取りがありましたが、最終的に次のようなマクロを書いてもらうことができました。
function! NextBuffer(arg)
" 引数が数字の後ろに 'b' が付いている場合、'b' を取り除く
let trimmed_arg = substitute(a:arg, '\v(\d+)b$', '\1', '')
" 引数が数字の場合は、そのバッファを開く
if trimmed_arg =~ '^\d\+$'
execute "normal! \<C-w>r"
execute "normal! \<C-w>w"
execute trimmed_arg . 'b'
" 数字でない場合は、引数をファイル名として開く
else
execute "normal! \<C-w>r"
execute "normal! \<C-w>w"
execute 'edit' a:arg
endif
endfunction
" :NB コマンドを定義し、ファイル名の補完を可能にする
command! -nargs=1 -complete=file NB call NextBuffer(<f-args>)
使い方ですが、まず、:ls コマンドで編集中のファイルを確認します。
- もし、:ls で 3番目と表示されたファイルをメインで開き、現在編集中のファイルをプッシュしたい場合には、:NB 3 とします。間違えて、:NB 3b とタイプしても大丈夫です。
- もし、新たに foo というファイルを編集したいときは、:NB foo とします。ファイル名の補完も可能です。
痒いところに手が届くようになり、とても嬉しいです。ChatGPT、ありがとう!
ChatGPT にソースコードを示すとき、いちいちエディタを開きたくない
ChatGPT にプログラミングを手伝ってもらうとき、現在設計中のソースコードを示すことが多くあります。たとえば foo.py というファイルを示したいとき、いままでは foo.py を Vim で開き、それを Cmd-a + Cmd-c で OS のペーストバッファにコピーして、ウェブブラウザのチャット画面に貼り付けていました。
でも、それって面倒くさい!!
ところで、そのような時に ChatGPT のファイルアップロード機能を使ってしまう方があるかも知れません。現在の GPT-4.5 Turbo では、それはやめたほうが良さそうです。ソースコードを文脈で示すのではなくアップロードすると、ファイルのアナライザが立ち上がってしまい、余計なことを始めます。
アップロードではなく、チャット画面へのコピペがお勧めです。私は
```py 〜 ```と Markdown で囲うことが多いですが、特にそんなことをしなくても大丈夫のようです。
以下は OS 依存の話で恐縮ですが、macOS の場合、これをコマンドラインで容易に実現することができます。実は、これも ChatGPT に教えて貰いました。
はい、結論です。いま、シェルで対話しているときに foo.py をバッファにコピーしたいとします。macOS では、次のようにしてバッファにコピーできます。
$ pbcopy < foo.py
そんなコマンドがあったんだ。私は macOS を 10年以上使ってましたが、知りませんでした。ちなみに、このコマンドは標準入力をうまく扱えるので、
$ git diff | pbcopy
なんてこともできます。便利ですね!
追記: Linux のデスクトップ環境では、xclip というツールがあるようです。
うわ、間違えてシフトキーなしで Enter キーを押してしまった!
皆さんは、ChatGPT のチャット中に、こんな経験はありませんか? 長い文章を入力している最中に、Shift-Enter(ChatGPT に送るのではなく、ただ改行を入れる)と間違えてただの Enter を押してしまい、ChatGPT に読み込まれてしまう、というミスは多いはずです。特に、日本語入力では FEP の変換時に Enter を多用するので、このミスは欧米人に比べてずっと多いはずです。
そんな折、こんな便利なブラウザプラグインを見つけました!
このプラグインは、Google Chrome 用にも Mozilla Firefox 用にも開発されているようで、多くの方が日頃から慣れたウェブブラウザで利用できそうです。
使い方は簡単です。(間違えて?)Enter キーを押しても ChatGPT にテキストは送られず、Shift-Enter と同じ扱いになります。その代わり、Ctrl-Enter を押すことで、テキストを ChatGPT に渡すことができます。
ただし…、と言ってはなんですが、普段から Ctrl キーに左指を乗せるようになってしまうと、元の木阿弥です。普段は、小指を隠して(?)Ctrl キーから離しておきましょう。
最後の小ネタ: もはや日本語入力 FEP なんて必要なの?
これは小ネタと言えるんでしょうか。
近頃、ChatGPT や Anthropic Claude AI を活用していると、これらの AI の優秀さに感じ入りますが、同時に、Windows や macOS の日本語入力 FEP(IME, macOS JIM, ATOK など)の不甲斐なさにガックリくることはありませんか?
普段、ひとさまが日本語入力をしているシーンを肩越しに見ることはあまりないのですが、私は 1990年頃からずっと、単文節変換、一本やりです。最新の FEP は分かりませんが、多くの場合、あまり長い文章を一気に変換しようとすると、間違えて変換を確定してしまい、かえって面倒なことになりがちです。
私は ATOK 31.2.0 を使用しているのですが(最新版でないので恐縮ですが)、正直、あまり使い勝手に満足していません。誤変換の後の、次の変換などでは、どうして今さら、この候補を表示するんだ!? といぶかしく思うほど、使い勝手を悪く感じることがしばしばです。
そんな折、ふと思いつきました。最近の大規模言語モデル(LLM)AI がこれだけかしこいのなら、もはや FEP なんて要らないのでは!?
やってみました
私:
以下のローマ字テキストを日本語に変換できますか? 自然な形で漢字を混ぜてください。
“kyou no kaigi ha, 2 ji kara hajimarimasu. juuyou na kaigi nanode, zennin shusseki site kudasai.”
ChatGPT:
「今日の会議は、2時から始まります。重要な会議なので、全員出席してください。」
どうでしょう。ChatGPT の機能にぜひ、ローマ字テキストで入力したら、それを漢字交じりの日本語として表示し、チャットを続けるような機能を搭載して欲しいところです。日本語で ChatGPT を利用するユーザーは、あまり多くないのかな。期待するのは厳しいかな…
今日はここまで。