はじめに
この記事は Vim Advent Calendar 2018 の 8 日目の記事です。Vim を本格的に使うようになった今年 1 年の話と、自分の勉強のために作ったプラグインの話です。前半はポエムなので、興味ない方は "そしてふと思う" あたりまで飛んでください。
Vim との出会い
遠い昔、社会人になって暇すぎて Vine Linux でサーバのお勉強をやっていた頃が初めての Vim との出会いです。その頃の印象は、"ただただ使いにくいエディタ" でした。そもそもモードという概念のうまみが理解できていなかったですし、覚えることが多すぎて直感的に操作できていなかったためだと思います。設定ファイルを書き換えるときに最低限の操作ができていたくらいでした。
再会
Vim との再会は、仕事でいろいろとお世話になっていた U.S. のエンジニアが日本に出張に来たときでした。とても仕事のできる彼が颯爽とエディタを開いたときの光景と、緑地の上に置かれた "V" のアイコン (gVim) が視界に焼き付いています。ただその当時もそれが Windows 上で動く Vim だとは認識していませんでした。その後しばらくして、「なんかあの緑 V のアイコンを使っている人はすごい人が多いな」と思って正体を調べたところで気が付いたといった感じです。
入門
ほぼ同時期に、周りに Vim を使っている人がいない職場に変わってしまったのですが、今年の 2 月頃一人 Vim の門を叩きました。その後はいろいろ触ってみて、その豊富な機能とカスタマイズ性にのめりこんで行った感じです。特に感動した機能としては、
- ci( (要するにoperator + motion/text-objects)
- v_g_CTRL-A
- 連番が一発で作れるあれ
- registers
- 繰り返ししたり、クリップボードとして使ったり、検索結果を貼り付けられたり、所望の操作を定義できたり
- terminal
- ウィンドウとしてたくさん開けたり、テキストを Vim 内でヤンクできたり
といったところでしょうか。もしご存じなくて興味のある方は :help 各キーワード
で見てみてください。機能が豊富すぎて、便利な機能でも一回使ったくらいではなかなか覚えきれないです。。
後は mapping とか options とかをカスタマイズして vimrc に書き込んでいく楽しさですね。どんどん使いやすくなっていくのが楽しいというか。技術屋さんって業務と直接関係ないカスタマイズとか、ツールとか作っているときが一番わくわくしますよね。
Vim を通して広がった世界
勉強会やカンファレンスなど
自分の普段の業務は組み込み系なんですが、組み込み系はどちらかというととても閉じた世界だと思っています。Web から得られる情報も限られているし、自分たちの仕事の中身をさらけ出すこともしないし、勉強会といって社外に出て行く風潮も自分の周りにはあまりありませんでした。自分も不勉強だったので技術系の勉強会やカンファレンスがあることもほとんど知りませんでした。
ですが、Vim の情報を得たいがためだけに長年なぜか避けていた Twitter を始めてから、そのあたりの情報が飛び込んでくるようになりました。そのおかげで今年は VimConf 2018 にも参加することができました (そのときの日記)。なかなか都合が付かず行けていないのですが、そのうち Vim 関連のイベントにも参加したいと思っています。なにせ周りに Vim について話せる人がいないので。。
あとは 娘を Vimmer にしてみんなに見てもらったりもしました。
翻訳のお手伝い
別の点では、Vim のドキュメントがとても充実していることに驚きました。仕事上ではドキュメントが充実している現場に出会ったことなどそうそうなくて、「こんなにドキュメントがきちんと書かれているなんてなんと素晴らしいんだ!」と感動してしまったんです。最近では少しでも contribution できればと、Vim のヘルプの日本語訳のお手伝いもさせていただいております。
興味ある方はこちらをどうぞ -> https://github.com/vim-jp/vimdoc-ja-working
そしてふと思う
「あれ、自分ちょっと vimrc 弄りすぎじゃね?」
たった数秒の、直感と合わなかった操作とか手間とかを無くすために vimrc をいじり始め、自分の Vim 力が低いせいで膨大な時間を費やしてしまう。。~~楽しいんですけど。~~たまに (費やした時間 > 一生 Vim を使ったとして改善できた時間) になっていることもある気がします。果たしてこれはトータルの生産性的にはどうなんだと思うわけです。なんか午前中業務の進捗あったっけ?みたいな。楽しいんですけど。
そこで vimrc 弄りに費やしてしまった捧げた時間を測ってくれるプラグインを作りました
vimrc 弄りを抑制する効果はあまり期待できませんが、ひとまずどれだけの時間がかかっているのかが分かるようにしたいと思った次第です。あと、せっかくなら自分の勉強にとプラグイン化もしたいなと思いました。
- https://github.com/mnishz/devotion.vim
- こんな感じで結果が見えます。
この日は確か eval.jax で escape() のヘルプを読みながら、vimrc 弄りをやっていた日だと思います。あと usr_41.jax では <Plug> の勉強をしてました。
やっていることはそんなに複雑ではなくて、filetype が 'vim' とか 'help' とかのファイルに対して、BufEnter や BufLeave などの autocommand-events を見て時間を測っているだけです。それをログに残しておいて、コマンドを叩くとログから累積時間を計算するようになっています。
自分の勉強のためという目的もあり、思いついてからあまり類似のものがあるかどうかも調べずに着手したので、もし似たような感じのプラグインをご存知でしたら教えていただけると嬉しいです。参考にしたいと思います。気が付いたのは @uochan さんが作られている以下のものでしょうか。こちらはグラフィカルでとても綺麗ですね。。
勉強になったこと
プラグインを作って公開したいと思うとそれなりに理解しないといけないことが増えて、また自分の Vim 力 + α が上がったように思います。
- オブジェクト指向っぽいことができる
- いろんな組み込み関数の知識が増えた
- autoload
- autocmd 対象ファイルの filetype を取得する方法 (思いのほか苦労した。。。)
- 辞書のリストを sort する方法
- ライセンスの種類
- plugin のテスト
- Travis CI の基礎
などなど。
やり残したこととか課題とか
- BufEnter から始まらないケースも結構ある
- 今はエントリポイントが BufEnter しかないので他のイベントも見たほうがいいかもしれない
- 起動しっぱなしの場合を考えて、定期的に吐き出しをしたい
- 会社だとターミナルを起動しっぱなしで帰ることが多いのでちゃんと測れない
- 日付をまたいだ瞬間をうまく検出できる?
- イベント発生時に、経過時間と現在時間から日をまたいだことは分かるか
- そのときにログを 2 日分に分けて出力すればよさそう
- 年単位の処理になると結構遅いかも
- 他にも *.vim という名前のリポジトリのファイルはすべて含めるとか?
- vimrc 弄りって英語で何と言ったら雰囲気が伝わるんだろう?
興味が湧いた方は是非使ってみてください。Vim に捧げた時間を見ながら満足感に浸っていただければ幸いです。
Happy Vimming!
以上、今年の Vim 活のまとめでした。今後も自分なりに Vim 道を邁進していく所存であります。みなさんもよい Vim Life を!