VimConf 2023 Tiny に参加した

こんにちは、@mitubaEXです。 VimConf が 4 年ぶりに開催されると聞き、参加してきました。

この記事は参加してきて聞いてきた各セッションの感想記事です。

vimconf.org

Bram Moolenaar the Creator of Vim

Bram 氏の Vim を開発してきた半生をまとめたお話でした。

Vim は vi をクローンして作られ、当時は vi クローンが多かったとのこと。 Bram氏は Vim 以外にも

  • a-a-p: 依存関係を解決して build してくれる。Vim を build するためのもの
  • Agide: a-a-p プロジェクトの一つとしてのIDEVim が中で利用されている
  • Zimbu: プログラミング言語、Web アプリも開発できた。 protoc での通信を実現
  • ウガンダへの寄付: ICCF Holland への寄付の 99.5 % を寄付。寄付すると追加機能の投票に参加できる。

などの貢献があるとのこと。 いかにして稼いでいたのかはそこまで明かされていないらしく、Google に入社して、Vim に commit したりしていたらしい。 昔の Vim のリリースは手動で、メールに diff を送りそれを議論し patch ファイルとして適用される。 ハンドルネームではやりとりできなかったが、thinca さんがそれを破ってしまったらしいw

変更提案が reject されることは多いらしく mattn さんも socket 通信の提案を何回も reject されたとのこと。 そして Vim の非同期処理がいくつかの方によって作られ、変更提案がされたが reject されたらしくその時に fork して作られたのが Neovim とのこと。

今は Neovim で実装された terminal 機能が Vim に入っていたり、Vim9Script が開発されたりと Vim 側も新しい Vim Script をリプレイスする試みもあり Neovim と Vim で互いに良い吸収をし合っているなと感じました。

Vim の歴史を知れる良い発表でした。

Revolutionizing Vim/Neovim Plugin Development ~ An In-Depth Look into Denops

docs.google.com

github.com

denops の利点は deno の single binary を利用するだけで良く、導入が楽。かつ TypeScript で書け型、表現力が高い。かつ速度もある。 しかし denops の process を起動するのに時間がかかるとのことで、Vim を高速に立ち上げたり閉じたりしたい人にとっては少し大変らしい。

いつ使うか?という問いには Node の資産が利用できるので、それを利用したい時に利用するのが良いとのこと。

カニズム的にはVim を起動すると denops の process が起動し、plugin ごとに worker を立てるイメージ。 denops が中間に存在するので、vim の呼び出し方法を plugin 側は知らなくても良い仕組みになっている。 この denops の process の起動を待たないといけなかったりするが、前もって立てておくことも可能。

Plugin 開発では LLM 関連のものを deno だとそのまま書けたりして便利。 Vim Script でやれることは、大抵 denops にも module として用意されていて全て TypeScript で書くことも可能とのこと。 ここのバランスに関しては個人のバランス感覚に委ねられている。

この話を聞いて、denops というものがどういうものなのかの一端を知ることができた。 TypeScript を業務で開発している人だと denops の plugin 開発などは親和性が高くて良さそうだと思った。

Looking back at vim meetup

speakerdeck.com

ゴリラ.vim を開催しているゴリラさんのお話。 なぜ開催しようとしたのかと、続けるためにしていることみたいな話をお聞きしました。 確かに、Vim の話で延々と話し続けられるのは分かるなぁと思い聞いていました。 Vimmer と会える機会を提供してくれている ゴリラさんには凄く感謝だなぁと思い聞いておりました。

Developing a Vim plugin with Ruby, or when in Ruby do as the Rubyists do

speakerdeck.com

Plugin を Ruby を使って開発する話。 RubyVM::AbstractSyntaxTree class を利用したい。Ruby は stdlib として入っている。 これを利用し、rspec でありがちな subject 何してるのか分からん問題を解決する plugin を作った。

現在の context の subject を RspecCurrentSubject command で表示できる。

利用は gem install neovim で外部依存を入れれば使うことが可能。 rubyeval を呼べば OK、簡単。

話を聞いてて、そもそも subject がやっぱり利用方法によって可読性を下げることがあるよなぁとは本当に思うことで、 それを Vim で対策をしてみるのはエレガントだと思った。

Modern techniques for implements insert mode plugins / Why use IME within text editor?

github.com

skkeleton の話、Vim から出ずに skk ライクの入力を可能にする plugin。

skk = simple kana to kanji conversion program、 開発は denops でされたとのこと。

昔は、insert から function を呼び出す時はモード移行が必要だったりした。 今は、Neovim の <Cmd> で実行すればモード内で実行されるだけになる。便利

また skk の変換候補が昔は echo エリアに変換候補が出ていて、視線の移動が辛かった。 popupwin/floatwin で候補を出すことで解決した。

何故 vimskk?という話では、LinuxIME は不安定だったりし、Vim の中で動くことを考慮する plugin を作れば、どんな環境でも動かせる。 しかしながら Vim の外でも使いたくなる。これはなかなか難しい話だった。

自分も skk を利用しているが AquaSKK を導入してしまっており、OS をアップデートすると基本壊れて困ったりしている。 Vim 内で日本語入力を行うという選択肢を取れるなら skkeleton は非常に良いものだと思った。

Boost your vimrc with some template techniques!

zenn.dev

vimrc の拡張方法についてのお話。

autoload, plugin で vimrc を分ける。vimrc# name space を生やして運用すれば他の plugin とメソッド名などが競合することも無い。

また Vim Script には $'' で文字列内に変数展開できるテンプレートリテラルが存在している。これも便利に利用できそう。

そして vimrc に vital.vim を入れる。

github.com

vital.vim には Optional や Either が存在しており、パターンマッチっぽい書き方で制御が可能になっている。(具体的には返す値のみをメソッドの引数にするのだが) ここで Maybe モナドのように書くコードサンプルが登場し会場が盛り上がりました。 しかし Vim には v:null というものがあり、Nothing を表現することは可能。しかしOptional に提供されているインタフェースで値を扱うことで安全に値の取り回しができる。 これは非常に良いこと。

発表を聞いて、Haskell のテイストが出てきて凄く楽しかった。 他の言語のテイストで書く方法が提供されていると選択肢が増えて開発者的には嬉しいことだと思った。

終わり

VimConf のお話は全て楽しかったです。 Vim というエディタで様々な言語を書く人たちが様々な課題を解決している。 自分ももっとコードを書いて様々な課題を解決してみたいと思った。