viエディタの基本的な使い方

Linuxでファイルを編集する場合に使用するviエディタの使い方について書きます。

この記事を書く理由は、若い同僚とLinuxサーバーを操作する作業をしている時に、その同僚がLinux上のファイルをWindowsにダウンロードして編集しアップロードしていたので、直接編集できるスキルも必要かなと思ったからです。

インストール

Linuxのディストリビューションを通常にインストールするとviエディターは導入済みの場合がほとんどです。

しかし、Dockerイメージなどでは、最低限のパッケージのみ導入されていますので、追加でインストールする必要があります。

$ apt-get install vim

上記はDebian系の例で、vim(vi improved)というviの改良・拡張版のモジュールをインストールします。
インストールされると、vimがインストールされシンボリックリンクとしてviが作成されます。

$ which vi
/usr/bin/vi
$ ls -la /usr/bin/vi
lrwxrwxrwx 1 root root 20 May  1 08:17 /usr/bin/vi -> /etc/alternatives/vi
$ ls -la /etc/alternatives/vi
lrwxrwxrwx 1 root root 18 May  1 08:24 /etc/alternatives/vi -> /usr/bin/vim.basic

CentOSの場合は、以下のようにviがデフォルトでインストールされていると思いますが、必要であればyumやdnfでインストールします。

$ which vi
/usr/bin/vi
$ ls -la /usr/bin/vi
-rwxr-xr-x. 1 root root 1413696 Nov 12  2019 /usr/bin/vi

操作方法

viは、ほとんどどのような状態であってもESCキーを押下することでコマンドモードに遷移します。

以降のコマンドは、コマンドモードで実行します。

基本コマンド

コマンド動作
:qファイル書き込みせずに終了
:wファイル書き込み
!強制実行(w,qと組み合わせ)

この辺りは皆さんご存知だと思います。

編集結果を保存せずに終了する場合は、":q!"、保存して終了する場合は”:wq”といった具合に入力します。

":"キーを押した時点で、カーソルは画面左下のコマンド入力エリアに移動します。

ページ移動

コマンド動作
Ctl+f次ページを表示    
Ctl+b前ページを表示

Ctlキーと同時にキーを押します。
次ページ送り、前ページ送りされます。

カーソル移動

コマンド動作
G最終行へカーソル移動
gg先頭行へカーソル移動
$行末へカーソル移動
w単語を1つカーソル移動

こちらは、”:”を押さないで実施すると、カーソルが移動します。

検索

コマンド動作
/スラッシュ以降の単語を検索
n次を検索
N前を検索

コマンドモードでスラッシュキーを押下すると、カーソルが画面左下に移動し、キー入力を促します。
その状態で、検索文字列を入力しリターンキーを押下すると、文字列検索が行われます。

その状態で、nを入力すると次検索、Nは前検索を行います。

編集

コマンド動作
i文字挿入状態に遷移
o下に1行挿入
O (大文字)上に1行挿入
dカレント行から削除(カーソル移動と組合せて使用)
dd現在行を削除
cカレント行から編集(カーソル移動と組合せて使用)
u編集結果の復旧(WindowsのCtl+zと同じ)
.前回と同じ操作の再実行

赤文字としたコマンド(d、c)は、カーソル移動コマンドと組み合わせて使います。
例えば、”dG”であれば、カレント行から最終行まで削除します。

表の最後の.(ドット)キーはなかなか秀逸で、同じ操作を再実行します。
例えば、以下のようなことができます。

  1. "/"でキーワード検索して
  2. "cw"で単語置換を行い、
  3. "n"で次検索して
  4. "."で2と同じ単語変換

レジスタにコピー

コマンド動作
y汎用レジスタにコピー(カーソル移動と組合せて使用)
yy汎用レジスタにカレント行をコピー
"コピー用レジスタ指定
pレジスタの内容をカーソルより後にペースト
P (大文字)レジスタの内容をカーソルより前にペースト

viもエディタですので、行や文字列をコピーできます。

コピーの方法は、Windowsのクリップボードと似た仕組みです。
"yy"では、カレント行を1行レジスタ(クリップボードと同じと考えてください)にコピーし、”p”にてペーストします。

赤文字としたコマンド”y”は、カーソル移動コマンドと組み合わせて使います。
例えば、”y$”であれば、カーソル一から行末までをレジスタにコピーします。

青文字で示した”は、続いてアルファベット文字を入力することで、別のレジスターを指定できます。
例えば、"aを入力すると、aキーがレジスタとなります。その後にyyと入力すると、カレント行がaレジスターに記憶されます。これは、クリップボードが複数存在するのと同じ意味となります。(ちょっと難しいかも)

ペーストは、汎用レジスターであればpかPを、レジスタからペーストする場合はレジスタ指定後にpまたはPを入力します。

例えば、aレジスタからカーソルより後にペーストする場合は、"ap、bレジスタからカーソルより前にペーストする場合は"bPと入力します。

ファイル間移動

コマンド動作
:e ファイル名指定ファイルを同時に開いて移動
:e#ファイル表示の切り替え

こちらは少しだけ応用編です。

viもエディタですので、複数のファイルを同時に開くことができます。

”:e ファイル名”を入力すると、指定したファイルが追加で開かれ画面が入力したファイルに切り替わります。

その状態で、”e#”を入力するとファイルの表示が先ほどのものに切り替わります。

まとめ

ここまで、思いつくviのコマンドを書いてきました。

置換(:s)やカーソル移動(h、j、k、l)などは、説明の都合上書きませんでした。

viは、最初はとっつきにくいのですが、慣れてくるとコマンドの組み合わせによる操作性がとても合理的にできていることがわかると思います。

今回の記事は図がないので、理解してもらえるか、役に立つか微妙かなと思っていますが。。