103.8 レッスン 1
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
103 GNUおよびUnixコマンド |
Objective: |
103.8 基本的なファイル編集 |
Lesson: |
1 of 1 |
はじめに
ほとんどのLinuxディストリビューションでは、vi
(visualの略です)があらかじめインストールされており、シェル環境での標準エディタになっています。viは対話的なテキストエディタであり、編集中のファイルの内容を画面に表示して、文書中のどこでも自由に移動して変更できます。vi
はグラフィカルなデスクトップ環境で動作するビジュアルエディタではなく、シェル環境で用いるターミナルで動作するアプリケーションで、編集作業にキーボードショートカットを使います。
最近では vi
の代わりに vim
(vi improvedの略です)が使われることがほとんどです(訳注:vi
というコマンドで実際には vim
が呼び出されます)。vim
はシンタックスハイライト、多段階の「アンドゥ(元に戻す)」と「リドゥ(やり直し)」や、複数ファイルの編集をサポートしています。多機能になっていても vim
は vi
と完全に後方互換性があり、ほとんどの作業はどちらでも同じように行えます。
vi
はパラメータにファイルパスを指定して起動するのが一般的です。`(プラス)の後に数値を入れるとその数値の行にカーソルがある状態で開きます。`vi +9 /etc/fstab` というコマンドはカーソルが9行目にある状態で `/etc/fstab` ファイルを開きます。数値を入れずに `
(プラス)だけだとカーソルが最終行にある状態で開きます。
vi
のインターフェイスはとてもシンプルです。パラメータに指定したファイルの内容がターミナルウィンドウの全面に表示されます。ファイルの内容以外では、カーソルの現在位置などを示すフッター行(最下行)と、画面サイズよりもファイルの内容が短いことを示す ~
(チルダ)だけが表示されます。vi
にはいくつかのモードがあり、モードに応じて動作が変わります。入力モードとノーマルモードの2つをよく使います。
入力モード
入力モードでは、読んで字のごとく、キーボードで打ち込んだ文字が画面に入力されて表示されます。テキストエディタならそれが当たり前だと思われるかもしれませんが、実は vi
がファイルを開いた直後のモードは入力モードではありません。ノーマルモードが vi
のデフォルトのモードなのです。入力モードに入るにはノーマルモードで入力コマンドを実行しなければならないのです。Escキーを押すと入力モードからノーマルモードに戻ります。
Note
|
他のモードについてもっと知りたければ、 :help vim-modes-intro |
ノーマルモード
ノーマルモードは、コマンドモードと呼ぶこともありますが、vi
が起動したときのデフォルトのモードです。このモードでは、キーボードのそれぞれのキーを押すと、(その文字が画面に入力されて表示されるのではなく)画面を移動したり文字を操作したりするコマンドが実行されます。各コマンドがどれかのキーに割り当てられています(同じコマンドが複数の種類のキーに割り当てられていることもあります)。そのうちのいくつかを示します(訳注:日本語は文やワードの概念が英語とは異なるため、文やワードに関係するコマンドを実行する際には注意してください)。
0
、$
-
それぞれ行頭あるいは行末に移動します。
1G
、G
-
それぞれファイルの先頭あるいは末尾に移動します。
(
、)
-
それぞれ文の先頭あるいは末尾に移動します。
{
、}
-
それぞれ段落(空行で区切られたかたまり)の先頭あるいは末尾に移動します。
w
、W
-
次のワードに移動します。
W
は句読記号もワードに含めて移動します。 h
、j
、k
、l
-
それぞれ、左、下、上、右に移動します。
e
、E
-
ワードの末尾に移動します。
E
は句読記号もワードに含めて移動します。 /
、?
-
/
は下方向に、?
は上方向に、それぞれ続けて入力した文字列を検索します。 i
、I
-
それぞれ現在のカーソル位置あるいは行頭で入力モードに入ります。
a
、A
-
それぞれ現在のカーソル位置の後あるいは行末で入力モードに入ります。
o
、O
-
それぞれ現在行の後あるいは前に空行を加えて、そこで入力モードに入ります。
s
、S
-
それぞれ現在のカーソル位置の文字あるいはカーソルがある行全体を消してから入力モードに入ります。
c
-
対象を指定して変更します。例えば、
cw
でカーソル位置からワードの終わりまでを、cb
でワードの始まりからカーソル位置までを、cc
でカーソルがある行全体を、それぞれ変更します。 r
-
カーソル位置の文字を、続いて入力した1文字で置き換えて、ノーマルモードに戻ります。
x
-
選択した文字またはカーソル位置の文字を削除します。
v
、V
-
ビジュアルモードに入り、それぞれ現在カーソルがある文字あるいは行から選択を開始します。
G
、w
、h
、j
、k
、l
、e
などのカーソル移動コマンドで、選択範囲を調整できます。 y
、yy
-
対象を指定してコピー(ヤンク)します。
yw
でカーソル位置からワードの終わりまでを、y$
でカーソル位置から行末までを、yy
でカーソルがある行全体をコピーします(訳注:いわゆるクリップボードのことを、vi
では「ヤンクバッファ」と呼びます。明示的にヤンクした時だけではなく、x
コマンドやd
コマンドで削除した文字列や行も、自動的にヤンクバッファに格納されます。格納された文字列ないし行によって、現在の行にペーストする「文字」モードと新しい行にペーストする「行」モードがあることに注意してください)。 p
、P
-
それぞれ現在のカーソル位置の後あるいは前に、コピーした(ヤンクバッファの)内容をペーストします。
.
(ピリオド)-
現在のカーソル位置で、直前に実行したテキスト編集コマンドを繰り返します。挿入モードに入った瞬間からノーマルモードに戻るまでの間の操作も一つのテキスト編集コマンドだとみなされますから、例えば、
A;
と順に押して行末に;
(セミコロン)を入力してからEscキーを押してノーマルモードに戻ると、カーソルを移動させて.
(ピリオド)を押すだけでその行末に;
(セミコロン)を入れることができるようになります。 u
-
直前のテキスト編集コマンドのアンドゥ(元に戻す)。複数回繰り返すことができます。
Ctrl-R
-
直前のアンドゥ(元に戻す)のリドゥ(やり直し)。
ZZ
-
保存して終了します(訳注:確認せずに終了するので、通常はコロンコマンド
:wq
を使うのがお勧めです)。 ZQ
-
保存せずに終了します(訳注:確認せずに終了するので、通常はコロンコマンド
:wq!
を使うのがお勧めです)。
コマンドの前に数値を入力すると、その回数分だけそのコマンドを繰り返し実行します。例えば、3yy
と押すと現在の行から3行分コピーしますし、d5w
(5dw
) と押すと現在のワードから5ワード分削除するといった具合です。
vi
ではひとつのアクションを実行するために、複数のコマンドを連続して実行することが少なくありません。例えば、カーソル位置からワードの終わりまでを選択してコピーするには、vey
と入力します。すなわち、v
でビジュアルモードに入り、e
で単語の末尾まで移動し(ビジュアルモードなので選択されます)、y
で選択部分をヤンクしてビジュアルモードを終えます。3ワードを選択したければ、v3ey
と入力して、e
コマンドを3回繰り返します(訳注:より簡単には(ないしは vi
らしくは)、3dw
コマンドで3ワードを削除してから u
で削除を元に戻します。アンドゥしてもヤンクバッファの内容は変わりません)。
vi
ではコピーや削除したテキストをヤンクバッファではなく、a
〜z
の名前で区別される レジスタ に格納することができます。レジスタを使えば、複数の異なるテキストや行を、一時的に保持することができます。レジスタは "X
(Xはa-zのいずれか)で指定します。たとえば "lyy
というキーを順番に押すと、レジスタ l
に("l
)、現在カーソルがある行を格納(yy
)します。同様に、"lp
というキーを順番に押すと、レジスタ l
の内容をペーストします。
テキスト中の任意の場所にマークをつけて、後のその位置に素早く戻ることができます。m
キーを押してから何らかのキー(a-zとA-Zが使えます)を押すと、そのキーと現在のカーソル位置が結びつけられます。`
(バッククオート)を押してから先ほど結びつけたキーを押すとマークの位置に、'
(シングルクオート)を押してから先ほど結びつけたキーを押すとマークをつけた行の先頭に、それぞれカーソルが戻ります。
マクロとしてキーの組み合わせを記録することもできます。例えば、選択したテキストを "
(ダブルクオート)で囲むマクロを記録してみましょう。まず、テキストを選択し、q
を押します。次にマクロと関連付けるキーを押します。ここでは d
にしましょう。そうするとフッター行に recording @d
と表示されます。これでマクロの記録中だとわかります。すでにテキストは選択されているので、記録する最初のコマンドは選択したテキストを切り取る x
です。次に i
を押してから2個の "
を現在の位置に入力します。それからEscでノーマルモードに戻ります。最後に P
を押して、先ほど切り取った選択テキストを2個の "
の間にペーストします。もう一度 q
を押すとマクロの記録が終了します。これで x
、i
、""
、Esc、P
という一連のキーからなるコマンドを実行するマクロの記録ができました。ノーマルモードで @d
を押すと、何回でもこの一連のコマンドを実行できます。ここではマクロと関連付けるキーを d
にしたので、@d
でマクロを実行します。
マクロは現在のセッションでのみ有効です。セッションが終了してもマクロを使えるようにするには設定ファイルに保存します。最近のディストリビューションは vi 互換エディタとして vim を使っていることがほとんどなので、ユーザーごとの設定ファイルは ~/.vimrc
です。vi ~/.vimrc
でその設定ファイルを開き、let @d = 'xi""^[P'
という行を書いてください。^[
の部分は、^[
(キャレット、角かっこ)とキーボードから打ち込むのではなく、Ctrl+Vキーを押してからEscキーを押します。~/.vimrc
ファイルを保存してから vi
を起動すると、@d
で '
(シングルクオート)内の一連のコマンド(xi""^[P
)を実行できるようになります。先ほどのマクロを記録した後にはレジスタ d
に一連のコマンドが保存されていますから(vi
のノーマルモードで :register
を実行するとレジスタを確認できます)、~/.vimrc
を開いている vi
のノーマルモードで "dp
と順に押して '
(シングルクオート)内にその一連のコマンドをペーストしてもよいです。
コロンコマンド
ノーマルモードからは別種の vi
のコマンドであるコロンコマンドを使うこともできます。その名のとおり、ノーマルモードで:(コロン)キーを押してからコマンドを実行します。コロンコマンドでは、検索、保存、終了ができ、シェルコマンドを実行したり vi
の設定を変更したりすることもできます。よく使うコロンコマンドは次のとおりです(最初の :
(コロン)はコロンコマンドであることを示しています)。
:s/REGEX/TEXT/g
-
現在の行で正規表現
REGEX
にマッチした部分をすべてTEXT
に置換します。アドレスを指定すれば現在の行以外も置換できます。sed
コマンドと同じ書き方です(訳注::1,10s/REGEX/TEXT/g
で1行目から10行目のマッチした部分を、:%s/REGEX/TEXT/g
でファイル全体のマッチした部分を、それぞれすべてTEXT
に置換します)。 :!
-
シェルコマンドを実行します。例えば、
:!ls
を実行するとディレクトリの一覧が表示されます。 :quit
または:q
-
終了します。
:quit!
または:q!
-
保存せずに終了します。
:wq
-
保存して終了します。
:exit
または:x
または:e
-
テキストが変更されていれば保存して終了します。
vi
でおよそどのようなテキスト編集作業もできますが、シェル環境で使えるエディタは他にもあります(次の節でいくつか紹介します)。
Tip
|
|
シェル環境で使える他のエディタ
操作が直感的ではないため vi
に適応するのは難しいと感じる人もいるかもしれません。そういう人向けにGNU nano
というもっとシンプルなシェル環境で使えるエディタがあります。「アンドゥ(元に戻す)」と「リドゥ(やり直し)」、シンタックスハイライト、対話的な検索と置換、自動インデント、行番号表示、ワード補完、ファイルのロックとバックアップ、多言語対応などの基本的な機能が備わっています。vi
(のノーマルモード)とは違ってキーを押したら編集中の文書に入力されます。nano
ではコマンドをCtrlキーか⌘キーを押して実行します(訳注:⌘キーを「メタキー」と呼ぶこともあります。Meta-
と表記することが多いです。なお、ターミナルエミュレーターを使っている場合は、デスクトップ環境や日本語入力などのショートカットとバッティングするために使用できないことがあります。画面下部に表示されているヘルプを参考にしながら、ファンクションキーやCtrlキーを使うコマンドを覚えるとよいでしょう)。
Ctrl-6
またはMeta-A
-
選択を開始します。シフトキーを押しながら矢印キーで選択することもできます。
Meta-6
-
現在選択している範囲をコピーします。
Ctrl-K
-
現在選択している範囲を削除してカットバッファに格納します。
Ctrl-U
-
カットバッファの内容をカーソル位置にペーストします。
Meta-U
-
直前の操作のアンドゥ(元に戻す)。
Meta-E
-
直前のアンドゥ(元に戻す)のリドゥ(やり直し)。
Ctrl-\
-
テキストを検索して置換します。
Ctrl-T
-
スペルチェックを行います。
Ctrl-G
-
ヘルプ画面を表示します。
q
の入力でヘルプ画面が閉じます。
シェル環境で使えるテキストエディタには、Emacsというものもあります。基本的には nano
と同じようにキーをタイプすると入力されていくのですが、vi
のようにキーボードコマンドで文書中を移動することもできます。Emacsは(独自のLisp言語によって)機能を拡張することができるので、テキストエディタというよりもIDE(integrated development environment(統合開発環境))と捉えたほうがよいかもしれません。プログラムをコンパイルして実行したり、メールクライアントやRSSリーダーとして使う拡張モジュールがたくさん公開されていますから、Emacsだけで日常業務ができると言っても過言ではありません。
シェルコマンドがテキストエディタ(デフォルトでは vi
)を呼び出すこともあります。たとえば、cronjobs を編集するために crontab -e
を実行したときなどです。Bashでは VISUAL
や EDITOR
という名前の環境変数にデフォルトのテキストエディタを設定します。例えば、export EDITOR=nano
というコマンドを実行すると、現在のシェルセッションのデフォルトテキストエディタが nano
になります。~/ .bash_profile
に export EDITOR=nano
と記述すれば、セッションが終了してもこの設定が有効になります。
演習
-
vi
がよく使われるのは、設定ファイルやソースコードを編集する場面であり、インデントをするとテキストのまとまりがわかりやすくなります。<<
を押すと左に、>>
を押すと右に、それぞれ現在の行をインデントできます。ノーマルモードで現在の行を3段階右へインデントしてください。 -
vi
のノーマルモードでV
を押すと行全体を選択できます。このとき改行文字も選択されてしまいます。改行文字を含まない行全体を選択してください。 -
vi
で~/.bash_profile
ファイルをカーソルが最終行にある状態で開いてください。 -
vi
のノーマルモードで現在のカーソル位置から次の.
(ピリオド)までの文字を削除してください。
発展演習
-
vim
では行に関係なく任意の幅でテキストのブロック(矩形領域)を選択できます。ノーマルモードでCtrl+Vと押して選択を開始してからカーソルを上下左右に動かします。現在の行の最初の文字から8文字×5行のブロックを削除してください。 -
vi
のセッションが予期せぬ電源喪失により中断されたため、もう一度その編集中だったファイルを開いたところ、スワップファイル(vi
によって自動的に作成されたコピー)を回復するかどうかを尋ねるプロンプトが表示されました。スワップファイルを回復せずに破棄する場合はどうすればよいでしょうか。 -
vim
の現在のセッションでレジスタl
に何らかの行がコピーされているとします。レジスタl
にコピーされている行を現在の行の前にペーストするマクロをレジスタa
に記録してください。
まとめ
このレッスンではLinuxのシェル環境の標準的なテキストエディタである vi
を説明しました。慣れていない人にとってはとっつきにくくはあるのですが、テキストを編集する際に便利な機能が備わっています。このレッスンは以下の順で取り上げました。
-
vi
の基本的な使い方と便利な機能 -
vi
の改良版であるvim
と、シェル環境で使えるその他のエディタ -
シェル環境でのデフォルトのテキストエディタの設定方法
以下のコマンドと手順を取り上げました:
-
vi
とその改良版であるvim
-
vi
での基本的なテキスト編集 -
nano
とemacs
演習の解答
-
vi
がよく使われるのは、設定ファイルやソースコードを編集する場面であり、インデントをするとテキストのまとまりがわかりやすくなります。<<
を押すと左に、>>
を押すと右に、それぞれ現在の行をインデントできます。ノーマルモードで現在の行を3段階右へインデントしてください。>>>>>>
と>
を6回入力します。3>>
を実行すると、現在の行を3段階ではなく、現在の行から3行を1段階右へインデントします。 -
vi
のノーマルモードでV
を押すと行全体を選択できます。このとき改行文字も選択されてしまいます。改行文字を含まない行全体を選択してください。0v$h
というキーを順に押します。0
で行頭に移動し、v
で選択を開始して、$
で行末に移動し、h
で1文字分左に戻るということです。 -
vi
で~/.bash_profile
ファイルをカーソルが最終行にある状態で開いてください。vi + ~/.bash_profile
を実行します。 -
vi
のノーマルモードで現在のカーソル位置から次の.
(ピリオド)までの文字を削除してください。dt.
というキーを順に押します。d
で削除を開始し、t.
で.
(ピリオド)までを削除します。
発展演習の解答
-
vim
では行に関係なく任意の幅でテキストのブロック(矩形領域)を選択できます。ノーマルモードでCtrl+Vと押して選択を開始してからカーソルを上下左右に動かします。現在の行の最初の文字から8文字×5行のブロックを削除してください。0
(行頭へ)、Ctrl-V
(選択開始)、8l5j
(カーソル移動)、d
(削除)と順に押します。 -
vi
のセッションが予期せぬ電源喪失により中断されたため、もう一度その編集中だったファイルを開いたところ、スワップファイル(vi
によって自動的に作成されたコピー)を回復するかどうかを尋ねるプロンプトが表示されました。スワップファイルを回復せずに破棄する場合はどうすればよいでしょうか。プロンプトが表示されたら
d
を押します。 -
vim
の現在のセッションでレジスタl
に何らかの行がコピーされているとします。レジスタl
にコピーされている行を現在の行の前にペーストするマクロをレジスタa
に記録してください。qa"lPq
というキーを順に押します。qa
でレジスタa
にマクロの記録を開始し、"l
でレジスタl
にコピーされているテキストを選び、P
で現在の行の前にペーストし、q
でマクロの記録を終了します。