AI時代(仮)のVimmer

本記事は、 [mediba Advent Calender2023](https://qiita.com/advent-calendar/2023/mediba) の2日目の記事になります。

## ヤクの毛刈りの前に

- Python環境を手を抜かずに整備しましょう :cry: 
    - Pythonに依存する我々は、[PEP668](https://peps.python.org/pep-0668/)は避けて通れません(通れるけど)。今回こそ、Pythonの環境問題と対峙しましょう(対峙したのは約2日前) :cry:
- 覚悟を決めましょう、我々には心強い仲間が出来ました 
    - Homebrew等パッケージマネージャーでVimを管理していたあなた(約2日前の私)、makeするのです。ソースコードからビルドするのです。私達には、AIという心強い味方が出来ました。
- 仲間はたくさん作りましょう
    - 心強い仲間は、OpenAI社だけではありません。たくさんのAIを~~おもちゃ~~仲間にしましょう。ヒンメルならそう言うでしょう

## ヤクの毛刈り

### macOSを整える

忙しさにかまけて、OSやXcodeののバージョンアップを怠っていませんか。
私は怠っていました。それも1年程...
~~ダウンロードがダルいけど~~AppStoreでXcodeをバージョンアップするのです
付属ツールの更新もするのです。

```
$ xcode-select --install
```

人生は長いので、Xcodeのバージョンアップくらい誤差です。でも長いですので、暇なときにやりましょう
OSにおいて重要なソフトウェアを更新すれば当然、各アプリが動かくなるので、Homebrewを使ってバージョンアップです。

```
$ brew upgrade
```

これも長いですが、じんせ(ry


### venvでPython環境を整える

少なくない方が、PEP 668に出くわしたでしょう。私も出くわしました(約2日前)

```zsh
% pip install --user powerline
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try brew install
    xyz, where xyz is the package you are trying to
    install.

    If you wish to install a non-brew-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip.

    If you wish to install a non-brew packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
```

PEP 668の解説や対処は有用な既存記事に譲るとして(ごめんなさい)、我々が考えないといけないのは、Pythonの環境問題だということです。
これがluaならまぁいいかなとスルーできるでしょう。Pythonはどうでしょう。AIと向き合うならPythonは避けて通れません。
OpenAI社がGitHubでホストしているリポジトリを覗いてみましょう。

- https://github.com/orgs/openai/repositories?language=python&q=&sort=&type=all

2023/11現在、161あるリポジトリのうち93はPythonが利用されています。
Vimmerなら容易に想像がつくことかと思いますが、pluginの導入、利用においてPythonパッケージ管理は鬼門です。
PEP 668は、その門番といえるでしょう。いまこそ、`venv`を導入して、Pythonの環境問題と持続可能なお付き合いが出来るようになるべきです。pyenvで誤魔化していた過去(約2日前)と決別するのです
対処の一例として、実行コマンドをコメントを添えて掲載してきます。
ご参考までに。

```zsh
# 既存Python環境から --user install したパッケージをrequirements.txt に出力、アンイストールする
$ pip3 freeze --user |tee requirements.txt | xargs pip3 uninstall -y --break-system-packages

# venvでPython環境をホームディレクトリ直下の .venv に作成
$ python3 -m venv $HOME/.venv

# venv管理下のPython環境をアクティベーション
$ source $HOME/.venv/bin/activate

# --user installしたパッケージをvenv管理下の環境にインストール
$ pip3 install -r ~/dotfiles/python3/requirements.txt
```

### Vimを整える

覚悟を決めて、makeでVimをビルド、インストールしましょう。
`brew rm vim`するのです。
でも`make install`が無事に完了して、`/path/to/bin/vim`出来るようになるまでしてはいけません。
約2日前の私は、勢い余って`brew rm vim`して、生死の境目に立たされました。
環境はそれぞれかと思いますので、インストールまでの実行コマンドをコメントを添えて掲載してきます。
ご参考までに。

```zsh
# GitHUbにホストされている vim/vim リポジトリをcloneしたもの
$ cd /path/to/github.com/vim/vim

# v9.0.2136をターゲットとする
$ git fetch --all --prune
$ git co v9.0.2136

# 何度もmakeするでしょうから
$ make distclean

# ビルドに必要な各パラメータを渡します
# Rubyとlauは、Homebrewで管理しているものを、Pythonはvenv管理下のものを指定しています
$ ./configure \
  --prefix=/opt/local \
  --with-features=huge \
  --enable-multibyte \
  --enable-terminal \
  --enable-cscope \
  --enable-fail-if-missing \
  --enable-perlinterp \
  --enable-luainterp --with-lua-prefix=/opt/homebrew/Cellar/lua/5.4.6 \
  --enable-rubyinterp --with-ruby-command=/opt/homebrew/opt/ruby/bin/ruby LDFLAGS='-L/opt/homebrew/Cellar/ruby/3.2.2_1/lib' \
  --enable-python3interp vi_cv_path_python3=$HOME/.venv/bin/python3 \
  CC=`which clang`

# ビルド
$ make

# ビルドの結果を確認して、パラメータに過不足がないか点検
$ src/vim --version

VIM - Vi IMproved 9.0 (2022 Jun 28, compiled Nov 30 2023 12:35:23)
macOS version - arm64
Included patches: 1-2136
Compiled by kitada@hoge
Huge version without GUI.  Features included (+) or not (-):
+acl               +file_in_path      +mouse_urxvt       -tag_any_white
+arabic            +find_in_path      +mouse_xterm       -tcl
+autocmd           +float             +multi_byte        +termguicolors
+autochdir         +folding           +multi_lang        +terminal
-autoservername    -footer            -mzscheme          +terminfo
-balloon_eval      +fork()            +netbeans_intg     +termresponse
+balloon_eval_term -gettext           +num64             +textobjects
-browse            -hangul_input      +packages          +textprop
++builtin_terms    +iconv             +path_extra        +timers
+byte_offset       +insert_expand     +perl              +title
+channel           +ipv6              +persistent_undo   -toolbar
+cindent           +job               +popupwin          +user_commands
-clientserver      +jumplist          +postscript        +vartabs
+clipboard         +keymap            +printer           +vertsplit
+cmdline_compl     +lambda            +profile           +vim9script
+cmdline_hist      +langmap           -python            +viminfo
+cmdline_info      +libcall           +python3           +virtualedit
+comments          +linebreak         +quickfix          +visual
+conceal           +lispindent        +reltime           +visualextra
+cryptv            +listcmds          +rightleft         +vreplace
+cscope            +localmap          +ruby              +wildignore
+cursorbind        +lua               +scrollbind        +wildmenu
+cursorshape       +menu              +signs             +windows
+dialog_con        +mksession         +smartindent       +writebackup
+diff              +modify_fname      +sodium            -X11
+digraphs          +mouse             +sound             -xattr
-dnd               -mouseshape        +spell             -xfontset
-ebcdic            +mouse_dec         +startuptime       -xim
+emacs_tags        -mouse_gpm         +statusline        -xpm
+eval              -mouse_jsbterm     -sun_workshop      -xsmp
+ex_extra          +mouse_netterm     +syntax            -xterm_clipboard
+extra_search      +mouse_sgr         +tag_binary        -xterm_save
-farsi             -mouse_sysmouse    -tag_old_static
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
  fall-back for $VIM: "/opt/local/share/vim"
Compilation: /usr/bin/clang -c -I. -Iproto -DHAVE_CONFIG_H -I/usr/local/opt/ruby/include -DMACOS_X -DMACOS_X_DARWIN -g -O2 -I/opt/homebrew/Cellar/libsodium/1.0.19/include -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: /usr/bin/clang -L/opt/homebrew/Cellar/ruby/3.2.2_1/lib -L/usr/local/lib -o vim -lm -lncurses -L/opt/homebrew/Cellar/libsodium/1.0.19/lib -lsodium -liconv -framework AppKit -L/opt/homebrew/Cellar/lua/5.4.6/lib -llua5.4 -mmacosx-version-min=13.5 -fstack-protector-strong -L/opt/homebrew/opt/perl/lib/perl5/5.38/darwin-thread-multi-2level/CORE -lperl -L/opt/homebrew/opt/python@3.11/Frameworks/Python.framework/Versions/3.11/lib/python3.11/config-3.11-darwin -lpython3.11 -framework CoreFoundation -lruby.3.2 -L/opt/homebrew/Cellar/ruby/3.2.2_1/lib

# インストール
$ sudo make install
```

### 仲間がたくさんいることを知る

めっちゃいる

- https://prtimes.jp/main/html/rd/p/000000249.000053344.html

~~飽きてきたので、~~ 滅気ずにブラウジングしていると見慣れたアバターと出くわしました。
ChatGPTかCopilotのpluginをインストールして手仕舞いかなと易きに流れていた自分(約2日前)にバイバイです。

![暗黒王](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27655/3f95ede4-a724-3b59-3df3-e88ede4f9004.png)


たくさんの仲間、つまり複数のAIとVim pluginを通して繋がり、仲間にすることにします。
 
| Vim plugin                                                              | AI                                    | 用途              |
| ----------------------------------------------------------------------- | ------------------------------------- | --                |
| [madox2/vim-ai](https://github.com/madox2/vim-ai)                       | [ChatGPT](https://chat.openai.com/)   | 雑談やリサーチ    |
| [Exafunction/codeium.vim](https://github.com/Exafunction/codeium.vim)   | [codeium](https://codeium.com/)       | superpower(原典は本家)なIDE |

## plugin導入

ヤクの毛刈りが終わりました。
AI時代(仮)を生き残るためのpluginを導入していきましょう。

### madox2/vim-ai

ChatGPTのpluginはいくつかありますが、[reddit](https://www.reddit.com/r/vim/comments/12io0gw/vimai_chatgpt_and_openai_plugin_new_features/)にスレがあり、[vim.org](https://www.vim.org/scripts/script.php?script_id=6048)でもホストされている[madox2/vim-ai](https://github.com/madox2/vim-ai)を導入してみます。
インストールは、READMEを参考にポチポチと。
私は、未だに[dein](https://github.com/Shougo/dein.vim)を利用しているので、dein.tomlに以下のように指定しました。
最低限のキーバインドも設定しておきます。

- dein.toml
```toml
# ChatGPT
[[plugins]]
repo = 'madox2/vim-ai'
hook_add = '''
xnoremap <leader>c :AIChat<CR>
nnoremap <leader>c :AIChat<CR>
'''
```

AI破産しないためのオプションも設定しておきます。

- $HOME/dotfiles/.vim/rc/vim-ai
```vim
let g:vim_ai_chat['options']['max_tokens'] = 500
```

- $HOME/dotfiles/.vim/vimrc
```vim
" vim-ai
execute 'source' fnamemodify(expand('<sfile>'), ':h').'/rc/vim-ai'
```

OpenAIのトークンは、下記のファイルに記載しちゃいます。

```zsh
vi $HOME/.config/openai.token
```

チャットしてみます

![624662.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27655/9b85c229-c4e5-b1f7-e37d-264554e0cc84.gif)

便利ですね。vimをインターフェイスに心強い仲間を得ることが出来ました。

### Exafunction/codeium.vim

codeiumについて、ChatGPTにvim経由で問い合わせてみました

```vim
>>> user

codeiumなにそれうまいの

<<< assistant

Codeiumは、コードエディタや統合開発環境（IDE）で使用される拡張機能を提供するプラットフォームです。
Codeiumを使用することで、さまざまなプログラミング言語に対応したシンタックスハイライト、コードの実行やデバッグ、コードの自動補完などの機能を利用することができます。
また、Codeiumはコードのバージョン管理、コードの共有、コラボレーション機能なども提供しています。
コードの効率的な開発とチームでの共同作業に役立つツールとして使われることがあります。
```


大変美味しいそうです。普通のIDEなような...
暗黒王がコントリビュートしているので、不味いわけがないです。
とにかく導入してみます

codeiumアカウントを作成しておきます。
pluginのインストールは、READMEを参考にポチポチと。
とりあえず、goのソースコードのみを対象としてみます。

- deinlazy.toml
```toml
# codeium
[[plugins]]
repo = 'Exafunction/codeium.vim'
on_ft = ['go']
````

インストールが完了したら、認証します
```vim
:Codeim Auth
```

認証が完了するも何も音沙汰が無いのが不安になりますが、早速お手並み拝見

芸が無いのですが、とりあえず`Hello, world!`してもらおうと思います。

![624672.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27655/63b8391e-a06a-5418-ab42-61f52900f6e1.gif)

スニペットがノイズかもしれませんが、3行目は `func` を入力すると、以降のコードがcodeiumから提案されている様子です👆
`Hello, world!`する旨や設定は一切していなのですが、`Hello, world!`を提案されました。
これを採用(デフォルトのキーバインドではTab)し、main.goファイルを保存、`go run`すると当たり前ですが`Hello, world!`が出力されます。
まさか人類の叡智 `Hello, world!`をAIから提案される日がくるとは...
無益な気がしなくもないですが、AI時代(仮)においても、Vimmerが生き残れると実感を得るには十分な体験でした。

vimをインターフェイスに心強い仲間をまた得ることが出来ました。

## おわりに

流行り廃りに疎い私ですが、GPTがプログラミングに与えるインパクトはとんでもないものになるということは、理解しています。
AIがVimを通して我々の知的生産をアシストしてくれる、雑談の相手になってくれるというのは、ヒューマノイドと人類の共存を題材にした[某漫画](https://mangacross.jp/comics/ai)でも描き出すことが出来なかった風景です(え
来るAIの時代においても、VimとVimmerがますます発展することを願ってやみません。
そんな期待を不安を織り交ぜて、AI時代(仮)をタイトルに入れましたが、タイトル負けした感は否めません。

当記事は、制作過程においてGPTが生成する文章だけでなく、たくさんの有用な既存記事を参照しております。

- [俺流！PEP668とうまくやっていく方法 \| スクエニ ITエンジニア ブログ](https://blog.jp.square-enix.com/iteng-blog/posts/00043-play-with-the-pep668/)
- [Vim \(Neovim\)起動時にPythonの仮想環境を準備する](https://rcmdnk.com/blog/2020/08/11/computer-vim/)
- [vim\-jp » Linuxでのビルド方法](https://vim-jp.org/docs/build_linux.html)
- and more!

ありがとうございました。

---

現在medibaでは、メンバーを大募集しています。

- [募集・応募ページ](https://www.mediba.jp/recruit)

medibaってどんな会社だろう？ と興味を持っていただいた方は、
カジュアル面談もやっておりますので、お気軽にお申込み頂ければと思います。