vimtutorの次(その1)

この記事はVim駅伝の2023-11-24の記事です。前回の記事はyasunori0418さんの エンジニア1年目で自分のvimを使えるまでの活動 です。次回の記事は同じくyasunori0418さんの vimを切っ掛けにエンジニアになった話 です。

【本記事の対象読者】
Vimを触り始めて以来少〜しだけ経過した方。h, j, k, lや、モードの存在、バッファって何?、.vimrcって何?等までは解ったかな、という方。Vimそのものの機能を習得するための題材を探している方。

【はじめに】
Vimを始める時、チュートリアルとしてvimtutorがあります。このvimtutorを何度も繰返してマスターする事はとても有用かつ大切であると思います。しかし、vimtutorをマスターして次の段階に進む時、皆さんはどうされるでしょうか?。プラグインを試しまくってみたい?コードをガシガシ書き出したい?。道具(Vim)を使いこなせるようになるためには「とにかく使い続ける」です。どうしたら馴染む&上達することが出来るのだろうかと考えたところ、日記、メモ、チートシートのようなものを書くことを思い付きました。こういったものを書きながらVimに馴染んでいけたら、一石二鳥ではないでしょうか。本記事は、vimtutorをマスターしたけどコーディング以外に何か題材は無いのか?という方に、「コーディング以外、日記(メモ)を書くことでもVimに馴染んでいける」ということを、自分の軌跡をお示しして、紹介する記事です。同じような状況でツボッている方の参考になれば幸いです。

【目標】
日記を書くのに必要なのが日付の入力です。もちろん、Vimテキストエディタなので普通に日付をタイプして入力すれば良いのですが、そこは折角Vimを使っているので、もっと便利な入力方法が有るんじゃないかと思いたち、キーマップを作成することにしました。他にもコマンド、関数を使う等色々有ると思いますが、最終的に出来上がったものが自分にとって一番簡便であろう、という目論見でキーマップでの実装としました。目標は、
ノーマルモードにあるとき、とあるキー(または、複数のキーで成り立つシーケンス)を押すと、ファイル先頭の行頭に[2023/11/01](ここは当然、タイピングしている日、ですし括弧も含みます)と入力され、カーソルが次行の行頭へ移動し挿入モードになっている」
という機能を実現する、です。

【キーマップのカスタマイズ】
normal modeの時に有効になるキーマップは、nmapコマンドで定義します。ですから例えば
nmap <leader>ih iHello Vim<Esc>
と定義します。定義というのはここでは「.vimrcに記入、保存する」という意味とします。定義したら.vimrcをリロードします。.vimrcのリロードは、Vimを再起動するか、
:source ~/.vimrc
(もし他のパスに.vimrcがある場合はそちらに書き換えてください)コマンドを実行します。もちろん、Vimを操作中にnormal modeで先頭に「:」をつけて上記コマンドを実行しても、キーマップは有効になります。しかし、作成したキーマップを永続的に機能させるためには.vimrcに保存しておいたほうが良いでしょう。<leader>というのは、キーマップを作動させる時に一番初めにタイプすべきキー、の事です。デフォルトでは「\」キーが割り当てられています。もちろん、自分の好きなキーに設定することもできます。<Esc>はEscキーを意味します。
キーマップの定義が有効になると、<leader>ihとタイプする(つまり、\ihとタイプする)と、バッファにHello Vimの文字が入力されるようになります。ここでポイントは「タイプした事をそのまま文字に起こしてやれば、まるでほんとに操作したかのようにそのまま実行される」という事です。
なので、
iHello Neovim<Esc>
と定義した場合はHello Neovimと表示されますし、
iHello Vim<CR>
と定義した場合は、Hello Vimの文字が入力された後改行(<CR>は改行を意味します)するとなります。キーマップに関するヘルプは
:h key-mapping
に記載されています。

【ヘルプの利用について】
私がVimに馴染むために、もう一つ意識していたのがヘルプの活用です。Vimのヘルプはとても良く出来ていると思います。有志の方々による翻訳作業も進行しているそうで、本当に感謝しております。使えば使うほど理解が深まり、Webで一々検索したりする手間も省けます。ただ
「キーワードやフレーズを知らないのでどこをどう調べれば良いのかわからない」
という方も多いのではないでしょうか。そんな方にお薦めしたいのが
「ある事象をヘルプで調べたときには、出てきた項目がどのファイル(あるいは何というテーマ)の章に記載されているのかを意識して見ておくようにする」
という事です。あと
「調べた結果出てきたヘルプの内容から広い範囲を読む(ざっとでいいから目を通す、知識を仕入れる)」
ということもお薦めします。例えば先程、少し例を挙げましたが:h key-mappingでも:h mapでも構いません。実際にヘルプを表示して読んでみることです。もちろん、1度見ただけで全て覚える必要はありませんし不可能です。しかし1回でも見ておくと、今後のVim生活に必ず役に立ちます。「あのコマンドどこだっけ」なんて時も「:helpgrep」コマンドがあるので、最悪、単語の断片しか覚えていなくても探し出すことが出来ます。え?。:helpgrepが解らない?。
:h helpgrep
してみましょうよ!。

【日付の取得&バッファへの入力】
次は、日付の入力についてです。ここでは、外部コマンドとしてシェルで用いられるdateコマンドを利用することにします。まず、vimtutorのレッスン5.1に「外部コマンドを実行する方法」という章が有ります。:!の後にコマンドを入力すると、その実行結果がターミナルに表示される、というものです。実際にやってみると挙動が解ります。
:!date
ターミナル画面が出てきて
-----
[最後の変更が保存されていません]
2023年 11月 19日 日曜日 11:26:33 JST
続けるにはENTERを押すかコマンドを入力してください
-----
と表示されます。これは使えそうですね。しかし、問題が有ります。
1.欲しい日付の書式が違う
2.ターミナル画面に表示させたいわけではなくバッファに入力させたい
一つずつ解決していきましょう。まず、日付の書式はdateコマンドのオプションで変えられます。オプションを与えてやってみます。
:!date +%Y/%m/%d
あれ?。先程と異なり変な表示がされました。実は%に原因が有ります。Vimでは%は非常に特殊な意味を持つ文字なので、これを\でエスケープする必要が有ります。%を\でエスケープして再度実行してみましょう。
:!date +\%Y/\%m/\%d
出来ました。これで1.の課題は解決です。次は2.です。
ここで、Google先生の力を借りましょう。「コマンドの出力をバッファへ挿入する」というフレーズで検索します。するといくつかの検索結果が表示されて、ズラズラと見てるとどうやら:readというコマンドが役に立ちそうです。Vimのヘルプで:readコマンドを調べてみます。
:h :read
すると、「ファイルの内容、もしくはコマンドの出力をバッファへ挿入する」とあります。なるほど今回の目的に利用できそうなコマンドであることが解ります。ではreadコマンドの後ろに先の!コマンドを繋げて実行してみましょう。
:read!date +\%Y/\%m/\%d
如何でしょうか。バッファのカーソル位置の1行下に、dateコマンドの結果が挿入されたのではないでしょうか。素晴らしい!。

後は整形するだけです。つまり、上記のコマンド実行を軸にして、カーソルを動かしたり、文字を入力したり、次への操作の準備が完了した状態にする、といった機能を追加するわけです。これらの動きをタイプ内容に起こし、微調整したものが以下の通りです。
gg<Esc>:r!date +\%Y/\%m/\%d<Esc>kdd0i[<Esc>$a]<Esc>o
何をしているか、文字を順番に追いかけてみて下さい。めちゃくちゃ愚直でお恥ずかしい限り(^^;なのですが、これが私が初めて自分で定義したキーマップです。今は少しおしゃれにして
nnoremap <silent> <leader>di gg<Esc>O<Esc>:r!date +\%Y/\%m/\%d<Esc>kdd0i[<Esc>$a]<Esc>o
と、.vimrcに書いています。

【応用】
・ファイル末尾の行頭に日付を入れるにはどうすれば?。
・他の外部コマンドの結果を利用することも出来ます。外部コマンドはdateだけではありません。lsでファイルの一覧を読み込んで編集したり、grepの結果をバッファに読み込んだり、出来ることは無限に広がります。
・実は外部コマンドのdateを使わずともVimの機能だけで同じことを実装できます。何度も言いますが、ヘルプを見てみましょう。そのものズバリの事が書かれています。

どうでしょう。様々な可能性が浮かんできませんか?。この「可能性が浮かび上がってくる」というのがVimを使う楽しさの一つなのだと私は思います。創造力を掻き立て、頭脳を駆使する。如何でしょう。vimtutorを終わった直後の時よりワクワクしませんか?。少しでも「面白そうだな」と感じていただければ幸いです。

【終わりに】
今回はVimを利用するようになって自分が初めて辿った軌跡をご紹介させていただきました。少しでもVimの面白さに気づいていただけたり、興味を持っていただければ幸いです。最後まで読んでいただき有難うございました。

 

追伸:2023年8月3日に他界されたBram Moolenaar氏の御冥福を御祈りいたします。