2012/10/26

[vi]viの基礎的コマンドまとめ ~鋼の剣・鉄の鎧~

今更ですが、viコマンドについてよく使うものをまとめましたのでエントリーしておきます。
なんつってもLinux標準のテキストエディタですからね。サーバー管理者なら一生付き合う事になるんじゃないでしょうか。基本的なコマンドは手に馴染むほど打って、緊急時のために備えておきたいものです。



超基本。起動から。
vi [filename]

ここから行くのかって感じですかね。オプションで読み込み専用モードで開くときは以下のようにします。
vi -R [filename]

普段はあまり使いませんが、httpd.confやバッチファイルを確認したいだけの時は念の為付けておいたほうがいいオプションです。less使った方が読みやすいのは手に馴染んでいるからでしょうか。

viは開いてからが本番です(当たり前か)。
開いた瞬間はコマンドモードになっているので文字入力はできません。
viはざっくり言うとコマンドモードとファイルを編集する入力モードを行ったり来たりするソフトウェアなのですが(モードは他にもある)、入力モードに入る方法が幾つかあるので、それを押さえておきます。

「i」で入力モードに突入します。
入力モード中は打った文字はファイルに反映されます。
戻るときはESCキーでコマンドモードに戻ります。
ちなみに「o」や「s」「a」といったキーでも入力モードに切り替わりますが、素直にカーソル位置から入力モードが始まるのは「i」だけなので特に意識する必要はないと思います。
一つだけ例外というか、損がないのは「A」です。これは行末にカーソルを合わせて入力モードに切り替わるので、シェルスクリプトの場合は、プログラムの性質上1行が長くなる事が多いのでスムーズにコーディングができます。

先に終了する時の方法を。
終了はコマンドモードで行います。
これも色々終了の仕方がありますが、大きく分けて保存して終了するか、保存せずに終了するかの2種類があります。

保存せずに終了する場合は
#:を押した瞬間にカーソルが最下段に移動する
:q

で終了できます。
しかし、内容に変更があった場合はこれでは終了できないので、保存するかどうかを選ぶことになります。
保存しない場合は
:q!

保存する場合は
# どちらでも好きな方で
:wq
ZZ

関連付けて覚えたい場合は、:wqをバラしてみるといいです。
実は:wqは:wと:qを連続で入力したのと同じ事です。:wは上書き保存するだけのコマンドなので、直後に:qしても変更なしということで終了できるという訳です。
ZZは「:」から始まっていないコマンドですが、打鍵数も少ないし打鍵するキーも一文字だけなので重宝します。
:w          # 上書き保存

以上で最低限ファイルの編集はできるようになりました。

以降は、より便利に使うためのコマンドです。
最も使うのは「/」でしょうか。
「/」は検索を行うためのコマンドで、押した瞬間にカーソルが最下段に移動します。「/」の後ろに検索したい文字を入力すると、現在のカーソル位置から下へ検索を始め、最初にヒットしたところにカーソルが移動します。
再度同じ文字で検索したい場合は「n」で下方向に検索を行います。逆の上方向は「N」です。
また「/」だけを打ってエンターを押しても繰り返し検索します。
上方向に検索する場合は「/」を「?」にします。繰り返しも「?」で可能です。

また、コンフィグファイルなどの場合は編集する行が予め分かっている事が多いので、指定行へジャンプする機能を知っていれば便利です。
そういう時に役立つのは「:」です。
「:」だけを押すとカーソルは最下段へ移動しますが、引き続き数字を入力すると、その行へジャンプすることができます。
/[strings]  # [strings]を下方向に検索
?[strings]  # [strings]を上方向に検索
n [or /]    # 前回入力した[strings]を下方向に連続的に検索
N [or ?]    # 前回入力した[strings]を上方向に連続的に検索
:[numbers]  # [numbers]行へカーソルを移動

編集箇所を間違ってしまった場合、戻りたい時もありますが、CTRL+zは残念ながら使えません。viでは「u」で直前の変更をもとに戻す事ができます(ファイルを開いた時からの履歴は全部残っているようです)。直前の編集をもう一度行いたい場合は「.」です。
u           # 直前の編集を取り消す(CTRL+z相当)
.           # 直前の編集を繰り返す


ターミナルではマウスが使えないので、スクロールバーのようなものも存在しません。ですのでページめくりのような気の利いた機能がもちろん存在します。

PageUp、PageDownキーでも1画面分のスクロールは可能です。
CTRL + b    # 1画面分戻る
CTRL + u    # 画面半分だけ戻る
CTRL + d    # 画面半分だけ進む
CTRL + F    # 1画面分進む

# おまけ(横移動)
0           # 行頭へ移動
$           # 行末へ移動

back, forwardの頭文字なので簡単です。ちなみにこのキーはlessでも通用します。lessの場合はCTRLキーはいりません。行末へ移動する場合の「$」は正規表現などで行末を表すメタ文字として設定されています。


最後に編集が楽になるコマンドを。
ソースコードなんかを書いている場合は行ごと消したい時もありますよね。
そんな時は、コマンドモードで「dd」と入力するとカーソルがある行をパッと消してくれます。

シェルスクリプトで同じような処理をいくつか書きたい時はコピーした方がタイポも減りますので(元があってればね:-P)、そういう時は「yy」コマンドで行をコピーできます。
貼り付けは「p」と「P」の2つが割り当てられていますが、動作が違います。
「p」の場合はカーソル行の下に挿入するのに対し、「P」の場合はカーソル行の上に挿入します。私の場合は「P」の方が貼り付け(CTRL+v)の動作に近いと体感で思うので「p」に関してはほぼ利用していません。
dd          # 行を削除
yy          # 行をコピー
p           # カーソル行の下にコピーした行を挿入
P           # カーソル行の上にコピーした行を挿入

以上です。
これだけ覚えればドラクエなら鋼の剣と鉄の鎧を装備したくらいにはなるんじゃないですかね。



おまけ
がっつりソースコードを書きたい場合は、オートインデント機能もあるので、以下のリンク先で設定方法を見てみてください。
逆引きUNIXコマンド/viでオートインデントを設定する方法


0 件のコメント:

コメントを投稿