awesometaro

なぜneovimを使うのか

今の時代いろんなテキストエディタがある

今の時代に自分がなぜneovimを利用するのかについて書こうと思う。 現代では様々なIDやテキストエディタがある。 それらには標準でコードの補完機能や、最近ではAIの機能がたくさん搭載されており、 特に設定しなくても利用することができる。 一方でvimやNeovim、あるいemacsなどのテキストエディタではデフォルトでこれらの機能は搭載されていない。 同等の機能を使うためにはかなりの量の設定が必要だ。

なぜvimを利用するのか

ではなぜvimを使うのか。 単純に設定が楽しいという側面もある。 vim界隈ではvimの設定に時間を費やすることをvim盆栽と呼んだりする。

あるいは、vim操作のキーバインドがテキスト編集に最適化されており、思考の速度で編集できるからという理由でvimを好む人も多い。 例えば、vimではwを押すと単語ごとにカーソルが移動する。 2wと押せば2単語先にカーソルが移動する。 このようにキーバインドのコンボを駆使することで、思考の速度でエディタを操作することができる。 まるで格ゲーのようだ。

しかし私がvimを利用する理由は単にそれだけではない。 vimは.vimrcという設定ファイルに設定を書くことができる。 .vimrcはただの設定ファイルではなく、vimscriptというプログラミング言語でエディタの設定をプログラミングすることができる。 vimscriptでvimの操作をプログラミングすることができるので、日常のちょっとした自動化などを行うことができる。

例えば、弊社ではリモートサーバーでしかphpunitが実行できない。 vimscriptを利用すれば、vimで開いているファイルをリモートサーバーにrsyncでアップロードし、その後にリモートサーバー上でphpunitを叩くようなスクリプトを自前で組むことができる。

このように自分の行っている作業をプログラミングによって自動化することは、自分の作業を標準化していることになると思う。 これは「具体から抽象」への変換であり、この作業は非常に楽しい。 楽しいからvimを使っている。

具体→抽象

私がプログラミングに楽しさを感じるのは、具体から抽象への変換をプログラミングによって体験できるからだ。 vimscriptを使い、日常の細々とした作業をスクリプトを作って自動化することは、まさに具体を抽象化することだと思っている。 vimscriptを使って具体を抽象化することで、私は普段の開発以上に、この抽象化の作業を行うことができる。

なぜ具体から抽象への作業が面白いと感じるのか。

私は昔から算数や数学が好きで、具体的な問題を数式に落とし込むという作業が好きだった。 また、物理学で必要になる「物理現象の数値モデルへの変換」というのも、まさに具体から抽象モデルへの変換でこれも好きな作業だった。 ある具体的な問題から組み立てた数式が、別の具体的な問題にも適用可能だとわかったときには格別な全能感を感じる。 全能ではないのだが。 プログラミングも似ていると思う。 私はこれが非常に楽しく感じていたから、これまで物理学を専攻していたのだし、ソフトウェアエンジニアになった今もこれをやりたいのだと思う。

Shellscriptでもできるのでは?

ちょっとした自動化はシェルスリプトで書けばいいかもしれない。 しかしファイル操作における自動化ではファイル名やファイル内の選択、エディターの選択範とその行数あるいは今エディターの中のカーソルの位置を取得を必要とするときが多い。 shell scriptだけでは、これらの値をスクリプト内部、あるいはスクリプトの引数として利用することは難しい。

vscodeでもプラグインは作れる

vscodeでも当然プラグインを作成することができる。 ただし、その手軽さには大きな違いがある。 vscodeのプラグインはマーケットプレイスでの公開が前提になっており、プラグインの準備はvimと比べると大変である。 vimでは.vimrcに書き込みさえすればいいのだから断然手軽だ。

emacsの方がいいのでは

emacsも、プログラミングによってエディターの操作自体をカスタマイズすることができる。 一般的に、emacsの方がvimよりもエディターを柔軟にプログラミングできると言われている。 具体→抽象化のツールという観点では、vimよりもemacsを使う方がいいのかもしれない。

しかし、vimとemacsでは、哲学的に根本的に違いがあるような気がしている。 vimは、エディタでできることしかしないという哲学があるように感じる。 一方でemacsでは、自分の行うすべてをemacsの中で完結しようとするというような考え方があるにではないだろうか。 安直な考えだが、ソフトウェア開発における責務の分担という点では、vimの方が優れているようにも思える。 しかし、emacsを使っているユーザーは、自分のライフスタイルをemacsに投影しているのだから、わざわざ責務分ける必要はないと思っているのではないだろうか。 これはvimにはSlackやTwitterのプラグインがあまりないのに対して、emacsではそれらのプラグインが利用されていることからも伺える。 だからどちらのエディターがいいというわけではなく、これは哲学の違いに帰着すると思っている。

私はvimを利用している。それは、emacsと比較すると遥かに動作が速いからだ。 emacsは、あらゆることをエディターの中で完結させようとしているからか、その動作がvimよりも遅い。 私はemacs使い(emacser)のように、自分の全てをエディターの中に統合して仕事をしているわけではないので、vimを使用している。

Helixというエディタについて

最近、HelixというTUI (Terminal User Interface) のエディタがエディタ界隈で注目を集めている。 Helixはポストモダンなエディタを謳っており(ジョーク)、vimやKakouneの操作性に近い。

vimとの違いは、最初からpicker、treesitter、lspの機能が搭載されていることだ。 こういったツールにはbattery includedという考え方がある。 battery includedなツールとは、そのツールをインストールしただけで、さまざまな機能がすぐに使えるということだ。 Helixはvimに比べて、まさにbattery includedなツールであると言える。 なぜならば、先述したようにvimはインストールしただけではあまり機能が充実していないからである。 Helixは、battery includedなTUIテキストエディタとして注目を集めている。

Helixの面白いところはvimやneovimと異なり、プラグインシステムが搭載されていないところだ。 vimユーザーからすると、プラグインシステムのないことはデメリットに感じられるし、実際そのような意見もたくさんある。 しかし、私はこれでいいのではないかと思っている。

Helixがプラグインシステムを持たないことについて

Helixは最近のリリースで、ファイルのパスやカーソルの位置を外部のスクリプトに渡すことができるようになった。 これによって、先に述べたような自作したシェルスクリプトの引数に、それらの値を渡すことができる。 Helixでプラグインのような自動化の仕組みを使おうとすると、シェルスクリプトか、あるいは自分の好みの言語でスクリプトを書き、その引数にHelixから与えられるカーソルの位置などの値を渡すことになる。 これが意外と筋がいいのではないかと私は思う。 というのも、NeovimなどはLuaをプラグインシステムとして利用することで様々な機能を利用できるが、作成したプラグインはNeovimの中でしか動作することができない。 一方でHelixのために作成したスクリプトは、Helixに密結合していないため、Helix以外のエディタでも利用することができる。 要するに、自分が作成したスクリプトを資産にすることができる。

とは言っても、これはあくまで理想論の話で、現実はHelixはなかなか使いづらいところがある。 例えば、vimではGitのインターフェースを提供しているプラグインがあるため、vimの中では簡単にGit操作をすることができる。 しかし、Helixはプラグインシステムを持たないため、Git操作もわざわざ別のターミナルを開いて行う必要がある。 LazyGitなどの別のTUIのGitクライアントを利用することである程度は楽することはできるが、未だ動作が不安定なところも多い。 Helixはbattery includedなエディターであるため、ファイルピッカーや構文解析など、エディターの基盤となる部分は既に実装されている。 そのため、プラグインシステムがなくても機能的に致命的な問題ないというのがまた面白い。 とは言いつつ私はHelixがいいと思いながらもなかなかneovimから移行することができないでいる。

まとめ

私はエンジニアとして、複雑な問題を抽象化して解決できるところに面白さを感じている。 日常の細々としたタスクなどをスクリプトを通して抽象化し、自動化することによって解決することに非常に楽しさを感じる。 だからvimを利用することは自分にとって非常に楽しい。

エンジニアはソフトウェアを通して社会の複雑な課題を解決しようとしているが、私が思うに、日常の自分自身の複雑さを解決できないようでは、それらに太刀打ちできないのではないかと考える。 そういう意味で、vimはそのためのトレーニングになると思うし、純粋に楽しい。

私はvimにこだわっているわけではなく、手軽にスクリプトを組めて機能として利用できるエディタなら良い。