読者です 読者をやめる 読者になる 読者になる

連載vim tips : /,?を使った移動

vim

vimでスムーズに移動するにはどういう方法があるだろうか。w,bを使った単語移動やf,tを使った文字移動がよく挙げられるけど、/,?を使うとより効率のいい移動ができる。
次のソースを見てみよう。

      def add_class_variables_to_assigns
        %w( template_root logger template_class ignore_missing_templates ).each do |cvar|
          @assigns[cvar] = self.send(cvar)
        end
      end

      def protected_instance_variables
        if view_controller_internals
          [ "@assigns", "@performed_redirect", "@performed_render" ]
        else
          [ "@assigns", "@performed_redirect", "@performed_render", "@request", "@response", "@session", "@cookies", "@template" ]
        end
      end

この左上の頭にカーソルがあったとする。このときif view_controller_internalsのview_controller_internalsの頭までカーソルを持っていきたいとする。たくさんの方法があるけど、一番頭で考える時間+キーボードの操作時間を短縮できる方法はなんだろうか。とある人はjを複数回押してif...の行まで移動して2wを押すという。また8jwwと云う人もいるだろう。しかし8jを考えるまで何秒かかる?それよりもシンプルで簡単で触感的な方法がある。それは/を使う方法だ。/は検索のコマンドという概念が強くて、「あーこのソースからfoobarって変数を検索しないと」という本当の意味での検索のみにしか/を利用しない人が結構いる。しかしこの/を使った検索方法はシンプルだけど画面内に表示されたとある部分に移動するには一番効果的な方法である。
では/vieと押してみよう。if view_controller_internalsのview_controller_internalsの頭に移動しているはずだ。そう、移動先の単語のユニークな箇所を見つけて/+数文字 で移動するのがシンプルかつ強力な方法だということが解ってもらえただろうか。表示画面内の行をまたがって移動するときはこの方法が一番速い。
ではまた左上の頭にカーソルがあったとして。二行目のtemplate_classに移動したいとする。さぁ、どうすればいいだろうか。template_classの前にtemplete_rootがあるから/temだとそっちに飛んじゃうしなぁ、と思って躊躇してしまうかもしれない。しかし大概の場合、飛んでしまうのが正解だ。/temでtemplate_rootまで飛んですかさずnを押してみよう。nは前回の検索内容で飛ぶコマンドだ。そのため、template_classに移動する。もうひとつの方法としては/r tで飛んでwが挙げられる。これはlogger template_classと続いているため、/r tでloggerのrの場所まで飛ぶ。その後wでtemplate_classまで移動すればいいわけだ。後者のほうが頭を使うので、よほどtemplate template temp template などと並んでない限りは/temを押してからnで十分だろう。
/を使った移動をうまく使いこなすコツは、ユニークな文字を画面の表示領域から見つけることである。たいがい3文字前後のユニークな文字で移動するとうまくいく。それほど長い文字列は必要ない。
今回は触れなかったが、?は/と反対で/が下方検索なら?は上方検索だ。場合によって使い分けよう。
あとこれは個人的な好みなのだが、vimではインクリメンタルサーチは使うべきではない。/文字列 でほいほい移動してしまうのは気持ち悪いので:set nois推奨。