ham-capのブログ

プログラミング学習の記録

Vimが好きだ

これはフィヨルドブートキャンプ Part 2 Advent Calendar 2022の7日目の記事です。

昨日はfuwa-syugyoさんの「輪読会はいいぞ、という話」でした。 ちなみにフィヨルドブートキャンプ Part 1 Advent Calendar 2022もあります。

目次

はじめに

せっかくのアドベントカレンダーですし僕もいろいろ考えたのですが、やっぱり自分が好きなものについて書かないと熱量が足りないよなぁということで、今回は自分が好きなものの中から技術に関連することについて好きなように書こうと決めました。

というわけで、今日は僕がフィヨルドブートキャンプのプラクティス(課題)でコードを書く際に使用しているテキストエディタVimの話をします。

この記事の方向性について

まず、この記事ではVimで使用できる具体的なコマンドの詳細までは深く立ち入りません。

なぜなら、ちょっとググれば僕のような若輩Vimmerでは及びもつかないようなVimマスターの方々の手によって生み出されたノウハウ満載の超有益記事が大量に見つかるからです。

なのでこの記事では、僕が思うVimの魅力を言語化することに集中します。 そもそも好きなことを好きに書くのが今回の個人的な趣旨でもあるので。

そうすることで僕と同じようにWeb開発に興味を持って勉強中の人や他のエディタを使っている人がVimに興味を持ってくれればそれはそれで嬉しいです。

一応、Wikiのリンクと基本的な説明がわかりやすいページだけ貼っておきます。

Vim - Wikipedia

はじめてのVim 〜 Vimはいいぞ!ゴリラと学ぶVim講座(1) | さくらのナレッジ

前置きが長くなりましたが、次から本題です。

そもそもなんでVimなん?VSCodeじゃダメなん?

ダメじゃないです。

むしろ、もし今VSCodeに限らずVim以外のエディタを使っていてなんの不満も無い!快適だ!と思うのであればわざわざVimに乗り換えるなんてナンセンスだと思います。はっきり言って面倒なだけですのでやめておきましょう。

今使っているエディタも悪くはないんだけどちょっとこの辺がなぁ…みたいな人や、自分の欲しい機能だけあれば余計なものはいらないという人、小綺麗な見た目がどうもしっくりこないんだよな、という人なんかはVimの中に答えがあるかもしれませんしないかもしれません。

僕がVimを使い始めた理由

ちなみに僕がVimを使い始めた理由は以下のとおり。

  • フィヨルドブートキャンプのカリキュラム序盤で触ってみてなんか良かったから
  • Microsoft社製品のおせっかい機能が腹の底から嫌いだから
  • ギークっぽくてかっちょいいから

今はVimの好きな部分がいろいろありますが、使い始めるきっかけはこれだけでした。

特に最後のは重要です。

エディタに限らずですが、自分にとってかっちょいいとか可愛いとか、使っているだけでテンション上がるとか、そういう要素がないとやってて面白くないです。

Vimのここが好きだよ!

ということで、Vimのいいところ、というか個人的お気に入りポイントを書いていきます。

ワープの使い手になれる

Vimはカーソル移動のためのコマンドがめちゃくちゃ充実していて、覚えれば覚えるほど素早く目的の箇所に辿り着くことができるようになります。また、コマンドと言っても長ったらしい呪文の詠唱は不要で、大抵はキーを何個か押すだけで済みます。

場合によっては初手でワープして、すぐにテキスト入力ができる状態になっていて、しかもそれがホームポジションから出ることなく完結しているということもザラにあります。

そうなると、わざわざ矢印キーやマウスに右手を移動させるのが億劫になってくるわけです。

マウスにいたっては近所のコンビニぐらいの距離ありますからね(体感)

画面スクロールなんかもなれるまではちょっと困惑しましたが、今ではマウスのホイールをジャッジャッ!ってやつもVimを使っている時にはほとんどやらなくなりました。

こういうことができるのは、Vimが移動やコピペ、範囲選択、テキスト入力、ファイル自体の操作をそれぞれ別のモードが担当し、どのモードにいるかによってキーバインドが全く異なるという特殊な仕様のおかげだと思うのですが、その特殊さが仇になってVimをとっつきにくいエディタにしてしまっているのも事実なんですよねぇ。

テキストオブジェクトが便利

Vimにはテキストオブジェクトという概念があります。(Vimだけじゃないかもしれないけど。)

これは何かというと、テキストのある範囲を一つの塊(オブジェクト)としてVimが認識してくれて、そのオブジェクトに対して操作ができる、という理解でいいと思います。

これを使うと、例えば''で囲まれた文字列をまとめてコピー/削除/置換したりということがかなり簡単にできます。 範囲については指定の仕方で1単語だったり文全体だったりします。

ちょっと分かりにくいと思うので実例を。

たとえば、''で囲まれた文字列をまとめて削除するときはdi'(Delete Inner ')と打てば一発。

一つの単語だけ消したいならdaw(Delete A Word)

プラグインを使えば置換も一発。僕の場合は置換を?に割り当てているので?aw

これだけだとちょっと分かりにくいかもしれないですが地味に便利。 もし置換ではなく自分で何か入力したい場合は、ci'(Change Inner ')とかcaw(Change A Word)のようにオペレーターをcに変えれば対象を削除後に自動的にインサートモードに入ってくれるのでスムーズに入力を開始できます。

リピート

Vimの機能の中にリピートという機能があります。 直前に行った操作を繰り返すというだけの単純な機能ですが、Vimではこれを.を押すだけでできます。

何が嬉しいかというと、例えば上で紹介したようなdi'などはキーを3つ叩いて入力していますが、その入力の直後であれば、対象となる単語まで移動して.を叩くだけで同じように''の内側を削除できます。

キー3つが1つになっただけじゃんと思うかもしれませんが、要は同じ操作が三分の一の労力でできるということなので、編集するコードの量が増えれば増えるほど恩恵を受けられることになります。

道具を使ってる感が楽しい

個人的にはこれが最大の推しポイントです。

あくまで感覚の話になってしまうのですが、コードを書いている時に4つのモードを行ったり来たりしながらあっちこっちにワープしてバッサバッサとまとめて編集していると、エディタでコードを書いているというよりは、何かの道具を使って工作でもしているような気分になって非常に楽しいです。

使えば使うほど手に馴染んできて更に使いやすくなっていく感じも、物理的な道具の扱いに習熟していくことと本質的には同じような気がします。

何かを使いこなすって楽しいんですよね。

Vimのここがよくないよ!

次にイマイチなところいってみましょう。

学習コストが高い

一番の欠点はなんと言ってもこれです。

とりあえず効率とかは一旦考えなかったとしても、各種モードの役割と切り替え方法、オペレーターとモーションの概念ぐらいは把握しておかないとまともにファイルの編集すらままなりません。

なんなら最初は上書き保存のやり方をググることになります。泣けてきます。

しかもVimの操作は思ったよりも奥が深く、多少覚えてももっと効率的なやり方や、上級者が使うような高度なテクニックをたくさん発見できてしまうので、胸を張って扱いに習熟したと言えるポイントが一向に見えてきません。

ただし、よく使うオペレーターとモーションの組み合わせやVimっぽい編集の手順なんかが手癖になってきたあたりで経験値が閾値に到達して一気に扱いやすくなるような気がします。(僕は最近やっとこれを感じ始めたところです。)

学習曲線が長く低空飛行を続けた後、極端に上昇していくイメージを持ってます。(当然個人差はありますが。)

カスタマイズが事実上必須

これも人によっては厳しいんじゃないでしょうか。

なんというか、Vimは大変に無愛想なやつでして、初対面では非常に素っ気ないです。

そもそもの見た目からして、縦に移動できるようになったターミナルって感じです。色もなんか変。たしか最初は行番号すらなかった気がする…。

どこにでもジャージとサンダルで来るようなやつです。

機能も同様です。例えば、入力の補完機能なんかはあるにはあるのですが、他のエディタが当たり前にしてくれるような親切心とかは微塵もありません。

この辺りでもう嫌になっちゃう人多数かと思います。

ただし、Vimはかなり素直なやつでもあります。

どうして欲しいかをしっかり伝えればちゃんとしてくれます。

具体的にいうと、.vimrcという設定ファイルにVimにしてほしいことをひたすら列挙したり、持っていてほしい便利道具(プラグイン)について書いておくことで、見た目も機能もどんどん自分の理想に近づけていけます。

子供の頃ガンダムのプラモデルなんかを素組みでは満足せずに塗装したりパーツを付け替えたりして改造していたタイプの人は楽しめると思います。

これ、捉えようによっては美点でもあるような気がします。

思わぬ副作用がある

これも個人差がありそうですが、Vimの扱いに慣れれば慣れるほど、Vim以外でのテキスト入力時にちょっとした支障が出始めます。

例えば僕の場合、Vimの使用中はテキストを入力している時以外、基本的にノーマルモードにいたいため、入力が終わるとすぐにインサートモードからノーマルモードに戻る操作(Ctrl + [)が手癖になっているのですが、このブログなどのようにVimを使わずに文章を書いている時にもこの手癖が暴発します。割と頻繁に。

今もここまで書き進めてくるあいだに何回Ctrl + [の素振りをしたか分かりません。

範囲選択もついvを押してしまったり、空行をいれたくてoを押してしまったりします。

日本語の間に不自然に挟み込まれたvoyyには哀愁すら感じます。

じゃあ文章書くのも含めて全部Vimでやったらええやんと思われる向きもあるかと思いますが、これには理由があります。次のよくないポイントです。

日本語入力と相性が悪い

これについてはVimを使用したことがない人には非常に伝わりにくいかと思います。

どういうことかというと、日本語入力の状態だとVimがコマンドを認識してくれません。 ノーマルモードからインサートモードへ移行するにはiを押す必要がありますが、日本語入力時はiではなくになってしまい、Vimが正しく認識しません。他のコマンドもすべて同じです。詳しくはわかりませんが、そもそも全角がダメっぽいです。

こうなると、そもそもカーソル移動もできないため、必然的にノーマルモード時は入力を半角英数に切り替えることになります。

そしてインサートモードに入ったら日本語入力に切り替えて入力し、終わったらノーマルモードに戻りますが、この時の入力は日本語入力になっています。そのままでは再度インサートモードに入ることすらできないためまた日本語入力を半角英数に切り替えてインサートモードに入ってまた日本語入力に切り替えて…。

頭に来ますね。

つまり、日本語入力とVimの操作が両立できないため日本語入力のオンとオフを頻繁に繰り返すことになり異常に煩わしいことになります。

実際には、キーバインド等の設定やプラグインを駆使することで上記の問題を解決する方法もあります。

ただ、それでVim上での日本語入力が多少楽になったとしても、コードを書いているときのように爆速な編集へ進化していけるかというと個人的には疑問です。

それならもういっそ日本語入力に関しては素直に割り切って、ブラウザへ直接入力するなりWordを使うなりするほうがよほど簡単だし早いと思います。

苦手なことをいくら頑張っても得意にはならないのです。

入れてよかったプラグイン

さて、先ほどからちょくちょく出てきているプラグインについて。

Vimプラグインというのは要するに拡張機能のことで、本当にさまざまなものがあります。

これらをインストールしてVimで使えるようにすることで、あんなに無愛想で不器用だったVimがどんどん洗練された親切なナイスガイになっていきます。

年季の入ったVimmerの中には100個や200個プラグインが入っている人たちもたくさんいらっしゃるそうで、奥の深さを感じます。(使用するプラグインの数が増えれば、それだけVimの動作も遅くなると思うので多けりゃ良いってもんでもないですが。)

というわけで、僕がインストールしてよかったと感じているプラグインを並べておきます。

有名なものばかりなので玄人感は皆無ですが、Vimに興味を持ってこれから使っていこうかなと考えている方の参考になれば幸いです。

NERDTree

Vimにサイドバーを表示させてディレクトリのツリーを表示してくれます。そのままファイルを選択して別のバッファで開くこともできます。これのおかげでVimが一気に便利になった。

github.com

Indent Guides

インデントを見やすくしてくれるのでネストの深さが視覚的に分かりやすくなります。

github.com

surround.vim

テキストの前後を囲んでいる括弧([],{}とか)や引用符(""とか)、はてはhtmlタグまで一発で削除したり置換したり追加したりできます。

github.com

vim-operator-replace

任意のテキストオブジェクトを置換することができるようになります。 意外ですが、Vimには検索なしで単語を楽に置換する手段が乏しいので助かります。

github.com

lexima.vim

閉じ括弧や引用符を補完してくれます。補完してくれた後はちゃんと括弧の間にカーソルが来てくれます。地味に便利。

github.com

closetag.vim

lexima.vimのhtmlタグ版。htmlの閉じタグを補完してくれます。

github.com

他にもたくさんありますが、キリがないのでこの辺で。

まとめ

なんだか本当に好きなものについてただ書き散らした感じで恐縮ですが、これでもだいぶ短くしました。 長々と書いておきながらなんですが、結局何が言いたかったかというと、Vimでコードを書くのは楽しいよってことです。

ここが好きだよ!のところでも書きましたが、ただのテキスト入力ソフトとしてではなく、道具として使っている感じがとても好きです。

こういう感覚は、僕がフィヨルドブートキャンプで学んでいるRubyというプログラミング言語や、そのフレームワークであるRuby on Railsにも同じことが言えるんじゃないかなぁと思っています。(こっちの方はまだまだ修行不足で全然使いこなせてないですが…。)

本当はその道具でどんなコードを書くかということの方が何倍も大事なのですが、プログラミングに限らず、自分が使う道具に愛着があるのは悪いことではないと思うので、今後もちまちまプラグインの剪定をしながら楽しんでいきたいなと思っています。

おすすめのプラグインとかあれば教えてください。

ちなみに、今回はVimの機能を網羅的に紹介するのが目的ではないので言及しませんでしたが、Vimにはまだまだ便利な機能や仕組みがあります。 バッファやレジスタ、アンドゥツリー、マクロといった仕組みを理解すればもっとできることが広がります。 興味のある方は是非一度、Vimを使ってみてください。

参考

はじめてのVim 〜 Vimはいいぞ!ゴリラと学ぶVim講座(1) | さくらのナレッジ

何も考えず~/.vimrcにこれを書くんだ! 〜vim初心者によるvim初心者のためのvim入門〜 - Qiita

脱初心者を目指すなら知っておきたい便利なVimコマンド25選 (Vimmerレベル診断付き) - Qiita

Vim幼稚園からVim小学校へ - Qiita

僕がVimで愛用しているプラグイン30連発 | 株式会社LIG(リグ)|DX支援・システム開発・Web制作