post

Vim ja:移動

Contents

はじめに

文章を最初に書いたあと、編集や書き直しをするには、その文章のあちこちをたくさん移動しなければなりません。たとえば物語を書いていて、急に新しいプロットを思いついたとしたら、主人公が新しい街に入る(とかそんな感じの)部分まで戻る必要があります。どうすれば、思考の流れを損なわずに、素早く移動できるでしょうか?

Vim を用いて素早く移動する例を、いくつか見てみましょう。

注意
移動は、全て現在のカーソル位置を基準とします。
  • 次の単語に移動したいときは? w を入力します。
  • 次の段落に移動したいときは? } を入力します。
  • 3つめの ‘h’ という文字に移動したいときは? 3fh を入力します。
  • 35行下に入力したいときは? 35j を入力します。
  • このような移動のあと、前の位置に戻りたいときは? ctrl-o を入力します。
  • どういう仕組みなのか知りたいときは?先に進みましょう!

まずは chandrayaan.txt というファイルを(新規に)開いて、次のテキスト (taken from Wikipedia) を入力しましょう。

Chandrayaan-1 is India’s first mission to the moon. Launched by India’s national space agency the Indian Space Research Organisation (ISRO). The unmanned lunar exploration mission includes a lunar orbiter and an impactor. The spacecraft was launched by a modified version of the PSLV XL on 22 October 2008 from Satish Dhawan Space Centre, Sriharikota, Andhra Pradesh at 06:23 IST (00:52 UTC). The vehicle was successfully inserted into lunar orbit on 8 November 2008. The Moon Impact Probe was successfully impacted at the lunar south pole at 20:31 hours on 14 November 2008.

The remote sensing satellite had a mass of 1,380 kilograms (3,042 lb) at launch and 675 kilograms (1,488 lb) at lunar orbit and carries high resolution remote sensing equipment for visible, near infrared, and soft and hard X-ray frequencies. Over a two-year period, it is intended to survey the lunar surface to produce a complete map of its chemical characteristics and 3-dimensional topography. The polar regions are of special interest, as they might contain ice. The lunar mission carries five ISRO payloads and six payloads from other international space agencies including NASA, ESA, and the Bulgarian Aerospace Agency, which were carried free of cost.

Vim 流のカーソル移動

移動に使う最も基本的なキーは ‘hjkl’ です。これはそれぞれ、左、下、上、右に対応していますが、両手を home row の通りに置いていれば、あなたの右手のすぐ下にあるキーだということに注意しましょう。

しかし、なぜ矢印キーを使わないのでしょうか?それは、矢印キーはキーボードの離れた場所にあるので、マウスを使うときと同じくらい手を移動させなければならないからです。

右手の指は jkl; の上に(そして親指はスペースバーの上に)置くということを、思い出しておきましょう。では、この4つのキーの使い方を見てみましょう。

矢印キーのかわりに h,j,k,l を使います

h 人差し指(いま ‘j’ の上にあるはず)を左に移動して ‘h’ を押します。これが一番左のキーで、「左に移動」を表しています。
j ‘j’ キーを押すと下に移動します。
k 上を指している形の ‘k’ キーは、上への移動を表します。
l 一番右の ‘l’ キーは右への移動を表します。

操作は、回数を前に指定することで繰り返しができます。たとえば 2j とすれば、操作 j2 回繰り返します。

テキスト chandrayaan.txt を開き、これらのキーの練習をしましょう。

  • はじめの文字 ‘C’ にカーソルを合わせます。
  • 2j を入力し、現在の長い行と空行をスキップして2行目(つまり2段落目)に移動しましょう。
  • 2k を入力し、はじめにいた所に戻ります。もしくは ctrl-o を入力すると戻ります。
  • 5l を入力し、5文字分、右に移動します。
  • 5h を入力し、5文字分、左に移動します。もしくは ctrl-o を入力して戻ります。

矢印キーではなく、'hjkl' を使うことに慣れましょう。何回か試すうちに、これらのキーを使うほうがはるかに速いことに気づくと思います。

同様に、次のような移動に対応する、もっと簡単なキーがあります。これで、手の移動がだいぶ節約できることに注目しましょう。特にこういった特殊キーは、キーボードを探し回って見つける場合がよくありますが、それを完全に回避できます。

従来 Vim
‘home’ キーで行の先頭に移動。 ^ キー
‘end’ キーで行の末尾に移動。 $ キー
‘pgup’ キーでスクリーンを上昇 ctrl-b(1スクリーン前 (‘b’ackward) の意味)
‘pgdn’ key moves one screen down ctrl-f(1スクリーン後 (‘f’orward) の意味)

移動したい行番号が正確に分かっていたら、たとえば 50 行目なら 50G と入力すると、そこに移動します。番号を書かずに G と入力するとファイルの末尾に移動します。ファイルの先頭に移動するには?1G とすればよいのです(*)。単純なキー操作で、こんなに様々なことができるのです。

  • カーソルを1行目に移動するには 1G を入力。(*)
  • 20 文字右に移動するには 20l を入力。
  • 1文字目に戻るには ^ を入力。
  • 行の末尾に移動するには $ を入力。
  • 最終行に移動するには G を入力。

【訳注】(*) gg を入力する方法もあります。

現在のウィンドウに表示されている、真ん中の行に移動したい時にはどうするのでしょうか。

  • 最も高い (‘h’igh) 場所(ウィンドウの1行目)に移動するには H を入力。
  • ウィンドウの真ん中 (‘m’iddle) に移動するには M を入力。
  • 最も低い (‘l’ow) 場所(ウィンドウの最終行)に移動するには L を入力。

そろそろ、タッチタイピングの重要さにお気づきでしょうか。手をメインエリアから動かさなくてよい、これは良いことです。

単語・文・段落

文字や行ごとに移動する方法を見てきましたが、私たちは普段、文章を単語や、単語のまとまり — 文、段落、セクションなど — ごとに把握しています。そこで、そういった単位、「テキストオブジェクト」ごとに移動する方法も学びましょう。

例から始めます。

The polar regions are of special interest, as they might contain ice.

まず ^ を押して、1文字目に移動しましょう。

[T]he polar regions are of special interest, as they might contain ice.

カーソル位置を示すのに、角かっこ [ ] を使うことにします。

次の単語 (‘w’ord) に移動するには、w を押します。これで、カーソルは ‘polar’ の ‘p’ の上に来ます。

The [p]olar regions are of special interest, as they might contain ice.

2単語うしろに移動するには、’w’ の前に回数を加えるだけです:2w としましょう。

The polar regions [a]re of special interest, as they might contain ice.

同様に、単語の次の末尾 (‘e’nd) に移るには e と入力します。

The polar regions ar[e] of special interest, as they might contain ice.

後ろ (‘b’ackward) の単語に移動するには b を用います。回数を付け加えることもでき、2b とすれば2単語前に戻ります。

The polar [r]egions are of special interest, as they might contain ice.

詳しくは :help word-motions をご覧ください。

文字や単語ごとの移動を学びました。今度は、文ごとの移動を見ましょう。

[C]handrayaan-1 is India’s first mission to the moon. Launched by India’s national space agency the Indian Space Research Organisation (ISRO). The unmanned lunar exploration mission includes a lunar orbiter and an impactor. The spacecraft was launched by a modified version of the PSLV XL on 22 October 2008 from Satish Dhawan Space Centre, Sriharikota, Andhra Pradesh at 06:23 IST (00:52 UTC). The vehicle was successfully inserted into lunar orbit on 8 November 2008. The Moon Impact Probe was successfully impacted at the lunar south pole at 20:31 hours on 14 November 2008.

はじめの文字にカーソルを置いてください (^)。

次の文に移動するには ) を入力します。

Chandrayaan-1 is India’s first mission to the moon. [L]aunched by India’s national space agency the Indian Space Research Organisation (ISRO). The unmanned lunar exploration mission includes a lunar orbiter and an impactor. The spacecraft was launched by a modified version of the PSLV XL on 22 October 2008 from Satish Dhawan Space Centre, Sriharikota, Andhra Pradesh at 06:23 IST (00:52 UTC). The vehicle was successfully inserted into lunar orbit on 8 November 2008. The Moon Impact Probe was successfully impacted at the lunar south pole at 20:31 hours on 14 November 2008.

すごいでしょう?

前の文に移動するには、( を入力します。

これで、どれだけ速く移動できるのか試してみましょう。ここでも回数を前に書くことができ、3) で3文後に移動します。

では全体の文章を使って、段落ごとの移動を学びましょう。}(閉じ中括弧)を入力すると次の段落に、}(開き中括弧)を入力すると前の段落に移動します。

より「大きな」括弧が、大きなテキストオブジェクトに対応していることに注目してください。既に気づいていた方は、既に Winner 、もとい Vimmer の思考ができはじめています。

ここでも、キーを覚えるのではなく、指が自然に動くよう習慣にしましょう。

詳しくは :help cursor-motions をご覧ください。

マークをつける

文章を書いているとき、あるセクションを書きなおさなければいけないことを思い出したとします。しかし、あとで戻って来られるよう、現在の位置を覚えておきたいとします。どうしたらよいでしょうか?

普通は、そのセクションに移動して、編集し、元いた場所にスクロールして戻るでしょう。これは無駄が多く、戻るべき場所も忘れがちです。

Vim では、もう少しスマートにできます。次の文章(ジョン・レノンによる詞)の5行目にカーソルを移動しましょう。そして ma と入力し、’a’ という名前のマークを作ります。カーソルを好きな場所に移動、たとえば 4j を入力しましょう。

I am eagerly awaiting my next disappointment.?Ashleigh Brilliant

Every man’s memory is his private literature.?Aldous Huxley

Life is what happens to you while you’re busy making other plans.?John Lennon

Life is really simple, but we insist on making it complicated.?Confucius

Do not dwell in the past, do not dream of the future, concentrate the mind on the present moment.?Buddha

The more decisions that you are forced to make alone, the more you are aware of your freedom to choose.?Thornton Wilder

'a (つまり、シングルクォートの後にマーク名)を入力しましょう。すると何と、カーソルがマークの場所の行に戻って来ます!

マーク名としては好きなアルファベット(a-z, A-Z)を使えるので、1ファイルにつき 52 個のマークを作成できることになります。

戻る・進む

これまでに学んだ様々な移動の途中、もといた場所に戻りたいとき、もしくは次の場所に再び進みたいときがあります。そのためには、戻るときは ctrl-o、進むときは ctrl-i を入力します。

テキストのパート

テキストオブジェクトを Vim に認識させ、コマンドに渡すには、いろいろな方法があります。たとえば、テキストの一部分を視覚的に選択して、~ を用いて大文字と小文字を逆転させたいとしましょう。

前章で作成した dapping.txt を開きましょう。いくつかのキーを使って、2段落目の ‘dapper’ という単語の1文字目に移動してください(ヒント:}, j, w を使います)。

Dapping means being determined about being determined and being passionate about being passionate.

Be a dapper.

v を入力してヴィジュアルモードに入り、ap を入力して段落 (‘a’ ‘p’aragraph) を選択します。その後 ~ を押して大文字と小文字を逆転させましょう。選択をキャンセルしたいときは <Esc> を入力します。

Dapping means being determined about being determined and being passionate about being passionate.

bE A DAPPER.

ほかのテキストオブジェクトとしては、単語 (‘a’ ‘w’ord) を表す aw、引用された語(たとえば “this is a quoted string” のような)を表す a"、括弧に挟まれたテキストを表す aw などがあります。

詳しくは :help object-motions 及び :help text-objects をご覧ください。

おわりに

Vim における、文章内の移動の仕方をいろいろ見てきました。それぞれの動きを覚えることではなく、可能な限り習慣化することです。特に、自分に関連のある動きを習慣化すれば、手の動きが減り、編集が速くなり、使っているソフトウェアよりも書いているテキストの方に集中できるようになります。

ほかにも興味深い移動の方法が、:help various-motions:help motion で読むことができます。