サーバー上で作業をするときに避けて通れないのが、あのviエディタです。
viって非常にとっつきにくいですよね。まるで嫌がらせかと思いたくなるほどです。
viはそれだけで本が一冊できてしまうくらいなので、かなり奥が深いのでしょう。
僕の友人は vi(vim)を文字通り使い倒していて、まるで魔法使いのようにファイルが加工されて行きます。彼いわく「もうvimなしでは生きていけない」そうです。
僕は必要最低限の操作しかできませんし、それ以上覚えようともしていません。それでも彼も僕もこの仕事をやれているので問題ないのでしょう。
そうはいっても最低限の操作ができないと困ることがあるのも事実です。
なので今回は、僕が考える「必要最低限の操作」を紹介しようと思います。
僕が知っているviのほぼすべてと言ってもいいかもしれません。
初めての方でも30分か1時間くらいゆっくりと練習すればすぐに覚えられる内容です。一度で覚えきれなくても何度か実際に作業すれば覚えられると思います。
そしてなによりもvi恐怖症みたいなものから解放されますので、この機会にトライしてみましょう!
viを起動
vi を起動するには
vi /etc/hosts
という感じでファイルパスを指定します。
ファイルが存在しない場合、その名前で新しいファイルを作成できます。
終了のしかた
viを終了させるにはまずEsc ボタンを押してから、
: q !
と入力します。
こうすれば編集していたファイルを保存せずに終了します。
初めてviを使ったときは「viを終了させる方法が分からない!」とパニックになり、ssh接続ごと切断していました。
入力モードとコマンドモードの切り替え
viには2つのモードがあります。
一つはコマンドモードといわれるもので、起動後はコマンドモードの状態です。
もう一つは入力モードといわれるもので、この状態だと普通のエディタのように文字を入力できます。
このモードという考え方が普通のエディタと違うので、とっつくにくいのだと思います。
ここではモードの切り替え方を覚えましょう。
入力モードへの切り替え
コマンドモードから入力モードへ切り替えるには、i (insert)と押します。すると、入力モードに切り替わり、そのまま文字を入力できます。
入力モード中は、コピーしたテキストをクリップボードからペーストして貼り付けることもできます。
とりあえずi だけ覚えておけば大丈夫ですが、僕がたまに使う他のコマンドを2つ紹介します。
a (append):いまカーソルがある文字の次の文字へ移動して入力モードに切り替えます。
A (Shift + a):行末まで移動してから入力モードに切り替わります。
他にもいろいろあるのでしょうが、僕は本当にこれしか知らずに生きています。
コマンドモードへの切り替え
入力モードに切り替えればいつものエディタ風に文字が入力できます。
しかしこのモード、文字の入力しかできません。
ファイル内の検索したり、ファイルを保存したり、viを終了するには一度コマンドモードへ戻らないといけないのです。
そんな時はどうするかというと、Esc を押します。
Esc キーを押すと、コマンドモードに切り替わります。
Esc キーのいいところは、いつ、何度押しても何も問題が起きないことです。
どのモードにいるかわからない時や、意図しない動作をした時はとりあえずEsc キーを連打しましょう。
viのジョーク
2016年のMacBook Proは、Touch Barというタッチパネル式のキーボードを採用しました。普段はあまり使わないファンクションキーの部分をタッチパネル化することで、アプリな状況に応じてキーが切り替わるというものだったのですが、プログラマーには不評でした。
なぜかというと、タッチパネルになってしまうキーの中に Esc キーが含まれていたからです。プログラマたちは「これじゃviが使えない!」と嘆いたわけです。そんな話題に乗じて vi使いのためにこんなジョークのアクセサリが発表されたのです。
カーソルの移動
コマンドモードと入力モードの切り替えができるようになったら、次はカーソルを移動させましょう。
普通ならば
↑ → ↓ ←のキーを使ってカーソルを移動させたいところですが、viは違います。
viの場合
h j k lのキーを使ってカーソルを移動させます。
h = 左
j = 上
k = 下
l = 右
となっています。こうやってみるとわかりにくいですが、実際にやってみるとそこまでひどくありません。
一度試してみて下さい。
YouTubeもvi推奨?
ちなみに、YouTubeにもviライクなショートカットがあるのをご存知ですか?
YouTubeの動画は、
j = 10秒戻る
k = 停止・再生
l = 10秒進む
という感じで操作ができます。微妙にviチックじゃないですか?
僕はこれらのコマンドを誰に聞くでもなく気がついたら使っていました。「Googleならこういうショートカットあるだろう」的に試してみたら本当にあったのです。リファレンスもありますのでいろいろ試してみてください:
文字の削除
コマンドモードで x と押すと一文字削除されます。
dd と押すと現在の行が削除されます。後述しますが、これは実際にはカット的な感じであとでペーストできます。
10dd という具合に数字を付け加えると、現在の行から10行が削除されます。
文字の入力
ページ上部の「入力モードへの切り替え」を参照してください。
ファイルの保存
ファイルの編集が終わったら、
:w
と押すと変更が保存されます。
:wq
なら変更が保存され、viも終了します。
変更を破棄して終了したい場合は
:q!
です。とりあえずわけが分からなくなったらこれで仕切り直しましょう。
コピー・切り取り・貼り付け
viにもコピー&ペースト、カット&ペーストはあります。
これに関しては正直そこまで必要ではないと思いますが、一応最低限のコマンドだけ紹介しましょう。
yy = 現在の行をコピー
p = 貼り付け
先ほどの項でdd で削除したデータもp コマンドで貼り付けができます。
コピーペーストもコマンドを駆使すれば変幻自在だそうですが、僕はあまり重視していません。どうしても困ったらターミナルのアプリそのものでコピーペーストをすればいいと思っています(もちろん入力モードに切り替えるのを忘れずに!)。
しかし、コンソールで直接作業している時でマウスも使えない場合はコマンドに頼るしかありません。とはいえそういう状況は、インフラエンジニアとかでなければあまりないかなと思います。
やり直し( アンドゥ)
一つ前の変更を取り消したいときは、コマンドモードでu を使います。
行番号の表示
これは、たまに人と作業しているときとかに重宝します。
リモートの同僚と画面共有してトラブルシューティングしているとかに、行番号を表示して、「何行目をそこを直して」とかそういう風に話したい時があります。
でもこれ、行番号が分からないと面倒なんですよね。
「ほら、そのifの下のところ」
とかいってもなかなか通じないんです。
行番号を表示するにはコマンドモードで :set number と入力します。
特定行への移動
行番号を表示した状態で、例えば行番号10へ移動したいとしましょう。その場合
:10 と打てば、10行目へジャンプできます。
検索
コマンドモードで
/word と打つと、wordという単語へ移動します。その状態で n と押せば次のwordへ移動(前方検索)します。逆に N とすれば、前のwordへ移動(後方検索)します。
置換
コマンドモードで
:%s/before/after/
でbeforeをafterに置換します。
ファイル全体で置換したい場合は
:%s/before/after/g
という具合に g (global)を最後につけます。
僕は、置換のコマンドだけなかなか頭に残らず、何度もググりながらやっていました。
この仕事は頭の中で暗記をするよりも、ググって目的を達することができれば十分だと思っています。
最後に
以上、このくらいあればとりあえず困らないくらいの viの使い方を紹介しました。
いきなり全部覚えなくても、何度か遊んでいるうちに身につくと思いますよ。
僕はviに関してはこのくらいで十分と思ってあれこれ調べることをやめてしまいましたが、他にいくらでも便利な使い方があるので、これでは物足りないという方はネットや書籍でどんどん技を増やしていただければと思います。
これは僕の考えなのですが、複雑な編集をするならば、一度自分のコンピュータにダウンロードしてそこでゆっくり編集して、そのあとアップロードした方が確実じゃないかなと思っています。
vi でやるのはちょっとした変更(設定値の変更とか)くらい。ソースコードの編集とかの複雑な作業ならローカルのIDEで。そう使い分けるならば、そこまで高度な viのテクニックは必要ないかなと思います。