viの終了とファイルの保存
それでは次に、viの閉じ方とファイルの保存方法を確認しましょう。
まず、コマンドモードで「:」キーを打ってみてください。すると、「/」の時と同じように画面左下に「:」が表示されます。ファイルの保存やviの終了など、GUIの「ファイル」メニューで行うような操作はこの「:」の後ろに文字を入力することで行えます。例えば、viを終了する場合の文字は「q」です。つまり、:q
がviの終了コマンドです。
実際に:q
コマンドを実行してみてください。「:q」と入力し「Enter」キーを押すと実行されます。おそらく、次のようなエラーが画面の最下段に表示されて閉じられないはずです。
E37: No write since last change (add ! to override
「変更後に保存されていません」というエラーです。viが気を回して、保存してからでないとファイルを閉じられないようにしているのです。
ファイルを保存するコマンドは:w
です。実行してみましょう。しかし、今度は「No file name」というエラーが表示されたと思います。理由は、ファイル名を指定せずに保存しようとしたためです。既存ファイルを開いたときにはエラーは出ませんが、新規ファイル作成時にはこのエラーが出ます。
それでは、ファイル名を指定して保存してみましょう。ファイル名は半角スペース区切りで「:w」の後ろに記述してあげます。ここではファイル名を「test.txt」として保存します。
:w test.txt
画面最下段に次のように表示され、無事ファイルを保存できたことが知らされます。「9L,46C」というのは保存したテキストが9行(lines)、46文字(chars)だという意味です。
"test.txt" [New] 9L, 46C written
ここでもう一度:q
コマンドを実行してみてください。今度は無事viが閉じ、プロンプトが表示されて、コマンドが入力できる状態に戻りました。
ls
コマンドでファイル一覧を見てみましょう。次のように作成したファイルが表示されるはずです。
# ls test.txt
次回、viでtest.txtを開く場合には、vi
コマンドの後ろにこのファイル名も入力して実行します。テキストファイルをviで新規作成する場合も、同様にファイル名を入力すれば、:w
コマンドでの保存時にファイル名を入力しなくて済みます。
vi test.txt
viの強制終了とファイルの強制上書き
:w
コマンドでファイルを保存、:q
コマンドでviを終了することができました。ですが、時には編集した内容を保存せずに終了したいときがあります。このようなケースではviの強制終了を行います。
viで強制的な操作を実装する場合には、コマンドの最後に「!」を付けます。viを強制終了するコマンドは:q!
となります。これを実行すると、ファイルを編集した後でも、保存せずにviを終了できます。確認のために再度viで開いて確認してみると、編集内容が保存されていないことが分かります。
また、viで新規作成したテキストファイルを、既存ファイルと同じ名前で保存したいとき(つまりファイルを上書きしてしまいたいとき)には、:w!
コマンドを使います。「!」を付けないで同じファイル名で保存しようするとエラーになり、次のようなメッセージが表示されます。
E13: File exists (add ! to override)
このように「!」は強制的に操作する場合につけるので、使用する際には注意が必要です。
2つの操作を一度に行う
慣れてくると、:w
コマンドと:q
コマンドを2回に分けて実行することが手間に感じられてきます。そんなときに快適なのが:wq
コマンドです。:wq
コマンドを使うと、1つのコマンドで「保存して終了する」ことができます。
ZZ
コマンドでも:wq
コマンドと同じ操作が可能です。ただし、ZZ
コマンドは「:」が要りませんので注意しましょう。
また、複数のファイルの編集作業をする必要があるとき、一方のファイルを編集したら保存、終了して他のファイルを開き、また別のファイルを編集するときには開いていたファイルを保存、終了する……と繰り返すのは大変面倒です。そのようなときには:e
コマンドが便利です。
:e
コマンドはviを終了させることなく、編集中のファイルを閉じて、指定したファイルを開くことができます。試しにviで「test2.txt」を作り、閉じてから「test.txt」をviで開いてください。そして、コマンドモードで次のように入力します。
:e test2.txt
すると、test1.txtが閉じられ、代わりにtest2.txtが開きます。このとき、test1.txtを変更したのに保存していないとエラーになります。:w
コマンドで保存してから、:e
コマンドを実行しましょう。test1.txtを未保存の状態で終了して「test2.txt」を開きたい場合には、:e!
というように「!」を付けて実行します。