くれなゐの雑記

例を上げて 自分で手を動かして学習できる入門記事を多めに書いています

使用例とともに学ぶvimコマンド5選

問題

この記事は多分kosen10sアドベントカレンダーの15日目の記事です。

adventar.org

vimを勉強するモチベーション

今様々な便利な便利なIDEやエディタが登場しており、わざわざvimを使う必要はないのでは?という気持ちになります。 実際、vimで快適にコーディングする環境を整えることは比較的難しく、また機能を追加すればするほど起動が重くなりトレードオフを取るのがなかなか難しいです。

しかしながら、様々なIDEやエディタが登場したがゆえ、環境によってそれぞれのエディタのショートカットキーを覚えなければならないという難点もあります。

そのような背景の中、vimキーバインドは多くのエディタの拡張機能として実装されており、統一されたキーバインドとして勉強するのもありかな?と思っています。 少なくとも、emacsが入っていないサーバー環境等ではどうしてもvimは避けられないですしね

vimを学習するときの壁(この記事について)

おそらく今の多くのコーディング初心者は、マウスでカーソルを合わせ、マウスホイールでスクロールし、入力するような形態を取っていることが多いと思います。

そのような状態からvimを入門した後、"移動"と"挿入モード等の切り替え"、"保存終了"を勉強し終わったあとに、次にどうすればいいのかわからないという気持ちになると思います。この記事はその後の勉強について、少しでもその壁を突破する手助けになればと思います。

この記事の対象

  • vimは何をするものかを知っている
  • 挿入モード、ノーマルモードを知っている
  • vimを起動し、文字を入力し、保存終了ができる
    • 上記を満たさなくても、動画をみてvimでこういうことができるのかと思っていただく読み方は可能です。

vimのコマンド紹介

この記事では大文字と小文字を区別します。注意してください。

  • 大文字はshiftを押しながらの入力を表します。
  • c-hogehogectrl を押しながらhogehogeを入力することを示します。

o/O

oノーマルモードで入力すると、以下の処理を一気に行ってくれます。

  1. 行末に移動する($コマンド相当)
  2. 挿入モードに移行する(aコマンド相当)
  3. 改行を行う

これらの処理を行った後、その行と次の行の間に一行空行が生まれることになります。

f:id:kurenaif:20181222195923g:plain

また、oコマンドは下に空行を作るのに対し、Oコマンドは上に空行を作ります。

このコマンドは意外と酷使します。一例をいかに示します。次はOコマンドを使う例です。

f:id:kurenaif:20181222200019g:plain

この記事中にもこのコマンドは大量に現れるので、しっかり頭に入れましょう。

i/a

この記事の冒頭で述べた条件に入っているコマンドです。 え?なんで知っている内容をわざわざ説明するの?と思われるかもしれませんが、結構このコマンド奥が深いです。

多くのvimmerやemacserは方向キーの入力を嫌います。 方向キーは多くのキーボードでホームポジションから遠くにあるので入力が遅くなる原因になるためですね。(マウスも同様の理由で嫌われています。) emacserは方向キーを捨てる代わりに、ctrlキーを多用する道を選びましたが、vimmerノーマルモードを導入する道を選びました。

おそらくご存知の通り、ノーマルモードでブロックが表示されると思いますが、そのブロックの左側に文字を入力するのがi、右に入力するのがaです

では挿入モードからノーマルモードに移行し、iで左側に文字を挿入するとどうなるでしょうか? それを利用したのがこちらの動画です。この動画のように入力することで、方向キーなしで左に1文字移動することができました。

f:id:kurenaif:20181222200056g:plain

また、vimではコマンドの前に数字を入力すると、そのコマンドを数字回実行してくれます。

例えば、一行削除するddコマンドの前に3をつけ3ddのように入力すると今あるカーソルを含めて下向きに3行削除してくれます。

ではaの前に数字を入力したらどうなるでしょうか?正解はその文字が複数回入力されます この動画をご覧ください。

f:id:kurenaif:20181222200126g:plain

使用用途としては、以下の動画のようにハイフンで線を書く場合に使えます。 動画では

50a-<esc><esc>

と入力することでハイフンの線を作っています。 さらに、yyコマンドで一行コピー(ヤンク)し、ペーストコマンドであるpを三回行うことを意味する

3p

を入力することで、さらに3つ複製しています。

他にもこういう使い方ができます:

競技プログラミングではint型に入る大きな素数として、1e9+7がよく使われています。 しかしながら、1e9+7という数字はc++などの言語ではdouble型として入力されるので、本来は1000000007のように入力したいです。

先ほど紹介したaコマンド、そしてこの動画で使用している数字を1インクリメントするctrl+aコマンドを使用することで、動画のようにこの数字を作ることができます!

f:id:kurenaif:20181222200157g:plain

f/F/;

かなりvim特有のコマンドに思えます。 f[x]コマンドはそのカーソルより右にある、最初にヒットした[x]に移動してくれます。 [x]の内容は記号数字アルファベット(大文字小文字区別)なんでもいいのですが、1文字に限定されます。

右にヒットするのがf、左にヒットするのがFです。

例えば、スネークケースのように単語が_で区切られているような場合は、f_で次々右に飛ぶことが可能です。 また、f_f_f_f_と入力するのはつらいので、二度目の入力以降はf_;;;;のように;が以前のfの移動を繰り返してくれます。

f:id:kurenaif:20181222200224g:plain

スネークケースの他にも飛びたい文字の近くに特殊な文字があればfで一気に飛べば方向キーを連打する回数も減らせるでしょう。 forの不等号の向きを変更する動画を以下に示します。 動画内で出てくるxはいまカーソルにある文字を1文字消すコマンドです。

f:id:kurenaif:20181222200248g:plain

ctrl+o

前ジャンプしたところに戻る機能です。何回もctrl+oを入力すると、更に前へ戻ることができます。

例えば以下の動画のように、includeを追加して戻ってきたいときのように使えます。 ggはファイルの最初の行に移動するコマンドですね。

includeを追加したときに最初に紹介したoコマンドも使用していますね。 octrl+oは全然別物なので、注意しましょう。

f:id:kurenaif:20181222200312g:plain

q/@

複雑な編集をするときに手放せないコマンド q です。 excelのマクロ機能のような機能で、q[x]<様々なコマンド>qと入力すると、[x]<様々なコマンド>が保存されます。 そして保存した<様々なコマンド>@[x]のようにして使用します。

本当にいろいろな使い方があるのですが、一例を紹介します。

以下の動画は、resがバグっているのでそれぞれの項をcoutしたいときの例です。a

次に現れる+<< '+' <<に変更する

処理を仕込んでおり、@aを繰り返し呼ぶことですべての+を置換しています。 (この処理は文字の置換でも可能です。)

f:id:kurenaif:20181222200405g:plain

次はスネークケースをキャメルケースに変更するケースです。 マクロには

次に現れる_を削除し、カーソル上にある文字を大文字に変更する

という内容が入っています。 マクロも他のコマンドと同様に、前に数字を入れると何度も繰り返し適応することができます。

f:id:kurenaif:20181222200508g:plain

まとめ

ただの紹介では他の記事と同じになってしまうので、 いくつか酷使しているvimキーバインドを、その使用例とともに紹介しました。 かなり汎用性の高いコマンドばかりですので、他にもいろいろな使い方ができます。 慣れてきたら新しいコマンドを見つけて、そのコマンドが使えるタイミングを探しながらコーディングしてみましょう。 oコマンドを知る前は$a<enter>を入力していたので、だいぶ入力が高速化されました。