vim-jp / vimdoc-ja / usr_03

usr_03 - Vimドキュメント

メインヘルプファイルに戻る
usr_03.txt    For Vim バージョン 8.2.  Last change: 2020 Sep 03

                     VIM USER MANUAL - by Bram Moolenaar

                                カーソルの移動


文を入力したり削除したりするには、カーソルを目的の場所に動かさなくてはなりませ
ん。Vim にはカーソル移動のためのコマンドがたくさんあります。本章では、その中で
も重要なコマンドの使い方を述べます。コマンドの一覧は Q_lr を参照してくださ
い。

03.1  単語ごとの移動
03.2  行頭、行末への移動
03.3  文字への移動
03.4  カッコの対応
03.5  特定の行への移動
03.6  現在の場所を表示
03.7  スクロール
03.8  簡単な検索
03.9  簡単なパターン検索
03.10 マークの使用

次章: usr_04.txt  簡単な編集
前章: usr_02.txt  初めての Vim
目次: usr_toc.txt

==============================================================================
03.1  単語ごとの移動

カーソルを 1 単語先に進めるには、"w" コマンドを使います。他の Vim コマンドもそ
うですが、複数の単語を一気に進めるために数値 (カウンタ) による回数指定ができま
す。例えば、"3w" では 3 単語進みます。図で示すと次のようになります ("x" でマー
クされた位置から開始します):

        This is a line with example text
          x-->-->->----------------->
           w  w  w    3w

"w" で次の単語の先頭に移動します。既にカーソルが単語の先頭にある場合は、その次
の単語の先頭に移動します。
逆に "b" コマンドで直前の単語の先頭に戻ります。

        This is a line with example text
        <----<--<-<---------<--x
           b   b b    2b      b

"e" コマンドで次の単語の末尾に移動します。"ge" で直前の単語の末尾に移動します。

        This is a line with example text
           <----<----x---->------------>
           2ge   ge     e       2e

カーソルが行末の単語にある場合、"w" コマンドは次の行の最初の単語に進みます。こ
れを使うと "l" よりもずっと速く文章の中を動けます。"b" は "w" の逆方向に同じ
ルールで動きます。

単語は "." や "-"、")" といったアルファベット以外の文字で区切られます。Vimが何
を単語とみなすかは、'iskeyword' オプションの設定で変更できます。ヘルプで直接試
したい場合は正しく動作させる為に以下の様に 'iskeyword' をリセットする必要があ
ります:
        :set iskeyword&
空白を区切りとした単語(WORD)を移動することもできます。これは普段意識する単語
(word)とは若干違うため、大文字を使っています。WORD単位で動くコマンドは全部大
文字です。図で示すと次の通りです。

               ge      b          w                             e
               <-     <-         --->                          --->
        This is-a line, with special/separated/words (and some more).
           <----- <-----         -------------------->         ----->
             gE      B                   W                       E

小文字と大文字のコマンドを両方使うと、文章中をより素早く動けるようになります。

==============================================================================
03.2  行頭、行末への移動

"$" コマンドでカーソルを行末に移動します。キーボードに<End>キーがあれば、それも
同じ意味で使えます。

"^" コマンドでカーソルを行頭から最初の非空白文字に移動します。"0" (数字のゼロ)
コマンドは行頭に移動します。<Home>キーも同じです。図で示しましょう ("." は空白
を示します):

                  ^
             <-----------x
        .....This is a line with example text
        <----------------x   x-------------->
                0                  $

("....." は空白文字があることを示します)

"$" コマンドでも他の移動コマンドのようにカウンタの指定ができます。行末への移動
を何度やっても意味がありませんので、"$" コマンドでのカウンタは他の行の行末への
移動の意味になります。例えば、"1$" は "$" と同じで現在行の行末への移動ですが、
"2$" は次の行末への移動、"3$" は 2 行下の行末への移動、となります。
"0" コマンドは回数指定できません。これは、"0" 自身が回数指定の一部になってしま
うからです。"^" に回数指定をした場合は単に無視されます。

==============================================================================
03.3  文字への移動

特に便利な移動コマンドはいくつかありますが、一文字検索コマンドもその一つです。
コマンド "fx" はその行にある文字 x を前方検索します。(f は Find の意味です)。
例えば、次の文の先頭にカーソルがあり、human の h に移動したいとします。"fh"
コマンドを実行すると、'h' の上にカーソルが進みます。

        To err is human.  To really foul up you need a computer.
        ---------->--------------->
            fh           fy

続いて、"fy" コマンドで really の y まで移動できます。
これもカウンタ指定ができます。例えば次の文の foul の l に進むには "3fl" です。

        To err is human.  To really foul up you need a computer.
                  --------------------->
                           3fl

"F" コマンドで左向きに検索できます。

        To err is human.  To really foul up you need a computer.
                  <---------------------
                            Fh

"tx" コマンドは "fx" コマンドに似た動きをしますが、検索した文字の上ではなく、
その直前で止まります。(tはToの意味です)
このコマンドの逆方向版は "Tx" です。

        To err is human.  To really foul up you need a computer.
                   <------------  ------------->
                        Th              tn

この 4 つのコマンドは ";" コマンドで繰り返せます。反対方向に繰り返すには ","
コマンドです。このコマンドは、カーソルが他の行に移動することはありません。文が
次行に続いていても移動しません。

検索をしようとして、コマンドを打ち間違うこともあるでしょう。例えば、逆方向検索
のつもりで ("F" と打つべきところを) "f" と打ってしまったとしましょう。コマンド
の実行を取り止めるには<Esc>を押します。"f<Esc>" は<Esc>を探すのではなく、コマ
ンドをキャンセルします。Note:<Esc>は検索に限らず、ほとんどのコマンドをキャンセ
ルするのに使えます。

==============================================================================
03.4  カッコの対応

プログラムを書いていると、入れ子になった () を書くことがよくあります。そのよう
な場合には、"%" コマンドがとても便利です。このコマンドを使うと対応するカッコに
移動できます。カーソルが "(" の上なら対応する ")" に、")" の上なら対応する "("
に移動できます。

                            %
                         <----->
                if (a == (b * c) / d)
                   <---------------->
                            %

このコマンドは [] や {} のペアでも機能します。(これは 'matchpairs' オプション
で定義できます)

カーソルがカッコの上にない場合、"%" はまず前方検索をしてカッコを探します。上記
の例文で行頭にカーソルがあった場合、"%" は前方検索をして "(" を見つけ、それか
ら、対応するカッコ ")" に移動します。

                if (a == (b * c) / d)
                ---+---------------->
                           %

==============================================================================
03.5  特定の行への移動

CやC++のプログラマであれば、次のようなパターンのエラーメッセージはおなじみで
しょう。

        prog.c:33: j   undeclared (first use in this function)

何か33行目に修正しないといけない点がありそうです。では、どうやって33行目に移動
しましょうか? "9999k" などとしてファイルの先頭まで移動してから、"32j" で32行
下に移動するやり方もあります。確かに目的は達しますが、あまりいい方法とは思えま
せん。そこで "G" というコマンドを使います。このコマンドにカウンタを指定すると、
その行にジャンプできます。例えば、"33G" とすれば、33行目にジャンプできます。
(実はコンパイラのエラーリストを使ってもっと簡単に移動する方法もあります。
usr_30.txt の ":make" コマンドをご覧ください。)
カウンタを指定しなかった場合はファイルの最終行にジャンプします。ファイルの先頭
にジャンプするには "gg" を使います。"1G" でも同じですが、ちょっと打ちにくいで
すから。

            |   first line of a file   ^
            |   text text text text    |
            |   text text text text    |  gg
        7G  |   text text text text    |
            |   text text text text
            |   text text text text
            V   text text text text    |
                text text text text    |  G
                text text text text    |
                last line of a file    V

特定行に移動するもう一つの方法はカウンタ付きの "%" コマンドです。例えば、"50%"
でファイルの真ん中に移動できます。"90%" ならファイルのほぼ最後(90%の場所) に移
動します。

以上述べたのは、画面上に見えているかどうかに関係なくファイルの特定行に移動した
い場合のコマンドでした。では画面上に見えている行に移動したい場合はどうしましょ
うか?そういう時に使える 3 つのコマンドを下図に示します。

                        +---------------------------+
                H -->   | text sample text          |
                        | sample text               |
                        | text sample text          |
                        | sample text               |
                M -->   | text sample text          |
                        | sample text               |
                        | text sample text          |
                        | sample text               |
                L -->   | text sample text          |
                        +---------------------------+

("H" はHome、"M" はMiddle、"L" はLastの意味です。あるいは、"H" をHigh, "M" を
Middle, "L" をLowともみなせます)

==============================================================================
03.6  現在の場所を表示

ファイル中の現在の場所を知るには、次の 3 つの方法があります。

1.  CTRL-Gコマンド。次のようなメッセージが表示されます。('ruler' オプション
    がオフの場合)

        "usr_03.txt" line 233 of 650 --35%-- col 45-52

    編集中のファイル名、カーソルのある行番号、全体の行数、ファイル全体を
    通してのパーセント、カーソル桁位置、を表示します。
    場合によっては、カーソル桁位置が 2 つに分けて表示されます。例えば、
    "col 2-9" の場合、カーソルは 2 文字目にあります。2 文字のうち、1 文字がタ
    ブ文字で、8 文字分で表示されているため、画面上では 9 桁目にある、というこ
    とです。

2.  'number' オプションを設定する。行頭に行番号が表示されるようになります:

        :set number

    オプションをオフに戻すには:

        :set nonumber

    'number' は論理値オプションなので、オプション名の先頭に "no" をつければオ
    フにできます。論理値オプションにはオンかオフの 2 つの状態しかありません。
    Vimには多数のオプションがあります。論理値オプションの他に、数値オプション
    と文字列オプションがあります。それらのオプションの設定方法はそのうち説明し
    ます。

3.  'ruler' オプションを設定する。現在のカーソル位置が、Vimウィンドウの右下隅
    に表示されるようになります:

        :set ruler

'ruler' は表示に場所を取らないので、画面を広く使えます。

==============================================================================
03.7  スクロール

CTRL-U コマンドで画面の半分だけ下にスクロールします。窓を通してテキストを見て
いて、その窓を高さの半分だけ上に動かす、と考えてください。窓が上に動き、さっき
より上の位置のテキストが表示されます。どっちが上でどっちが下かわかりにくいかと
思いますが、気にすることはありません。みんな同じように悩むことですから。
CTRL-Dコマンドは窓を半分だけ下げます。つまりテキストが画面の半分だけ上にスク
ロールすることになります。

                                       +----------------+
                                       | some text      |
                                       | some text      |
                                       | some text      |
        +---------------+              | some text      |
        | some text     |  CTRL-U  --> |                |
        |               |              | 123456         |
        | 123456        |              +----------------+
        | 7890          |
        |               |              +----------------+
        | example       |  CTRL-D -->  | 7890           |
        +---------------+              |                |
                                       | example        |
                                       | example        |
                                       | example        |
                                       | example        |
                                       +----------------+

1 行だけスクロールするにはCTRL-E(スクロールアップ)とCTRL-Y (スクロールダウン)
を使います。(MS-Windows互換のキーマップをお使いの場合、CTRL-Yはスクロールでは
なく、redo コマンドとなります)

1 画面分スクロールするにはCTRL-Fを使います(2行は重複します)。逆方向へのスク
ロールはCTRL-Bコマンドを使います。CTRL-FはForward、CTRL-BはBackward、ですから
覚えやすいでしょう。

"j" で何行も下に移動して、カーソルが画面の最下段にあるとします。カーソル前後の
行を表示したい場合は "zz" コマンドを使います。

        +------------------+             +------------------+
        | earlier text     |             | earlier text     |
        | earlier text     |             | earlier text     |
        | earlier text     |             | earlier text     |
        | earlier text     |   zz  -->   | line with cursor |
        | earlier text     |             | later text       |
        | earlier text     |             | later text       |
        | line with cursor |             | later text       |
        +------------------+             +------------------+

"zt" コマンドでカーソル行を画面の 1 行目として表示できます。"zb" コマンドなら
画面の最下段です。これ以外にもいくつかスクロールコマンドがあります。Q_scを参
照してください。カーソル近辺の数行を常に表示させたい場合は、'scrolloff' オプ
ションを使ってください。

==============================================================================
03.8  簡単な検索

文字列を検索するには "/string" コマンドを使います。例えば、"include" という単
語を探したいのであれば、次のように使います。

        /include

"/" を押すと、コマンドラインモードのときのように、カーソルがVimウィンドウの最
下段に移動します。そこで検索したい単語を入力します。入力した文字を訂正するに
は、バックスペースキー (左矢印 または <BS>) を使います。必要に応じて<Left>
<Right>の矢印キーを使ってください。
<Enter>を押すとコマンドが実行されます。

        Note:
        文字のうち、 .*[]^%/\?~$ には特別な意味があります。検索時にこれらを
        使う場合はその文字の直前に \ を置いてください。これは後(03.9
        最後)で述べます。

同じ文字列をもう一度探したい場合には "n" コマンドを使います。今のカーソル位置
の後ろにある#includeを探すには次のコマンドを使います。

        /#include

次に "n" を数回押すと、順々に #include にジャンプします。移動したい場所が何個
目かわかっているなら、カウンタも使えます。例えば、"3n" なら 3 つ目の #include
を探します。"/" にもまたカウンタを使えます: "4/the" は 4 つ目の "the" へ飛びま
す。

"?" コマンドは "/" と同じですが、逆方向に検索します。

        ?word

"N" コマンドは直前の検索とは反対の方向に検索を繰り返します。"/" の後で "N" を
使うと後方検索になり、"?" の後で "N" を使うと前方検索になります。


大文字/小文字の無視
-------------------

普通は探したい文字列の大文字/小文字を正確に指定しなければなりません。大文字と
小文字を区別したくないのであれば、'ignorecase' オプションを設定します。

        :set ignorecase

これで、"word" を検索すると、"Word" も "WORD" もヒットします。大文字/小文字を
区別するように戻すのは次のコマンドです。

        :set noignorecase


ヒストリ(履歴)
--------------

次のような3つの検索を行ったとします。

        /one
        /two
        /three

さて、"/" だけを入力し、まだ <Enter> を押さないでください。<Up> (上矢印キー)
を押すと、コマンド行に /three と表示されます。ここで <Enter> を押すと、
"three" が検索されます。<Enter>を押さずに<Up>を押すとコマンド行には "/two" と
表示されます。さらに<Up>を押すと "/one" となります。
同じように<Down>キーを使って逆方向に検索ヒストリを移動できます。

以前に使ったパターンを覚えていて、それをまた使いたい場合には、そのパターンの先
頭文字を入力してから <Up> を押してください。上の例で言えば、"/o<Up>" と入力す
ると、コマンドラインに "/one" と表示されます。

":" で始まるコマンドにもヒストリがあります。以前のコマンドを呼び出して、再実行
できます。検索用ヒストリと ":" コマンドヒストリは分かれています。


文章中の単語の検索
------------------

"TheLongFunctionName" という単語が文章中にあり、次に現れる場所を探したいと
します。もちろん、"/TheLongFunctionName" として検索もできますが、たくさんの打
鍵が必要です。それに、打ち間違えてしまうとうまく検索できません。
もっと簡単な方法があります。探したい単語の上にカーソルを置いて、"*" コマンドを
使うのです。カーソル位置の単語が抜き出され、それが検索文字列として使われます。
"#" コマンドは同じことを逆方向に実行します。このコマンドもカウンタが指定でき
ます。例えば、"3*" はカーソル位置の単語が 3 回目に現われる場所を探します。


単語全体を一致させる検索
------------------------

"/the" と検索を行うと、"there" などもヒットします。"the" で終わる単語だけを探
したい場合には次のようにします。

        /the\>

"\>" というのは特別なマーカーで、単語がここで終わっている時だけヒットします。
同じように "\<" は単語の始まりにだけヒットします。つまり、"the" という単語だけ
を探したい場合は、次のようにします。

        /\<the\>

これだと、"there" とか "soothe" にはヒットしません。なお、"*" と "#" コマンド
は上の「単語の先頭」と「単語の末尾」マーカーを使って、完全に一致する単語だけ
を探します。(単語の一部として検索したい時は "g*" と "g#" コマンドを使います)


検索結果の強調表示
------------------

プログラムの編集中に、"nr" という変数を見つけ、その変数がどこで使われているか
を知りたいとします。"nr" の上にカーソルを移動して、"*" と "n" コマンドで片っ端
から探すのもいいですが、他にも方法があります。次のコマンドを入力してください。

        :set hlsearch

"nr" を検索すると、ヒットした全てのパターンが強調表示されます。これなら余計な
コマンド入力が必要ないので、変数の使用箇所を確認したいときには便利です。
このオプションは次のコマンドでオフにできます。

        :set nohlsearch

さて上のやり方では、検索を行うたびに、いちいちオプションの切替えが必要になりま
す。単に強調表示を止めるだけなら、次のコマンドを使ってください。

        :nohlsearch

これならオプションはオフになりません。強調表示だけを取り消せます。次に検索コマ
ンドを実行すると、再び強調表示されます。"n" や "N" を使ったときも同様です。


検索のチューニング
------------------

検索の挙動を変更するオプションがいくつかあります。重要なのは次のものです:

        :set incsearch

これはいわゆるインクリメンタルサーチです。検索したい文字を入力している間にも
ヒットする文字列を探して画面に表示してくれます。これはヒットするパターンがある
かどうかのチェックに使えます。<Enter>を押すと実際にその場所にカーソルがジャン
プします。

        :set nowrapscan

ファイルの末尾まで進んだら(後方検索の場合はファイルの先頭まで戻ったら)検索を停
止します。'wrapscan' オプションの初期設定はオンです。オンの場合は、ファイルの
末尾まで進んだら先頭に戻って検索を続けます。


ところで...
-----------

これまでに出てきたオプションを毎回設定したい場合は、スタートアップファイルにそ
のコマンドを書いてください。
not-compatibleの説明のとおりにファイルを編集するか、次のコマンドを入力して、
ファイルがどこにあるか確認してください。

        :scriptnames

ファイルを編集するには、例えば次のようにします。

        :edit ~/.vimrc

そして、オプションを設定するためにVim上で実行したのと同じコマンドを書き加えま
す。例えば、次のようにします。

        Go:set hlsearch<Esc>

"G" でファイルの末尾まで移動し、"o" で新しい行を挿入して ":set" コマンドを書く
ための空行を作っています。挿入モードの終了は<Esc>です。そして、ファイルを保存
して閉じましょう。

        ZZ

次にVimを起動すると、'hlsearch' オプションが最初からオンになっています。

==============================================================================
03.9  簡単なパターン検索

Vimでは、検索に正規表現(regular expressions)を使います。
正規表現というのは検索パターンを指定するための、極めてパワフルでシンプルな方法
です。残念ながら、これの実力を発揮させるには少々苦労していただくことになりま
す。というのも、正規表現はちょっとばかりトリッキーなんです。
ここでは本当に基本的なものだけを述べます。パターン検索とコマンドについては
27章usr_27.txtでもっと詳しく説明します。完全な説明はpatternにあります。


行頭と行末
----------

"^" は行頭を示します。英語(ASCII)キーボードでは 6 のキーに、日本語(JIS)キーボー
ドでは 0 のキーの 2 つ右側に刻印してあります。
例えば、"include" というパターンは 行のどこかに include という単語を含んでいれ
ば、ヒットします。一方、"^include" は行頭にある include にだけマッチします。
"$" は同様に行末にヒットします。ですから、パターン "was$" は、行末が was で終
わっている場合だけヒットします。

下の例では、"/the" にマッチする箇所を "xxx" で示しています。

        the solder holding one of the chips melted and the
        xxx                       xxx                  xxx

"/the$" の場合は次のようになります。

        the solder holding one of the chips melted and the
                                                       xxx

"/^the" の場合はこうです。

        the solder holding one of the chips melted and the
        xxx

"/^the$" という指定もできます。この指定だと、完全に "the" という単語だけででき
ている行にのみヒットします。なお空白文字も意味を持ちます。ですから、"the " の
ように行末に空白文字を含んでいた場合は、"/the$" のパターンではヒットしません。


任意の 1 文字
-------------

"." はあらゆる文字にヒットします。例えば、"c.m" は最初が "c" で始まり、2 文字
目は何でも良くて、3 文字目が "m" であるパターンにヒットします。例を示します。

        We use a computer that became the cummin winter.
                 xxx             xxx      xxx


特殊文字
--------

例えば "." という文字自体を探す時は、上で述べたような特殊な意味を "\" 文字を
使って無効にします。
"ter." というパターンで検索をすると、次の "xxx" の箇所でヒットします。

        We use a computer that became the cummin winter.
                      xxxx                          xxxx

これを "ter\." で検索すると、上図の 2 つ目だけがヒットします。

==============================================================================
03.10 マークの使用

"G" コマンドでジャンプすると、その直前のカーソル位置が記録されます。これをマー
クと呼びます。元の場所に戻るには、次のコマンドを使います。

        ``

この ` は backtick とか open single-quote と呼ばれる(日本では「バッククォート」
が多いでしょうか)ものです。
このコマンドを 2 回実行すると、元の場所に戻ります。これは "`" コマンドもジャン
プコマンドなので、実行前の場所が記録されるためです。

通常、現在行以外にカーソルが動くようなコマンドを実行した場合、それをジャンプ
と呼びます。"/" や "n" もジャンプの一種です(ジャンプ先がどれだけ離れているかは
関係ありません)。逆に、文字検索である "fx" や "tx"、単語移動である "w" や "e"
はジャンプではありません。
"j" や "k" はカウンタを指定すればカーソルをはるか彼方に移動できますが、これも
ジャンプ扱いではありません。

"``" コマンドは 2 個所の間を交互にジャンプします。CTRL-Oコマンドはより古いマー
ク(O は Older の意味です)にジャンプします。CTRL-Iはより新しいマーク(たいていの
キーボード配列では "I" キーは "O" キーのすぐ左隣りです)にジャンプします。次の
コマンドを例にしましょう。

        33G
        /^The
        CTRL-O

まず33行目にジャンプします。次に "The" で始まる行を探します。ここでCTRL-Oを使
うと、33行目に戻ります。もう一度CTRL-Oを使うと、最初の場所に戻ります。そして、
CTRL-Iを使うと33行目にジャンプし、さらにCTRL-Iを使うと行頭が "The" で始まる行
にジャンプします。

             |  example text   ^             |
        33G  |  example text   |  CTRL-O     | CTRL-I
             |  example text   |             |
             V  line 33 text   ^             V
             |  example text   |             |
       /^The |  example text   |  CTRL-O     | CTRL-I
             V  There you are  |             V
                example text

        Note:
        CTRL-I<Tab>キーと同じです。

":jumps" コマンドで今までにジャンプした場所の一覧を表示できます。最後に使った
エントリには ">" 記号がついています。


名前付きマーク                                                  bookmark
--------------

文章中にマークを付けることができます。"ma" コマンドで現在のカーソル位置をマー
ク a に記録します。文章には 26 個 (aからzまで) のマークを付けられます。マーク
はVim が記録している位置情報です。画面に何かが表示されるわけではありません。
マークへの移動は `{mark} コマンドを使います。{mark}はマーク文字のことです。
マーク a に移動するには次のようにします。

        `a

"'{mark}" (アポストロフィ + マーク名)コマンドで{mark}を設定してある行の行頭に
移動できます。"`{mark}" コマンドの場合は更に、{mark}を設定した桁位置に移動し
ます。

マーク機能はファイル中の関連している 2 箇所で作業をする場合に便利です。例えば、
ファイルの最後の方を編集している時に、ファイルの最初の方の内容を確認する必要が
生じた場合を考えてみましょう。
まずファイルの最初の方に移動して、マーク s (startのつもり) を付けます。

        ms

次に編集したい場所に移動して、マーク e (endのつもり) を付けます。

        me

これで自由に行き来ができます。ファイルの先頭に移動したい時は、次のコマンドで
ジャンプできます。

        's

ここで、'' を使って戻ることもできますし、'e を使って末尾のマークまでジャンプす
ることもできます。
先頭にマーク s を、末尾にマーク e を使いましたが、その名前に特別な意味はありま
せん。単に覚えやすいから使っただけです。

次のコマンドは設定してあるマークの一覧を表示します。

        :marks

この一覧には次のような特殊なマークも表示されます。

        '       ジャンプする直前のカーソル位置
        "       直前にファイルを編集した時のカーソル位置
        [       直前の変更の開始位置
        ]       直前の変更の終了位置

==============================================================================

次章: usr_04.txt  簡単な編集

Copyright: see manual-copyright  vim:tw=78:ts=8:noet:ft=help:norl:
関連キーワード:  コマンド, 移動, usr, 検索, カーソル, 単語, 文字, 表示, CTRL, ジャンプ