最近、開発環境をガラリと変えまして、その設定やらなんやらをしていました。
今までは、
という感じの開発環境でプログラムを組んでいました。Atomでソースコードを編集して、次にMSYS2のウィンドウに移ってからmakeを実行するという流れですな。そのmakeの中でgccが実行されるようにしていました。
ですが、最近PCのストレージをHDDからSSDに変更しまして、その影響でいろいろなソフトウェアをPCにインストールしたり、実行したりするのがあまり怖くなくなりました。
ということで、今までの開発環境も見直そうと思い、色々と調べていました。すると、どうやらNeovimというテキストエディタがあるらしいということで使い始めたら、結構使いやすかったので紹介しようと思いました。
最終的な開発環境
最終的に、僕の開発環境は次のような感じに落ち着きました。
- エディタ : Neovim
- コンパイラ : clang + llvm
- バージョン管理システム : git(新規追加)
- ビルドシステム : make
- ビルド支援ツール : cmake(新規追加)
- ビルド環境 : コマンドプロンプト(Neovimのターミナル上で動かしています)
新規追加が2つもある上に、ビルドシステム以外は全部変わってます。本当に根こそぎ変わったなという感じがしています。
※う~ん、冒頭部分でも思ったけど、MSYS2とかコマンドプロンプトって、ビルド環境って言うのか・・・?というか、MSYS2とコマンドプロンプトは同列に並べていいものなのか・・・?分かんないことだらけだ。
makeはninjaの方が良さそうだったり、cmakeもBazelなる競合プロジェクトがあったりするようなので、この環境はまた変更する可能性もありますが、とりあえず今はこういう感じに落ち着きました。
※現在、wxWidgetsの解説記事を書いていますが、そちらの記事では引き続きgccコンパイラを使って動作確認をしていこうと思っています。
やはりプログラムを組んでいると、ソースコードを編集している時間をできるだけ長くしたいものです。ですから、色々なツールを新しく追加したり、エディタを変えたりしました。ツールの変更は結構楽にできて、簡単なスクリプトを書いたり、ただインストールするだけでよかったりしました。
ですが、エディタであるNeovimはそう簡単にはいきませんでした。という話を次の節で。
そもそもNeovimって?
開発環境の見直しで、初めてNeovimというエディタを知りまして、色々と調べていました。
どうやら大元はViというエディタだったそうです。そして、そのViからVimというエディタが派生して、さらにそのVimからNeovimが派生したらしいです。
Neovimだけでなく、Vi系列のテキストエディタ全体を通してみると、40年以上も、改良されながら使われ続けてきたエディタということになるそうな(Wikipedia情報では、Viの初リリースは1976年だったそうなので)。
それだけの歴史がありながら、いまだに使われ続けて、さらになお進化を続けているということですから、かなり愛されてきたエディタなんだと分かりますね。
そんなVi系列のエディタですが、愛され続けるにはやはり訳があるもの。
他の人がVimやNeovimを好いている理由は分かりませんが、僕の場合、大きな理由は、VimやNeovimには、「マウス操作に切り替える必要が無い(エディタ上のすべての操作をキーボードだけで済ませることができる)」と「拡張性に富んだプラグインが存在する」という2つの特徴があることです。
そして、それら2つの特徴が生み出す相乗効果によって、開発速度を高められるというのが、VimとNeovimの良い所ということになりそうです。
Neovimの気に入っている点
キーボード入力で完結できる
プログラムを組む人は大概そうでしょうが、ソースコードを編集しているときは、基本的に両手をキーボードの上に置いています。ですが、ページをスクロールしたいときなんかはキーボードからマウスに持ち替えるという動作が必要になるかと思います。
個人的には、そういう入力デバイスの変更が面倒だと感じることが多々あります。なんというか、脳がキーボードを叩くモードになっているのを、わざわざ変更するのがまどろっこしいと感じるのです。ホームポジションの確認も面倒ですし。
Vim、Neovimでは、そのような煩わしさがないのがかなり気に入っています。
欲しい機能だけを入れられる
VimもNeovimも「テキストエディタ」という名の通り、テキスト(文字情報)をエディット(編集)することに対して、Vim、Neovimなりの最適解を提供してくれています(これに似た言い回しをネット上のどこかで見かけて、自分でも使ってみたいと思っていました。すみません、勝手にパクりました)。
しかし逆に言えば、文字情報の編集以外については最適でない部分も多々あります。例えば、ソースコードを編集しているときに、文法間違いをしていないかとか、関数の引数が間違っていないか(型とか個数とか)みたいな診断をしてくれれば便利ですが、そういう診断機能は、初期状態では備わっていません。
今の例は、あったらいいのにというような、「プラスになる機能を追加したい」というものでしたが、たまに、初期状態のままだと不便というような、「マイナスを打ち消すような機能を追加したい」ということもあります。
VimやNeovimではその両方のニーズを、プラグインという機能で解決できるようにしてくれています。
プラグインを自分で作ったり、ネット上からダウンロードしたりして設定することで、自分の必要な機能だけを備えたエディタを構築できるようになっています。
統合開発環境を敬遠しているという話
僕の個人的な話になりますが、統合開発環境のように、大量の機能が元から備わっているようなアプリケーションって、あまり好きではなかったりします。
統合開発環境は、自分が特に気にせずとも、必要な設定を済ませてくれる(インストールしたその時点から、一定水準以上の開発支援を受けながらコーディングに取り組める)というのが強みだと思います。
僕は統合開発環境はVisual Studio C++系(Visual Studio C++ 2010とかVisual Studio C++ 2013みたいな)しか使ったことがないので、完全に想像ではありますが。
統合開発環境を使っていた当時の僕は、IDEの実行ファイルがどこに置かれているかとか、IDEのディレクトリ構成はどうなっているかみたいなことを、まったく気にせずにソースコードを書いていました。
というか、そういったことを気にしようとしたところで、当時の僕には理解できなかったと思います。
その程度の知識レベルでも、文法チェック機能の恩恵を受けることができていました。設定を少し変更してみても、Neovimのようにエラーを吐かれるみたいなことはありませんでしたから、扱いやすさは抜群だと思います。
一方で、VimやNeovimでは設定ファイルを変更して、何か間違いがあるとエラーを吐かれます。
文法チェックの機能が欲しいと思っても、プラグインや他のソフトウェアをダウンロードしてきたり、設定ファイルを編集したりする必要があります。
その設定ファイルについても、正しく書くにはどうすればいいかとか、そもそも設定ファイルをどこに置いたらいいかとかが分からなかったら調べる必要がありますから、どうしても「コードを編集する」という作業を実現するための作業が増えてしまいます。
そのように、「すぐにコーディングを始められる」という意味での扱いやすさはIDEの方が圧倒的に上だと思います。
ですが、それでもIDEをあまり積極的に使おうとは思わない理由が2つあります。
その理由の1つ目は使っていない機能があるのが気持ち悪いということです。
プログラミングを始めた最初の頃は、先ほどもお伝えした統合開発環境を使っていましたが、その頃から、使っていない機能があることが気持ち悪く思っていました。
当然ながら使っていて便利だと思う機能もある反面、片やまったく使わない機能もあって、その使わない機能を無駄だなと思ってしまうからです。メモリリソース的にも、CPUリソース的にも、ストレージ容量的にも。
しばらくプログラミングを続けて、多少詳しくなってくると、別にVisual Studio C++でなくてもいいやって思うようになってきて、最近では統合開発環境は避けています。
2つ目の理由は、開発環境を自分以外の誰かにコントロールされている感じが嫌だったということです。
というのも、例えば、インストール時に自動で設定された環境変数があったとして、その後、統合開発環境をアンインストールしたときに、その環境変数が削除されなかったとしたら、後からその環境変数を削除していいかどうかが判断できません。
そもそも環境変数は削除すべきではないのでしょうが、それでも使っていない環境変数がずっと残り続けてしまうのは、僕は気持ち悪いと思います。
他にも例えばライブラリの話で、インストールしたライブラリはどこに置かれているのかとか、どういう条件下でIDEがライブラリを認識するのかみたいなことが分からなかったりすると、個人的に少し不安になります。
自動でいろいろな設定をしてくれるという部分はIDEの魅力だと思いますが、それは同時に副作用でもあると思ってしまうのです。こちらが思ったこと以上のことをされているというのが、嫌だとでも言うのですかね。
たとえ多少時間がかかったとしても、開発に関する部分はある程度、自分で把握しておきたいと思ってしまうのです。
とは言え、こういった話はあくまでも程度問題で、VimやNeovimを使えば完全に解決するかと言えばそうではありませんし、完全に解決しようとすれば、それこそVimやNeovimのすべてのソースコードを読んで理解する必要がありますから、実際問題としてかなり難しいと思います。
ただ、統合開発環境の場合は少し副作用が大きすぎるなと感じてしまうので、VimやNeovimの方がいいなとも思っています。
といったような2つの理由から、僕は最小公倍数的な統合開発環境を一枚岩的に使うよりも、素数的なアプリケーションを組み合わせて使う方が好きです。
最近ではVS Codeも出ていますが、個人的にはやはり使わない機能が気持ち悪くなりそうで、敬遠してます。
※ざっくりとまとめると、VimやNeovimの「核となる機能はNeovimが提供するから、他に必要な機能があったら、随時各自で用意してくれ」というUNIX的な態度が好きだということになるでしょうか。同じ理由でllvmとclangもgccより好きだったりします。
まとめ
今回は参考になるような話は無かったと思いますが、これでいったん終わっときます。
要するに、統合開発環境はブラックボックスで気持ち悪く感じてしまうから、それよりも小回りの利くNeovimを使い始めたって話ですね。
そして、そのNeovimがかなり使い勝手が良くて気に入っていると。
ただし、Neovimは多種多様なプラグインや設定によって自分の好きな機能を追加できるようになっている分、元の状態だとあまり使いやすくはなかったりします。
そのため、プラグインの導入とか設定が実質的に必須になっています。
ということで、また今度、設定で詰まったこととか解決方法とかを書こうかと思います。
P.S.Vim、Neovimを使ってみたいと思った方向けに。
VimやNeovimの基礎的なことを理解しておかないと、そもそも使えない可能性があるので、本を読んで、まず体系的な知識を得ておくのはアリなんじゃないかと思います。
今回は個人的な話しかしなかったついでに、また個人的な話をしますが、僕は基礎的な知識を得るのはWebサイトよりも本の方が優れていると思っています。
理由は2つで、1つ目は、Webサイトはどちらかと言えば、基礎的なことはすでに分かっている人が読んで役に立つようなテクニックが多いような気がするからです。
2つ目は、本は物理的に1冊としてまとめなければならない関係上、Webページと違って、各ページ、各章ごとの依存性が強い気がしているからです。そのおかげで、Webページよりも知識が体系的にまとめられている確率が高いような気がするのです。
要するに、知識の漏れが起こりにくくて、かつ分かりやすいってことですな。
Neovimについて知りたい場合でも、Vimのことを理解しておけば役に立つので、とりあえずVimの使い方とかを勉強してみるといいのではないでしょうか。
個人的には、次の本が分かりやすかったです。
とは言え、勉強の方法に制限はありませんし、好みもあるでしょうから、お好きな方法で勉強してみてはと思います。