8.2 モード変更とカーソル操作
Linux Essentials Online Text | 2021/07/26

viエディタには2つのモードがあります。viエディタを起動するとコマンドモードになります。この状態では文字入力はできません。文字列を打ち込むには編集モードへ切り替えますが、切り替える際にコマンドを入力します。なお、基本的にはカーソルがある位置に対してその機能が有効になります。

テキストを入力

文字列を入力する編集モードは、コマンドで編集モードへ切り替える必要があります。

編集モードへ移行するには、数種類ある移行キーのいずれかを押下します。左下に[INSERT]という文字が表示され、編集モードに移行したことを確認する事ができます。ところで、前項で「abbbbbcccccddddd[Esc]」と入力した際、1文字目の「a」が入力されなかった事に気がついていたでしょうか。この「a」はテキストに入力する文字ではなく、編集モードへ移行するためのコマンドとして使用されていたため、入力結果には「a」が抜けた状態で表示されたのです。

実習:テキストの入力

ファイルを開いて文字列を入力したいので、新たに作成するファイルviwite2.txtに入力してみましょう。

$ vi viwite2.txt

viwite2.txt ファイルは新規ファイルですので、左下には[New File]と表示されているかと思います。

~
~
~
"viwite2.txt" [New File]

それでは、文字列を入力するために編集モードへ移行します。
まずは[i]コマンド(insertコマンド)を使ってみます。[i]は編集モードに移行した際、その場所から文字を入力することができます。「i」キーを入力してみてください。

~
~
~
-- INSERT --

左下に[INSERT]という文字が表示されます。これが編集モードの状態です。
この状態で「test」と入力してみてください。入力ができるはずです。

test
~
~
-- INSERT --

編集モードからコマンドモードに移行するには[Esc]キーを入力してください。左下の[INSERT]が消えていれば、コマンドモードに移行できています。コマンドモードでは[:wq]等を使用すれば、保存、終了が可能ですが、ここでは他の移行キーの使い方を演習したいと思います。

test
~
~

それでは、この「test」の右側に文字を入力してみます。
「test」の2つ目の「t」の上にカーソルを合わせて[a]キーを入力してみてください。

[a]コマンド(appendコマンド)は、カーソルの右側に文字を入力するときに使います。編集モードに移行した時、「test」の2つ目の「t」の右側にカーソルが移動します。
このまま「TEST[Esc]」と入力してみましょう。下記のようになるはずです。

testTEST
~
~

今度はこの「testTEST今度はこの「testTEST」の文字列のある行の先頭に文字を入力してみます。行の先頭にテキストを入力するには[I(大文字のアイ)]コマンドを使います。カーソルの位置に関係なく、行の先頭に文字を入力する事が出来ます。

ここでは[I]キーを入力して編集モードに移行した後、「1234[Esc]」と入力します([I]がコマンドで1234が入力する文字列です)。

1234testTEST
~
~

最後に、この「1234testTEST」という文字列の末尾にテキスト入力をします。行の末尾にテキストを入力するには[A]コマンドを使います。ここでは[A]キーを入力して編集モードに移行した後、「6789[Esc]」と入力します([A]がコマンドで6789が入力する文字列です)。

1234testTEST6789
~
~

文字を間違えたときは[BackSpace]でカーソルの前の1文字が削除できます。

では、一通り確認ができたら、ファイルの内容を編集できたら[:wq]コマンドで終了してください。

編集モードに移行するコマンド

コマンド実行後の動作
iカーソルの前に文字を入力
aカーソルの後に文字を入力
Iカーソルがある行頭に文字を入力
Aカーソルがある行末に文字を入力
oカーソルがある次の行頭に文字を入力
Oカーソルがある前の行頭に文字を入力
[BackSpace]カーソルの前の文字を削除
[Esc]編集モードからコマンドモードに切り替える

カーソルの移動

テキストファイルを編集していると、入力間違いに気が付いたり、既に入力したテキストを修正したいときがあります。追加する文字がある場合は、カーソルを修正したいところへ移動して文字を入力します。

実習:カーソルの移動

ファイルを開いて文字列を入力した後でカーソルを移動する練習をするために、vimove.txt を新たに作成しましょう。

$ vi vimove.txt

サンプルの文字列を用意するための準備として[i]キーで編集モードに移行し、「testtest[Esc]」を入力してください。この段階では、カーソルは行末尾の「t」の文字の所にあります。

testtest
~
~

この状態から、「test」と「test」の間に空白(スペース)を入力してみます。

カーソルを左へ移動するには[h]キーを、カーソルを右へ移動するには[l(エル)]キーを使います。カーソルを左右に動かしながら真ん中の「tt」のうち、右側の「t」にカーソルを移動し「[i][スペース][Esc]」を入力します。

test test
~
~

カーソルを移動するコマンド

コマンド実行後の動作
hまたは ←左へ移動
kまたは ↑下へ移動
jまたは ↓上へ移動
lまたは →右へ移動
H画面最上行の文頭に移動
L画面最下行の文頭に移動
0行頭に移動
$行末に移動

カーソルの上下移動は[j]で下へ、[k]で上へと対応しており、上下左右それぞれにキーが割り当てられています。十字キーでも移動できるため実際に使用する際に困ることは有りませんが、試験では文字キーによる移動を問われるのでしっかりと覚えましょう。

それでは、次に「test test」という文字列をさらに2行追加して3行にしてください。

test test
test test
test test

今度は、開始行に「Begin」、最終行に「End」と加えてみましょう。「[H][i]Begin[Enter][Esc]」と入力し、次に「[L][A][Enter]End[Esc]」と入力します。

Begin
test test
test test
test test
End
[H]キーで先頭行に移動、[i]キーで編集モードに移行して「Begin」入力、[L]キーで最終行に移動、[A]キーで行末に移動して編集モードに移行して「End」を入力しました。上記と同じ内容になっていれば、正しく入力できています。最後に、[:wq]コマンドでファイルへ保存してから終了してください。

このように、コマンドを覚えることで効率よく入力することができるようになります。

ページの移動

vi コマンドは小さなファイルから大きなファイルまでを編集できます。

1画面に収まらない大きなファイルを編集する場合、今まで覚えたような1文字ずつカーソルを移動するコマンドだけでは大変です。このような場合はページ単位で移動するコマンドや指定の行へ移動するコマンド、目的の文字列へ移動するコマンドを使います。

素早く編集するために画面をページ単位で前後へ移動するコマンドを使います。とはいえ、操作するコンソールやターミナルによって、1画面あたりに表示できる行数は様々です。そのため、実際は「デフォルト指定の行数」を1画面とみなして移動します。

実習:ページの移動

システムに既に存在している /var/log/dmesgというログファイルを利用してみます。
間違って変更した場合は、保存せず[:q!]で強制終了してください。
※ここで使用したファイルはログファイルなので、万一壊してしまった場合でも、Linuxが動かなくなることはありません。

$ vi /var/log/dmesg
[   0.000000] Linux version 3.10.0-1127.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ) #1 SMP Tue Mar 31 23:36:51 UTC 2020
[   0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-1127.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=ja_JP.UTF-8
[   0.000000] e820: BIOS-provided physical RAM map:
[   0.000000] BIOS-e820: [mem 0x0000000000000000-0x00000
(以下省略)
"/var/log/dmesg" [readonly] 498L, 31282C

次のページへの移動は[Ctrl]+[f]コマンドです。[Ctrl]+[f]を押して次の画面へ移動するのを確認してください。
前のページへの移動は[Ctrl]+[b]コマンドです。[Ctrl]+[b]を押して、前の画面へ戻ることを確認してください。

最初に説明したとおり、移動するのはデフォルトで指定してある行数なので必ずしも1画面単位で移動するとは限らず、画面サイズを変更すれば1画面単位で移動しません。ファイルの先頭に戻りたい、ファイルの末尾に行きたい、という場合も専用のコマンドが用意されています。

今回使用したファイルは保存しないで終了したいので[:q!]コマンドでvi を終了させます。

ページを移動するコマンド

コマンド実行後の動作
[Ctrl]+[f]コマンド次の画面へ
[Ctrl]+[b]コマンド前の画面へ
ggまたは:1文頭に移動
Gまたは:$最終行に移動

行を指定して移動

大きなファイルではページ単位の移動だけでは大変なこともあります。素早く編集するために、コマンドを使って指定の行へカーソルを移動する事もできます。

ページ単位での移動より大きく移動したい場合は、行数を指定して移動します。

行数を指定して移動するには、これまでにコマンドを入力する時に出てきた「:(コロン)」の後に行数を指定します。10行目へ移動したい場合は「:10」と入力、または「行数+G」と入力します。Gを使う場合は「:(コロン)」を入力する必要はありません。画面が見える状態で10行目へ移動しなかった場合、文字列が長くて2行に渡る行が含まれている場合がありますので注意してください。

先ほどと同じように /var/log/dmesg をviで開いて確認してみましょう。

[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 3.10.0-1160.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc versi
on 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Mon Oct 19 16:18:59 UTC 2020
(以下省略)
:10  ← [:(コロン)]の後に移動したい行数を入力する

なお、[Ctrl]+[g]を押すと現在カーソルがある行、全部で何行あるかがわかります。

[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 3.10.0-1160.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc versi
on 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Mon Oct 19 16:18:59 UTC 2020
(以下省略)
"/var/log/dmesg" [readonly] line 1 of 502 --0%-- col 1

最終行に書いてある「line 1 of 502」というのが、全体行数です。

行移動のコマンド

:nまたはnGn行目に移動する
[Ctrl]+[g]現在のカーソル行と、全体行数が表示される

使用したログファイルを変更しても保存しないで終了したいため、「:q!」コマンドでvi を終了させます。

PAGE TOP