1. ホーム
  2. コース一覧
  3. Linux基礎コース(パート1)
  4. テキストエディタ「vim」入門

Linux基礎コース(パート1)6/9

テキストエディタ「vim」入門

こちらの記事ではテキストエディタ(主にvim)について解説します。

テキストエディタとは?

テキストファイルを編集するソフトウェアをテキストエディタといいます。テキストエディタには、CUIのエディタとGUIのエディタがあります。

※CUI (Character User Interface)は文字(character)ベースのユーザーインターフェースです。ターミナルの黒い画面などを指します。

一方のGUI (Graphical User Interface)は、デスクトップ環境やアイコン、ウィンドウ、メニューなどの視覚的要素を用いてコンピュータとのやり取りができるインターフェースです。GUIを使用することで、マウスやタッチ操作などの直感的な操作が可能となり、コマンドを覚える必要がなくなるため、多くのユーザーにとって使いやすいとされています。

皆さんが今目にしているのは、GUIの世界なのです。

CUIのテキストエディタGUIのテキストエディタ
viVisual Studio Code
vimIntelliJ IDEA
EmacsAtom
nanoSublime Text
pico

vim

vim(vi)は、オランダのプログラマーである Bram Moolenaar氏によって開発されたUnix系OSの標準的なテキストエディタです。Emacsと並んで人気であり、さまざまなプラグインもあります。

vim (”Vi IMproved”)は、vi (”VIsual editor”)の拡張版であり、基本的な操作はviと共通しますが、より強力な機能と拡張性を持っています。

vimはCLIテキストエディタであるためGUIのものと比べて使いにくそうに思われるかもしれませんが、シンプルな作りにより操作が軽量で、プラグインも充実しているため柔軟なカスタマイズが可能であるなどの多くの利点があります。

vimの熱狂的なユーザーは、時折 "vimmer"と自称することもあります。これは公式な用語ではなく、個々のvimユーザーの間で使われています。

vimtutor

vimtutorは、ターミナル上でvimの基本的な操作を学べる機能です。標準で備わっている vimtutorコマンドを叩くことでvimtutorが起動します。

# vimtutorを起動します。
vimtutor
===========================================================
=    Welcome  to  the  V I M  Tutor   -   Version 1.7     =
===========================================================

vimtutorが起動できました。あとは、vimtutorの指示に従って進めていけば、基本的なvim操作について学ぶことができます。

基本的なvim操作について

こちらでは、vimtutorをベースに基本的なvim操作について解説していきます。

カーソルの移動

vimでは、h、j、k、lキーを使用してカーソルを移動します。

キー操作
h左に移動
j下に移動
k上に移動
l右に移動

矢印キーを押してもカーソルは移動できますが、上の4つのキーを使用すればホームポジションから手を動かす必要がないため、より高速な操作が可能になります。これら4つはカーソル移動の基本的なキーですが、その他のキーも後ほどご紹介します。

モードの切り替え

vimにはいくつかのモードがありますが、ここでは主に以下の4つの基本的なモードを取り扱います。

  • ノーマルモード:カーソル移動、ヤンク・プット、削除、Vimの終了などができます。
    • Escキーを押すことで他のモードからノーマルモードに切り替えます。

      ヤンク(yank) は、テキストをコピーすることです。実際は、テキストデータをバッファという領域に取り込んでいます。後ほどご紹介します。

      プット(put) は、コピーしたテキストをペーストすることです。バッファに取り込んだテキストデータを指定箇所に挿入します。こちらも後ほどご紹介します。

  • インサートモード:テキストの挿入・削除・プット、補完などができます。
    • iIaAsS のいずれかのキーでインサートモードに切り替えます。
  • ビジュアルモード:テキストのヤンク、削除、整形、移動、連結などができます。
    • vVctr-v のいずれかのキーでビジュアルモードに切り替えます。
  • コマンドラインモード:編集した内容を保存したり、vimを終了したりできます。
    • : (Exコマンド)でコマンドラインモードに切り替えます。

      ※ Exコマンドには他にも新たにウィンドウを作成したり(:new, :vnew)、タブページを開いたり(:tabnew)といった操作が可能な様々なコマンドがあります。

    • ファイルを保存したり、vimを終了するときはコマンドラインモードに切り替えます。

vimの起動と終了

vimコマンドを実行することで、vimを起動できます。

# test_fileというファイルを編集するために、vimを起動します。
vim test_file

コマンドを実行するとすぐにvimのウィンドウが開かれ、テキスト編集が行える状態になります。

vimを終了するには、次のような手順で操作が必要です。

  1. Escキーを押してノーマルモードに切り替えます。
  2. : を押してコマンドラインモードに切り替えます。
  3. :につづけて以下のいくつかのコマンドのあとに<Enter>キーを押して実行します。
コマンド説明
qvimを終了します (quitでも同様)
q!編集した内容を保存せずにvimを強制終了します (quit!でも同様)
wq編集した内容を保存してvimを終了します
wq!編集した内容を保存してvimを強制終了します
x何かしらの変更があった場合のみ内容を保存してvimを終了します (exitでも同様)
qa複数のファイルでvimを同時に起動している場合、全てのファイルのVimを終了します
cq編集した内容を保存せずにエラーコードを返してvimを終了します (cquitでも同様)

【TIP】ノーマルモードからvimを終了する方法

特定のキーの組み合わせを使って、コマンドを直接入力せずにvimを終了する方法もあります。

例として、以下のようなものがあります。

  • ZZ : 実行する内容は:xと同じです。
  • ZQ : 実行する内容は:q!と同じです。

テキストの編集

〜挿入編〜

vimを起動し、いざ編集しようというときには、インサートモードに切り替えます。インサートモードに切り替えるには、iキーを押します。すると、ターミナル左下に--INSERT--もしくは--挿入--と表示されるはずです。

編集が終わったらEscキーを押してノーマルモードに戻ります。Vimはモード切り替えを基本としたエディタで、テキスト編集ではこのインサートモードとノーマルモードの切り替えを頻繁に行います。これにより、様々な操作を効率的に行うことが可能になります。他にもインサートモードに切り替えるキーがあります。それぞれは目的によって使い分けられます。

キー説明
iカーソルの前に挿入
aカーソルの後に挿入
I行頭に挿入
A行末に挿入
o下に空白行を追加し、そこに挿入
O上に空白行を追加し、そこに挿入
s (またはcw)カーソル位置の文字を削除し、そこに挿入
S (またはcc)カーソルのある行を削除し、そこに挿入

挿入箇所までカーソルを移動してモードを切り替えて挿入するのもよいですが、上の表に含まれるようなカーソル位置に挿入したい場合には、キーを使い分けることで「モードの切り替え⇒挿入」という操作が高速で行えます。

これはこの後の削除編などでも同様で、キーによって作業を効率化できます。

〜削除編〜

ノーマルモードのままでも、テキストを削除することができます。削除したい文字の上までカーソルを移動させ、xキーを押します。挿入編と同じように、その用途によってさまざまなキーが割り当てられています。

キー説明
xカーソル位置の文字を削除
Xカーソルの前の文字を削除
dwカーソル位置の単語を削除(空白を含む)
deカーソル位置の単語を削除(空白を含まない)
ddカーソルのある行を削除
d$ (D)カーソル位置から行末までのすべてを削除
(C : 削除してインサートモードに)

オペレータとモーション

実は、これまで述べてきたvimコマンドは、全てオペレータとモーションという二つの要素からなっています。

オペレータ

操作(operation)を表すコマンドです。

以下に数あるオペレータの一部を示します。

オペレータ説明
c変更 (change)
d削除 (delete)
yヤンク (yank)
r置換 (replace)
v選択 (visual)
guアルファベットを小文字に変換
gUアルファベットを大文字に変換

モーション

カーソルを移動する位置を表したり、オペレータの対象となる範囲を表したりするキーです。

モーションはオペレータや数字と合わせて使用します。以下に数あるモーションの一部を示します。

キー説明
wカーソル位置から単語末尾まで(空白を含む)
eカーソル位置から単語末尾まで(空白を含まない)
$カーソル位置から行末まで

「テキストの編集 〜削除編〜」において、dwdeといった削除コマンドをご紹介しましたが、それらはdというオペレータと、weといったモーションを組み合わせることで実現されています。この組み合わせ方式がvimの操作を強力かつ効率的にしています。

カウント

同じ操作を何回も繰り返し行いたい場合は、モーションの前にその回数を表す数字(カウント)を指定します。

# たとえば、先頭の単語('Simple')にカーソルがあるとします。
Simple can be harder than complex.
	
# このとき、3wを実行することで、'Simple'を含む3単語先(空白を含む)の'harder'の先頭にカーソルが移動します。
Simple can be harder than complex.
	
# さらに、2eを実行すると、'harder'を含む2単語目(空白を含まない)である'than'の末尾にカーソルが移動します。
Simple can be harder than complex.

※ このとき、モーションはカーソル移動(motion)を表します。

なお、0というカウントのみを実行することで、先頭に移動できます。

つづいて、オペレータと組み合わせて使用する例を見てみましょう。

# たとえば、先頭にカーソルがあるとします。
Better late than never. Never late the better.
	
# このとき、d5wを実行すると、'Better'から'.'までの5文字(空白を含む)が削除されます。
Never late the better.

ヤンク&プット

vimでは、コピーとペーストをそれぞれ、ヤンクとプットと言います。

ヤンク(yank)

yankは「引っ張る」と言う意味です。ヤンクはほとんどの場合vと一緒に使われます。vで選択した範囲に対してyを使用することで、選択した範囲のテキストをコピーします。これは、GUIのエディタでマウスを使用して範囲選択し、コピーするのと同じです。他にもモーションやカウントと組み合わせてさまざまなヤンクが可能です。

キー説明
y選択された範囲をヤンク
yy (Y)カーソルのある行をヤンク
ywカーソル位置の単語をヤンク
y<移動コマンド>現在カーソルのある位置から移動先までの範囲をヤンク

プット(put)

コピーしたり切り取ったテキストを貼り付けるにはpを使用します。カーソルのある行の下にテキストが貼り付けられます。

置き換えコマンド

カーソル位置のテキストを置き換えるにはrを使用します。そして、rのあとに置き換えたい文字を入力します。たとえば、tに置き換えたいのであれば、rtと打ちます。複数の文字を置き換える場合には、Rを打つことで置換モードに入り、その後に置き換えたい文字を連続でタイプします。また、カーソル位置の単語の末尾までを置き換えたい場合にはceを使用します。

# 'butter'というタイポが見つかりました。
Done is butter than perfect.
	
# カーソルを'u'の位置まで移動し、reと打って'e'に置き換えます。
Done is better than perfect.

# 'foolish'を'free'に間違えてしまっています。
Stay hungry, stay free.
	
# カーソルを'r'の位置まで移動したら、ceで'r'以下を'oolish'に置き換えます。
Stay hungry, stay foolish.

変更オペレータであるcは、削除オペレータ(d)同様、他にもw$といったモーションや任意のカウントも指定できます。

元に戻る(取り消し)コマンド

操作を誤って、ひとつ前の状態に戻りたいことがあります。その場合は、uで戻ることができます。また、行単位で元に戻す場合は、Uを入力します。もしも、uで操作を戻し過ぎてしまった場合は、Ctrl+Rで取り消す(ひとつ前の操作に進める)ことができます。

カーソル位置の確認と移動

Ctrl+Gで、現在ファイルの何行目あたりにカーソルが位置しているのかを確認することができます。ファイルの最終行に移動するには、Gを使用します。カウントと組み合わせて、指定の行に移動することもできます(例:56G ⇒ 56行目に移動)。それとは逆に、ファイルの先頭に移動する場合は、ggを使用します。

検索コマンド

ファイル内におけるテキスト検索には、前方検索と後方検索(逆検索)があります。

  • 前方検索:◯◯から始まるワードを検索します。
  • 後方検索:カーソル位置から前方へのテキスト検索を行います。

前方検索を行うには、/を使用します。

/のあとに検索したい文字列を打ち、<Enter>キーを押します。

nを繰り返し入力することで、同じ検索を繰り返し行えます。

逆検索を行う際には、Nを入力します。

※ 逆検索とは、前方検索で次に見つかる結果に移動するにはnを使用し、前の結果に移動するにはNを使用します。後方検索でも同様にnとNを使用できます。

たとえば、前方検索をしているときの逆検索は後方検索となります。

後方検索を行うには、?を入力します。?のあとに検索したい文字列を打ち、<Enter>キーを押します。

また、対応する括弧を検索して探すこともできます。

任意の括弧の上で%を入力すると、その括弧に対応する括弧にカーソルが移動します。

これは、vimでコーディング・デバッグを行うようなときに役立ちます。

間違いを修正するコマンド

テキストを修正するには次のようなコマンドもあります。

コマンド          説明
:s/XXX/YYYカーソルのある行の先頭のXXXという単語をYYYに置き換える
:s/XXX/YYY/gカーソルのある行全体(global)で、すべてのXXXという単語をYYYに置き換える
:%s/XXX/YYY/gファイル全体で、すべてのXXXという単語をYYYに置き換える
:1,999s/XXX/YYY/g1行目から999行目までの範囲で、XXXという単語をYYYに置き換える
:%s/XXX/YYY/gcファイル全体で、1つ1つ確認(check)をとりながら、すべてのXXXという単語をYYYに置き換える

外部コマンドの実行方法

vimを起動したまま外部コマンドを実行することも可能です。

外部コマンドを実行するには、:!と打った後に、実行したい外部コマンド(ここではlsとしましょう)、<Enter>キーという順で入力します。すると、シェルプロンプトに切り替わり、lsコマンドを実行した結果が表示されます。外部コマンドの実行結果を確認した後、vimに戻るには<Enter>キーを押します。

※ここでは、Linuxファイルシステムにおけるコマンド(要するにLinuxコマンド)をvimコマンドと区別するために「外部コマンド」と呼んでいます。

変更のファイル保存

外部コマンドを実行して表示されたシェルプロンプトにおいて、:wを使用すると、任意のファイル名でそこまでの変更内容をファイルとして保存できます。

:w FILE_NAMEと入力することで、FILE_NAMEというファイル名で保存できます。

選択範囲のみをファイルに書き出す

  1. vを押して、範囲選択モードに入ります。
  2. カーソルで選択範囲を指定します。
  3. 選択範囲を指定し終わったら、:キーを押してコマンドモードに移動します。この時点で、選択範囲に対してコマンドが適用されることが表示されます。
  4. 画面下に表示された記号に続けて、w FILE_NAMEと入力し、Enterキーを押すことで選択範囲を別のファイルに保存できます。

ファイルの取込と合併

既存のファイルを取り込むこともできます。取り込みたい位置にカーソルを移動させ、:rでファイル名を指定します。さらには、外部コマンドの実行結果を取り込むことができます。たとえば、:r !lsとすると、lsコマンドの実行結果がカーソル位置に挿入されます。

オプションの設定

vimにはオプションという操作を便利にするための機能(内部変数のようなもの)があります。検索やテキストの置き換えを行う場合には特にその効果を発揮します。オプションを設定するには、コマンドモードで :set オプション名 、もしくは、 :se オプション名 を使用します。

数あるオプションの一部を以下に示しています。

オプション説明
ignorecase大文字・小文字を区別せずに検索する
number行番号を表示する
cursorlineカーソルのある行にアンダーラインをつけて表示する
hlsearch検索条件にマッチするテキストをハイライト表示する
incsearchインクリメンタル検索を行う

他にもたくさんのオプションが存在しますので、ぜひ調べてみてください。

また、上記のオプション名の頭にnoとつけることでそのオプション設定をやめることができます。1つの検索コマンド実行時にあるオプション設定を外したいときには、検索ワードの末尾に\cをつけます。

さらに、:set オプション名?のようにすることで、特定のオプションの設定値を知ることができます。

~/.vimrc

vimの詳細な設定をするには、~/.vimrcファイルを編集します。:e ~/.vimrcというコマンドを実行することで、ホームディレクトリに.vimrcを作成できます。 ~/.vimrc ファイルには、コマンドを実行するたびに設定する必要のない、永続的なオプションをまとめておくことができます。

まとめ

テキストエディタ vimについて解説しました。ターミナルを使用する上でvimを扱えないととても不便です。nanoやEmacsも人気ですが、vimは様々なディストリビューションで使えることも強みです。その点でもvim操作に慣れておくことは重要です。

問題を解くためには、十分な画面サイズのPC環境をご利用下さい。