本セッションの登壇者
セッション動画
Vimの担当させていただくゴリラと申します。本日のセッションは「思考速度でテキスト編集、そしてVimのこれから」というタイトルで発表させていただきます。
本日のアジェンダなんですけど、大きく分けて2つあります。ひとつは「思考速度でテキスト編集」、もうひとつは「Vimの最近の動向」についてお話します。
最初に自己紹介させてください。ゴリラと申します。仕事はエンジニアやっております。
最近会社を作ったので会社もやっています。趣味はゲームとかGoとかRustとかTypeScriptとかを追いかけたり。あとは週3回ぐらい、ちょっとジム行って筋トレをしています。SNSもいちおうやってるんで、よかったらフォローしてください。Twitterもやってます。
思考に沿った速度でVimを編集する
いきなりなんですけど、このセッションを聞いている皆さんに質問です。「テキストを速く編集するにはどうすればいいと思いますか?」- このセッションではこれを考えながら聞いてください。
ぱっと雑に考えると、タイピングを速くする、ショートカットを使う、マウスの操作を把握する、あとキーボードを自作する…最後に己の思考を加速させるなど、いろんなやり方があるかと思います。
ここで、具体的にテキストを編集するときの操作を整理していこうと思います。
テキスト編集時の操作として、文字の選択だったり、入力、削除、検索、置換、カーソル移動などが挙げられますが、みなさんがよく行う操作もだいたいこの辺だと思います。
つまり選択/入力/削除/検索/置換/カーソル移動といったこれらの操作をすばやくできれば、結果的に編集速度が向上すると自分は考えています。
そしてなんと、Vimは標準でこれらの操作をすばやくできます。つまりVimとテキスト編集の親和性が非常に高いということになります。
たとえば具体例なんですけど、index.html
をindax.html
とtypoしてしまった場合、カーソルが先頭にある場合は2fare
とタイプすると、なんとさくっと修正できます。これが何をやってるかというと、2fa
で行内の2つ目のa
に移動します。移動してその後にre
を入力すると、a
をe
に書き換えることができます。
こんな感じで、Vimを使うとさくっと編集することができます。
もうひとつ具体例として、シグニチャが非常に長い関数をコピーして新しい関数を作るケースを紹介します。たとえばdo_some_super_awesome_good_things_with_people
をコピーして、do_some_super_awesome_good_things_with_gorilla
という関数を作りたい場合、さくっとコピーができます。
知らない人からすると、もはや呪文にしか見えないかもしれませんが、少し細かく解説してみます。
まずyip
で関数本体を選択してコピーします。次にG
で最後の行に移動し、p
でコピーした関数を貼り付けます。次に$
で行末に移動して、T_
でそれより左にある1つ目の_
の手前に移動します。最後にce
でpeople
を削除して、gorilla
と入力します。
もう少し詳しく説明すると、yip
というのはy
とip
に分かれます。y
はヤンク(yank)で、要はコピーをするというオペレータになります。ip
というのは、段落を表すテキストオブジェクトになります。
もうひとつ、ce
に関してはc
とe
に分かれるのですが、c
は指定した範囲のテキストを削除して、入力モードに切り替えるオペレーターになります。またe
は次の単語の終わりを表すモーションになります。
こんな感じでオペレーター/テキストオブジェクト/モーションという単語が出てきたわけですが、まとめるとこんな感じになります。
- オペレータ … ヤンク(コピー) /削除/変更といったテキストへの操作
- テキストオブジェクト …テキストをひとつのまとまりとして扱う(テキストの範囲を表わす)
- モーション … カーソルを移動するコマンドやオペレーターと組み合わせて使うことで移動した範囲がテキストへの操作範囲になる
ポイントとして、操作と操作の対象範囲の選択はエディタに関係なく、誰でもテキストを編集するときにほとんど無意識でやってることかと思います。Vimはそれらを機能まで落とし込んで提供しているというのがポイントです。
つまり、Vimを使うと、思考に沿った編集が可能になるということです。そしてテキスト編集と親和性が非常に高いともいえます。
これまでざっと話した内容を(デモで)軽くお見せします。
たとえばString
という文字があるんですけど、これを書き換えたい場合はfS
とすると、このようにカーソルが(String
まで)飛んでいくので、これを変更していくことができます。
次に、ここにu32
というのがあるんですけど、2fu
と押すと(uに)ジャンプできます。
こんな感じで書き換えていくことができるんですが、ほかにもたとえば、括弧の中を一発で消したりなどもできて、先ほどのオペレーターとテキストへの操作、そのテキストを操作する範囲を組み合わせて編集をしていくことが、Vimの醍醐味になります。
Vimの最新情報
というわけで皆さん、Vimについて少し興味が湧いてきたでしょうか。たぶん湧いてきたと思うので、そんな皆さんに向けて、Vimの動向について最後に少しお話をします。
まずVimとNeoVimについてです。
Vimは互換性を非常に大事にしているエディタです。とても慎重に開発が進められているので、目新しい機能ってあんまり入らないんですね。かと言ってまったく入らないわけではない。慎重に議論して、機能を入れているという感じです。
対してNeoVimはVimからフォークしたものなんですけど、モダンな機能をどんどん取り入れていこうという思想があって、そのため目新しい機能が入ることが多いという違いがあります。
僕はNeoVimを使っているんですが、自分の思想に合うほうを選んで使ってもらえばいいかなと思います。
Vimの最近の動向について少しお話すると、まずVimの本体にはVim scriptという言語が実装されています。プラグインや設定はこの言語で書かれてることがほとんどです。そして従来のVim scriptでは、互換性を保ちながらその性能を上げていくことが非常に難しくなっている、というのが現状です。なのでその互換性をすべて捨て、新しくTypeScript / JavaScriptライクな型付き言語をVim本体に実装していく - それがVim9 scriptです。
構文はこんな感じなんですけど、まだ開発中で変更があったり、実用にはほど遠いのですが、今後に期待というところですね。
def MapList(): list<string>
var list = ['aa', 'bb', 'cc', 'dd']
return range(1, 2)->map((_, v) => lisst[v])
enddef
ちょっと違った見方をすると、Vimというエディタには2つの言語言語処理系が住んでいるということになります。非常に珍しい、というか聞いたことがないと思うのですが、もしほかにも(そういうエディタがあるなら)ぜひ教えてください。
そしてもうひとつ、denops.vimというプラグインシステムがありまして、こちらは最近、なんやかんやで話題になっているJS/TS/WasmランタイムであるDenoを使ったプラグインシステムになっています。こちらはVim / NeoVimに両対応しています。これを使うと何がいいかと言うと、JSとかTSとかWasmとかFFIでVimのプラグインが書けることです。Rustなどの他の言語の財産が使えるので、非常に便利です。たとえばVSCodeの一部の財産が実際に使えたりします。今後に期待ですね。
NeoVimの最近の動向についてもう少しお話しします。
NeoVimはLSPビルトインというものが入りました。これは現代の開発ではなくてはならないLSPを、なんと本体に組み込んだという大胆な決断をしたものです、これによってよりLSPを使うのにプラグインが必要なくなる…のですが、かといってまったくプラグイン必要ないかというとそうではなくて、LSPの設定がわりと面倒なので、実態としてその設定をサポートするプラグインを使っているケースが多いです。
もうひとつ、ビルトインの利点として、ビルトイン周りの拡張がしやすい、つまりプラグインを作りやすいということがあります。
せっかくなので今、僕はNeoVimを使っているんですけど、こんな感じで、いろんなLSをこうやってプラグインで管理することができます。LSPだったりとか、デバッガだったりとか、Linterだったりとか、いろいろ自分で管理できるので、非常に便利になりました。
NeoVimのビルトイン関連の動向でもうひとつ、TreeSitterがビルドインされました。NeoVimは従来の色は正規表現を使っていたので、正確に色を付けられないケースがありました。そこでNeoVimはTreeSitter、もともとAtomのSyntax Highlightで使用されていたその構文解析の技術を本体にビルトインしました。これでたとえばMarkdownの構文木が取れるので、より正確に色を付けられるようになりました。編集したら、即時に構文解析して構文木に反映されるので、けっこう便利です。
あとはその構文木を使った拡張が作りやすいという利点もあります。たとえばMarkdownのコードブロックを抽出してコードを実行する、というプラグインも考えられます。
最後にluaですね。NeoVimはこれまでVim scriptを使ってきたんですけど、luaに舵を切りました。もちろん、これまでの財産はそのまま使えるのですが、今後はluaにシフトしていく感じですね。モダンなプラグインはほとんどluaで書かれていることが多いです。なので、これからはlua一強になっていきそうだなという感じがします。
まとめ - より深くVimの世界を知りたい方へ
本セッションで紹介した内容はほんのひと握りです。Vimについてもっと詳しく知りたい方は、手前味噌ですが昔連載した記事があるので、よかったら読んでみてください。また、本も書いたのでよかったら、読んでみてください。
そしてなんと皆さんに嬉しい嬉しいお知らせでございます。vim-jpのコミュニティのSlackがあるので、こちらで手厚いサポートが受けられます。このSlackはちょっと変わってて、ダイエット、グルメ、技術など、なんと100を超えるチャネルがあり、またEmacsユーザーもいらっしゃるので、楽しくみんなで交流しています。もし興味ある方は是非入ってみてください。また、雰囲気をちょっと知りたい方はぜひこちらのブログなどを読んでみてください。
自分のターンは以上です。ご清聴ありがとうございました。
思考の速度でテキストをエディットしたい