vi 手習い

# vi 手習い

## コンテンツ

* はじめに
  * 対象読者
  * ゴール
  * コマンドの表記ルール
* Level 1
  * Hello!
  * 保存せずに終了
  * カーソル移動
* Level 2
  * コピー、ペースト、カット、ペースト
  * 行の中でのカーソル移動
  * 行移動とスクロール
* Level 3
  * 削除
  * 挿入
  * undo / redo
* Level 4
  * 検索
  * 置換
* Level 5
  * 繰り返し
  * 組み合わせ
* おわりに
  * もう一度
  * 旅立ち

## はじめに

### 対象読者

この文書は vi を使う入門者の方に向けて書きました。

実際に手を動かしながら読み進めてもらえることを想定しています。

### ゴール

最終的に vi での基本的なテキスト操作を身に付けることがゴールです。

### コマンドの表記ルール

コマンドの表記ルールは以下の通りです。

以下は i キーを押すことを意味します。

    i

次のように英大文字で書かれていたら、[Shift] キーを押しながら g キーを押します。

    G

[Ctrl] キーを押しながら u キーを押す場合は次のように記載します。

    [Ctrl]+u

次の場合はコロンキーを押し、次に q キーを押します。

    :q

シェルで打つコマンドは分かりやすくするために先頭に $ を付けています。

    $ vi

それでは始めましょう。

## Level 1

### Hello!

vi を起動しましょう。

    $ vi

今はコマンドモードになっています。

vi にはコマンドモードと挿入モードがあります。

これは他のテキストエディタには無い考え方です。

挿入モードに移行しましょう。

    i

挿入モードではテキストを入力できます。

    Hello, vi!

コマンドモードに戻りましょう。

    [Esc]

ファイルに保存しましょう。

    :w hello.txt

w は write の略です。

vi を終了しましょう。

    :q

q は quit の略です。

vi を起動し、テキストを入力し、ファイルに保存できるようになりました。

### 保存せずに終了

vi を起動しましょう。

    $ vi

今はコマンドモードになっています。

挿入モードに移行しましょう。

    i

グチャグチャっと入力しましょう。

    jaoiwrhgoihnihjv9as8e4ht

コマンドモードに戻りましょう。

    [Esc]

vi を終了します。

    :q

保存していないので注意されてしまいました。

保存せずに終了します!

    :q!

vi に慣れるまでは意図しない操作をしてしまうこともあるでしょう。

そんなときは [Esc] でコマンドモードに戻り、:q! で保存せずに終了しましょう。

落ち着いて、もう一度やり直せば大丈夫です。

### カーソル移動

maze.txt を作成しましょう。

    $ cat <<EOS > maze.txt
    S   ++++++++++++
    ++  +++        +
    ++  +++  ++++  +
    +   +++  ++++  +
    +  ++++  ++    +
    +  ++++  ++  +++
    +        ++    G
    ++++++++++++++++
    EOS

ファイルを開きましょう。

    $ vi maze.txt

今はコマンドモードになっています。

k, j, h, l で上下左右にカーソルを移動できます。

右、右、下、下、上、上、左、左。

    l
    l
    j
    j
    k
    k
    h
    h

S の場所から G の場所まで移動してください。

    S   ++++++++++++
    ++  +++        +
    ++  +++  ++++  +
    +   +++  ++++  +
    +  ++++  ++    +
    +  ++++  ++  +++
    +        ++    G
    ++++++++++++++++

ゴールできましたか?

    :q

## Level 2

### コピー、ペースト、カット、ペースト

vi を起動しましょう。

    vi

今はコマンドモードになっています。

挿入モードに移行しましょう。

    i

以下の内容を入力しましょう。

    Hello, vi!

コマンドモードに戻りましょう。

    [Esc]

一行コピーします。ヤンク (yank) するとも言います。

    yy

ペーストします。

    p

こんな状態になっていれば成功です。

    Hello, vi!
    Hello, vi!

カットします。

    dd

ペーストします。

    p

保存せずに終了しましょう。

    :q!

### 行の中でのカーソル移動

vi を起動しましょう。

    $ vi

今はコマンドモードになっています。

挿入モードに移行しましょう。

    i

以下の内容を入力しましょう。

先頭のスペース 4 つも忘れずに。

        cock a doodle doo.

行頭に移動しましょう。

英大文字の O ではなく、数字の 0 です。

    0

行末に移動しましょう。

    $

文頭に移動しましょう。

    ^

次の単語の先頭に移動しましょう。

    w

前の単語の先頭に移動しましょう。

    b

1 文字ずつ移動する h や l よりも早く目的地に辿り着けるでしょう。

    :q!

### 行移動とスクロール

1000 行あるファイルを作りましょう。

    $ seq 1000 > 1000-lines.txt

ファイルを開きましょう。

    $ vi 1000-lines.txt

今はコマンドモードになっています。

半ページずつ下に移動しましょう。

    [Ctrl]+d

半ページずつ上に移動しましょう。

    [Ctrl]+u

777 行目に移動しましょう。

    777G

1 行下にスクロールしましょう。

    [Ctrl]+e

1 行上にスクロールしましょう。

    [Ctrl]+y

10 行上に移動しましょう。

    10k

カーソルがある行が画面の中央になるようにスクロールしましょう。

    zz

最終行に移動しましょう。

    G

先頭行に移動しましょう。

    gg

1 行ずつ移動する j や k よりも早く遠くへ移動できますね。

    :q

## Level 3

### 削除

vi を起動しましょう。

    $ vi

今はコマンドモードになっています。

挿入モードに移行しましょう。

    i

以下の内容を入力してください。

    Hello

コマンドモードに戻りましょう。

    [Esc]

1 文字削除しましょう。

    x

以下の内容になっているはずです。

    Hell

最後まで削除しましょう。

    x
    x
    x
    x

きれいさっぱり、無くなりました。

保存せずに終了しましょう。

    :q!

### 挿入

vi を起動しましょう。

    $ vi

今はコマンドモードになっています。

挿入モードに移行しましょう。

    i

挿入モードではテキストを入力できます。

    Hello

コマンドモードに戻りましょう。

    [Esc]

Hello の o の位置にカーソルがあるはずです。

カーソルの右側から編集を開始しましょう。

    a

続けて以下の内容を入力しましょう。

    , vi!

以下の内容になっているはずです。

    Hello, vi!

コマンドモードに戻りましょう。

    [Esc]

行末から編集を始めましょう。

    A

以下の内容を入力しましょう。

     Enjoy vi!

以下の内容になっているはずです。

    Hello, vi! Enjoy vi!

コマンドモードに戻りましょう。

    [Esc]

1 行上に空行を挿入した状態で編集を始めましょう。

数字の 0 ではなく、英大文字の O です。

    O

次の内容を入力しましょう。

    abc

以下の内容になっているはずです。

    abc
    Hello, vi! Enjoy vi!

コマンドモードに戻りましょう。

    [Esc]

1 行下にに空行を挿入した状態で編集を始めましょう。

    o

次の内容を入力しましょう。

    def

以下の内容になっているはずです。

    abc
    def
    Hello, vi! Enjoy vi!

コマンドモードに戻りましょう。

    [Esc]

カーソル移動を最小限に、挿入モードに移行できるようになりましょう。

    :q!

### undo / redo

vi を起動しましょう。

    $ vi

今はコマンドモードになっています。

挿入モードに移行しましょう。

    i

以下の内容を入力しましょう。

    111
    222
    333
    444
    555

222 と 444 の行を削除しましょう。

    j
    dd
    j
    dd

こうなっているはずです。

    111
    333
    555

undo しましょう。

    u

redo しましょう。

    [Ctrl]+r

保存せずに終了しましょう。

    :q!

## Level 4

### 検索

numbers.txt を作りましょう。

    $ cat <<EOS > numbers.txt
    00 01 02 03 04 05 06 07 08 09
    10 11 12 13 14 15 16 17 18 19
    20 21 22 23 24 25 26 27 28 29
    30 31 32 33 34 35 36 37 38 39
    40 41 42 43 44 45 46 47 48 49
    50 51 52 53 54 55 56 57 58 59
    60 61 62 63 64 65 66 67 68 69
    70 71 72 73 74 75 76 77 78 79
    80 81 82 83 84 85 86 87 88 89
    90 91 92 93 94 95 96 97 98 99
    EOS

ファイルを開きます。

    $ vi numbers.txt

今はコマンドモードになっています。

77 を探しましょう。

    /77

7 で始まる数字を探しましょう。

    /7\d

次にマッチする場所に移動しましょう。

    n

前にマッチする場所に移動しましょう。

    N

vi を終了しましょう。

    :q

### 置換

fizz-buzz.txt を作りましょう。

    $ cat <<EOS > fizz-buzz.txt
    1    2    Fizz 4    Buzz     Fizz 7    8    Fizz Buzz
    11   Fizz 13   14   FizzBuzz 16   17   Fizz 19   Buzz
    Fizz 22   23   Fizz Buzz     26   Fizz 28   29   FizzBuzz
    31   32   Fizz 34   Buzz     Fizz 37   38   Fizz Buzz
    41   Fizz 43   44   FizzBuzz 46   47   Fizz 49   Buzz
    Fizz 52   53   Fizz Buzz     56   Fizz 58   59   FizzBuzz
    61   62   Fizz 64   Buzz     Fizz 67   68   Fizz Buzz
    71   Fizz 73   74   FizzBuzz 76   77   Fizz 79   Buzz
    Fizz 82   83   Fizz Buzz     86   Fizz 88   89   FizzBuzz
    91   92   Fizz 94   Buzz     Fizz 97   98   Fizz Buzz
    EOS

ファイルを開きます。

    $ vi fizz-buzz.txt

今はコマンドモードになっています。

置換します。

    :%s/FizzBuzz/fizzbuzz/g
    :%s/Fizz/FIZZ/g
    :%s/Buzz/BUZZ/g

うまく置換できたなら、このようになっているはずです。

    1    2    FIZZ 4    BUZZ     FIZZ 7    8    FIZZ BUZZ
    11   FIZZ 13   14   fizzbuzz 16   17   FIZZ 19   BUZZ
    FIZZ 22   23   FIZZ BUZZ     26   FIZZ 28   29   fizzbuzz
    31   32   FIZZ 34   BUZZ     FIZZ 37   38   FIZZ BUZZ
    41   FIZZ 43   44   fizzbuzz 46   47   FIZZ 49   BUZZ
    FIZZ 52   53   FIZZ BUZZ     56   FIZZ 58   59   fizzbuzz
    61   62   FIZZ 64   BUZZ     FIZZ 67   68   FIZZ BUZZ
    71   FIZZ 73   74   fizzbuzz 76   77   FIZZ 79   BUZZ
    FIZZ 82   83   FIZZ BUZZ     86   FIZZ 88   89   fizzbuzz
    91   92   FIZZ 94   BUZZ     FIZZ 97   98   FIZZ BUZZ

置換は次の形式で指定します。

    :対象範囲s/置換前/置換後/オプション

大文字小文字を区別せずに置換しましょう。

    :%s/fizz/Fizz/gi

こうなるはずです。

    1    2    Fizz 4    BUZZ     Fizz 7    8    Fizz BUZZ
    11   Fizz 13   14   Fizzbuzz 16   17   Fizz 19   BUZZ
    Fizz 22   23   Fizz BUZZ     26   Fizz 28   29   Fizzbuzz
    31   32   Fizz 34   BUZZ     Fizz 37   38   Fizz BUZZ
    41   Fizz 43   44   Fizzbuzz 46   47   Fizz 49   BUZZ
    Fizz 52   53   Fizz BUZZ     56   Fizz 58   59   Fizzbuzz
    61   62   Fizz 64   BUZZ     Fizz 67   68   Fizz BUZZ
    71   Fizz 73   74   Fizzbuzz 76   77   Fizz 79   BUZZ
    Fizz 82   83   Fizz BUZZ     86   Fizz 88   89   Fizzbuzz
    91   92   Fizz 94   BUZZ     Fizz 97   98   Fizz BUZZ

Buzz も置換しましょう。

ただし 5 行目だけです。

    :5s/buzz/Buzz/gi

1 から 4 行目の Buzz を置換しましょう。

    :1,4s/buzz/Buzz/gi

6 から 10 行目の Buzz も置換しましょう。

ただし、置換する前に確認しましょう。

    :6,10s/buzz/Buzz/gic

うまくできていれば、最初の内容に戻っているはずです。

    1    2    Fizz 4    Buzz     Fizz 7    8    Fizz Buzz
    11   Fizz 13   14   FizzBuzz 16   17   Fizz 19   Buzz
    Fizz 22   23   Fizz Buzz     26   Fizz 28   29   FizzBuzz
    31   32   Fizz 34   Buzz     Fizz 37   38   Fizz Buzz
    41   Fizz 43   44   FizzBuzz 46   47   Fizz 49   Buzz
    Fizz 52   53   Fizz Buzz     56   Fizz 58   59   FizzBuzz
    61   62   Fizz 64   Buzz     Fizz 67   68   Fizz Buzz
    71   Fizz 73   74   FizzBuzz 76   77   Fizz 79   Buzz
    Fizz 82   83   Fizz Buzz     86   Fizz 88   89   FizzBuzz
    91   92   Fizz 94   Buzz     Fizz 97   98   Fizz Buzz

保存して終了しましょう。

    :wq

## Level 5

### 繰り返し

vi を起動しましょう。

    $ vi

今はコマンドモードになっています。

挿入モードに移行しましょう。

    i

以下の内容を入力しましょう。

    Hello, vi!

コピーの仕方は覚えていますか?

    yy

ペーストのやり方は覚えていますか?

    p

もう一度、直前のコマンドを実行したい場合は . と入力します。

    .

3 回ペーストしましょう。

    3p

3p というコマンドがあるのではなく、p を 3 回、という意味です。

5 回ペーストする方法は分かりますか?

    5p

1 行削除しましょう。

    dd

7 行削除する方法は分かりますね。

    7dd

保存せずに終了しましょう。

    :q!

## 組み合わせ

vi を起動しましょう。

    $ vi

今はコマンドモードになっています。

挿入モードに移行しましょう。

    i

以下の内容を入力しましょう。

    cock a doodle doo.

行頭に移動する方法は覚えていますか?

    0

次の単語の先頭まで移動する方法は覚えていますか?

    w

前の単語の先頭まで移動する方法は覚えていますか?

    b

次の単語の先頭まで削除しましょう。

    dw

以下の内容になっているはずです。

    a doodle doo.

d に続けてカーソル移動のコマンドを入力する、というルールです。

行末まで削除しましょう。

    d$

テキストを全て消してしまったので、新しく入力しましょう。

    i

以下の内容を入力しましょう。

    111
    222
    333
    444
    555

コマンドモードに戻りましょう。

    [Esc]

カーソルを 3 行目の先頭に移動してください。

    gg
    j
    j

先頭行まで削除しましょう。

    dgg

最終行まで削除しましょう。

    dG

全てのテキストが消えました。

    :q!

## おわりに

### もう一度

おつかれさまでした。

先頭に戻りましょう。

繰り返し打ち込みましょう。

頭で考えなくても指が動くようになるまで。

### 旅立ち

vi とともに旅立ちましょう。

vi のことをもっと知るために。