jとkでの移動を矯正するためのVim pluginを作った

本記事はVim Advent Calandar 2015の13日目です。

本来書こうと思っていたネタがあったんですが、若干ネタが大きかったため期間的に厳しく そのネタの内容を検討している時に思いついて作ったVim pluginについてご紹介します。

背景

みなさんはカーソル位置からスクリーン上に見える範囲の特定の行への移動はどのように操作されていますでしょうか?

Vimmerは十人十色なので、様々なやり方があると思います。

例えば

  • 気合でjjjjj・・・kkkkk・・・を使う
  • 5j5kなどを繰り返し実行して距離を詰めた後に最後微調整する
  • (relativenumberオプションを有効にするなどで) 目視で極力一発で目的の行に移動する
  • 様々な縦方向の移動コマンドの中から状況にあった移動コマンドを選択する (/, }, { などなど)
  • (vim-easymotionなどの) 移動系のVim pluginを使う
  • マウスが大好きでマウスを使う

他にも色々あるかと思います。

私は、上記の中で以下を組み合わせてやりたい派です。

  • 様々な縦方向の移動コマンドの中から、状況にあった移動コマンドを選択する
  • 5j5kなどを繰り返し実行して距離を詰めた後に最後微調整する

基本的には、j, k以外のその場に適したコマンドで移動できるところは移動して、 j, k以外の移動コマンドだと手詰まりだったり、面倒だったりした場合には、5j, 5k、 また、j, kで調整するというスタイルです。

効率化という意味ではベストではないかもしれませんが、素Vimでの操作も考えると別に悪くはなさそうです。 ただ、個人的に1点課題に感じているところがありました。

それが以下の部分です。

  • 5j5kなどcount指定で距離を詰めて移動する方

これ、やりたいと思っていますが、実は現状できていません。

じゃあ現状どうやっているかというとこれです。

  • 気合でjjjjj・・・kkkkk・・・を使う

私はOSのキーリピート速度を高速化して、速度的には不都合がないとはいえ、 個人的にはキーリピート速度の高速化は邪道だと思っていますし、 「素Vimでもそれなりのパフォーマンスで操作できる」をモットーで やっている身として、count指定を使えるところは、count指定する べきだし、したほうが効率的だと思うのです。

でも、長年の手癖は早々直せないもの。ということで、これを矯正するために vim-gothrough-jkというVim pluginを作ってみました。

vim-gothrough-jk

vim-gothrough-jkの機能は以下です。

  • j, kを連続で3回以上タイプするとgothroughモードに移行する
  • gothroughモードではj, kをタイプした時の移動幅が5になる。
  • gothroughモードでは 4秒待つか、count指定でj, k移動するか、j, k以外の移動(h, lなど)で通常のj, kに戻る

なお、以下の部分はカスタマイズ可能です(I/Fは変更の可能性があるためここには書きません)

  • どれくらいの間隔(ミリ秒)で連続でタイプしたらgothroughモードに移行するか(現状デフォルトは150ミリ秒)
  • 何回以上タイプしたらgothroughモードに移行するか(現状デフォルトは3回以上)
  • gothroughモード時にj, kで移動する移動幅の変更(現状デフォルトは5)
  • gothroughモードに移行した後、最後にj, kをタイプしてからどれくらいの間隔(ミリ秒)が空いたら通常のj, kに戻るか(現状デフォルトは4000)

以下に動作のスクリーンショットを載せます。

f:id:deris:20151213180358g:plain

3回下に移動した後に、移動幅が5になり、3回上に移動した後に移動幅が5になっていることがわかるかと思います。

わかりやすいように、どれくらいの間隔で連続でタイプしたらgothroughモードに移行するかの値を 大きめにしてやっていますが、実際はj, kを押しっぱなしでないと発動しないくらいでいいかと思います(デフォルトは150ミリ秒)。 環境によってカスタマイズすることを推奨します。

で、このVim pluginの機能でどうやって矯正されることを期待しているのかというと

  • j, kを連続で3回以上タイプするとgothroughモードになるので、count指定のj, kを使わないと近い距離に移動する際に移動しづらくなる。 (例えば、カーソル行から4行下に移動したい場合、jの連続タイプだと途中で移動幅が5に置き換わるので、最初から4jで移動することを意識せざるを得なくなる)
  • 途中から5j, 5kに移行するので、20行下程度でもそれなりに高速で調整できるため、素Vimに戻った時に違和感を感じて、5j, 5kを使いたくなる…(かも)

なお、一般向けに今のデフォルト値にしていますが、移動幅を20くらいにすると、ハードモードになり 矯正もかなり進むのではないかと思っているので、私はしばらくそれで運用してみるつもりです。

類似Vim plugin

vim-hardtime

名前を失念してしまいリンクを貼れず申し訳ないのですが、(Lingr上でryunixさんに教えていただきました。 ありがとうございました。) vim-hardtimeは、j, kを連続で一定回数以上タイプすると、 しばらく(1秒とか)sleepするため、j, kを連続タイプしないよう矯正できます。

Vim pluginの着想は、ここから来た部分が大きいです。

ただ、流石にsleepはやり過ぎだなぁと思って、もう少し有用に使えて、 でも矯正にもなるような機能は無いかなぁと考え、現状の仕様にしました。

vim-accelerated-jk

vim-accelerated-jkj, kでの移動を加速度的に 速くできるVim pluginです。(実際は加速度を計算しているわけではなく、タイプ数に応じて移動幅を増やしています)

最初は似ていると気づかなかったのですが、j, kで、移動幅を変更するという点でかなり似ています。

気づいた時点で、新規にVim pluginを書き起こすか、vim-accelerated-jkの Pull Requestですますか悩んだのですが、用途もやりたいことも(多分)微妙に違うので、新規に書き起こすことにしました。

(もし、気になる機能があったらこれを見た作者のLindanさんが vim-accelerated-jkに輸入してくれるはず…)

まとめ

以上が、j, kでの移動を矯正するためのVim plugin、vim-gothrough-jkの紹介でした。

本題とはそれますが、Vimレベルが上がるのでvimrc読書会に参加することをおすすめします。 私は最近あまり顔を出せていませんが、毎週土曜日23時からやってます。

それではVim Advent Calendar 2015の13日目の記事を終わります。

Happy Vim Life!