vi と腕試し

INPUT · スライド

モードと、抜け方

01 / 08

どのサーバーにも必ずある

いよいよ最後の章だよ。まず vi をやるんだ。

ここまでファイルを作るとき、あなたはこう書いてきたね。

echo '#!/bin/sh' > shirabe.shecho 'ip link …' >> shirabe.sh

1行ずつ足していくやり方でしょう。書き間違えたら作り直しだったね。

3行目を直したい → もう1回全部打つ

これはつらいよね。だから編集ソフトが要るんだ。

そこで vi だよ。

> vi は、どのサーバーにも必ず入っている

これが vi を覚える一番の理由なんだ。

新しく借りたサーバー       vi はある最小構成の Linux           vi はある壊れかけて復旧中の機械     vi はある

他の便利な編集ソフトは、入れないと使えないでしょう。でもネットワークが繋がらない機械には、入れることすらできないんだ。そういう場面で最後に頼れるのが vi なんだよ。

もう1つ理由があるよ。

設定ファイルを1行だけ直したい

こういう仕事が、実務ではとても多いんだ。開いて、1行直して、保存して抜ける。これができれば9割の場面は足りるでしょう。

この回で覚えるのは、その中でもいちばん大事なところ — 確実に抜ける方法だよ。技より先に、逃げ道を持つんだ。

02 / 08

「打っても入らない」の正体

vi を初めて開いた人が必ず言うことがあるよ。

文字を打っても入力されない!Ctrl-C を押しても終わらない!

壊れていないよ。 viモードという考え方で動いているんだ。

モードは2つだけだよ。

モード打った文字が入る方法
命令モード命令になるEsc
入力モード文字になるi など

開いた直後は命令モードなんだ。だから hello と打つと、こう解釈されるよ。

h  左へ動くe  単語の終わりへl  右へ動くl  右へ動くo  下に行を作って入力モードへ

5つの命令として実行されるでしょう。文字が入らないのではなく、別のことをしているんだ。

なぜこんな作りなのかというと、vi が生まれたころの事情があるよ。

1976年ごろマウスは無い矢印キーも無い機械があった画面の書き換えも遅い

キーボードだけで全部やるしかなかったんだ。それで「文字を打つとき」と「操作するとき」を分けたんだよ。

いまでも意味があるよ。

x      1文字消すdd     1行消す3G     3行目へ飛ぶ

指をホームポジションから動かさずに操作できるでしょう。慣れた人が速いのはこれが理由なんだ。

でも最初は混乱するよね。だから覚え方はこれ1つでいいよ。

> 迷ったら Esc

何度押しても害は無いんだ。押せば必ず命令モードに戻れるからね。

03 / 08

抜け方を先に覚える

技より先に、逃げ道だよ。抜ける命令は3つだけ覚えてね。

:q    抜ける(変えていないとき):wq   保存して抜ける:q!   保存せずに抜ける(捨てる)

打ち方はこうだよ。

1. Esc を押す(命令モードに戻る)2. : を打つ(画面のいちばん下に : が出る)3. q! と打つ4. Enter

必ず Esc から始めるのが作法だよ。いまどちらのモードかを気にしなくて済むでしょう。

3つの使い分けを覚えておいてね。

打つものどんなとき
:q見ただけで、何も変えていない
:wq直したので、保存したい
:q!ぐちゃぐちゃにしたので、捨てたい

変えたのに :q を打つと、こう断られるよ。

No write since last change (:q! overrides)[Hit return to continue]

保存していないよ。捨てるなら :q! だよ」という意味だね。うっかり消させないための親切なんだ。

下に [Hit return to continue] と出ているときは、まず を1回押してメッセージを閉じるんだよ。閉じるまでは次の命令を受け取ってくれないからね。

この :q! が、あなたのお守りになるよ。

> 何をしてしまっても、:q! なら元のまま抜けられる

知らない命令を打ってしまった画面がぐちゃぐちゃになったどこを触ったか分からない

どれも Esc:q! で元通りだよ。ファイルには何も起きていないからね。

この2つを知っていれば、もう vi は怖くないでしょう。安心して触ってみてね。

04 / 08

開き方と、画面の見方

開き方は簡単だよ。

~ $ vi memo.txt

ファイルが無くても大丈夫だよ。

ある    その中身が出る無い    空っぽで始まる(保存したときに作られる)

開いただけでは作られないことに注意してね。:q で抜ければ、ファイルは1つも増えないんだ。

画面はこうなっているよ。

aaabbbccc~~~- moto.txt [Modified] 1/3 33%

~ の意味を知っておこうね。

~ = ここには行が無い

空行ではないよ。 ファイルの終わりより下、という印なんだ。だから ~ がたくさん並んでいるのは、ファイルが短いだけだよ。

いちばん下の行が、いまの状態を教えてくれるよ。

出るもの意味
moto.txt開いているファイル
[Modified]変えたのに保存していない
1/33行のうち1行目に居る
33%だいたいの位置

[Modified] が出ていたら、保存していないということだよ。ここを見る癖をつけると、:q で断られる理由が先に分かるでしょう。

入力モードのときは、下の行にこう出ることもあるよ。

-- Insert --

いまどちらのモードかを画面が教えてくれるんだ。困ったときは下を見てね。

05 / 08

保存だけする、保存して抜ける

:w:wq の違いも押さえておこうね。

:w    保存する(vi の中に留まる):wq   保存して抜ける

:w の使いどころはこうだよ。

長く編集する  ↓ 途中で :w(ここまでを保存)  ↓ 続けて編集  ↓ また :w最後に :wq

こまめに保存するでしょう。書きかけを失わないための作法だね。

別の名前で保存することもできるよ。

:w hikae.txt

元のファイルは変えずに、別の名前で残すんだ。章2で覚えた cp を、vi の中でやったようなものだね。

設定を直す前に :w moto-no-mama.txt で控えを取る

触る前に控えを取るのは、章12でも言った作法だよ。

もう1つ、短い書き方があるんだ。

ZZ

大文字の Z を2回で、:wq と同じ意味だよ。:Enter も要らないでしょう。

:wq + Enter   4打ZZ            2打

よく使うものほど短く打てるようになっているんだ。これは章10でやった alias と同じ考え方だね。

まとめておくよ。

:w      保存だけ:wq     保存して抜けるZZ      同じ(短い):q      抜ける(変えていないとき):q!     捨てて抜ける

この5つで足りるよ。他は知らなくても仕事になるからね。

06 / 08

命令モードで打つと何が起きるか

「打っても入らない」の中身を、もう少し見ておこうね。命令モードで打つと、文字が命令として働くんだ。

よく事故になるものを並べておくよ。

打った文字起きること
xカーソルの1文字が消える
dd1行まるごと消える
o下に行が増えて入力モードへ
J次の行がつながる
u直前の変更が戻る

知らずに打つと、勝手に消えたように見えるでしょう。「vi は勝手にファイルを壊す」と言われる原因がこれなんだ。

でも安心してね。逃げ道が2つあるよ。

u      直前の変更を戻す:q!    ぜんぶ捨てて抜ける

どちらも1手で戻れるんだ。だから怖がって触らないより、:q! を握って触ったほうが上手くなるよ。

いまどちらのモードかを確かめる方法も覚えておいてね。

1. Esc を押す(必ず命令モードになる)2. 画面のいちばん下を見る

-- Insert -- が消えていれば命令モードだよ。

Ctrl-C が効かないことにも触れておくね。章8でやったとおり、Ctrl-C は INT という合図を送るものだったでしょう。

vi は INT を受け止めて、無視する

わざと無視しているんだ。編集中に誤って消えたら困るからね。だから vi から出るには :q の系統を使うんだよ。

vi の中では Ctrl-C は効かない → :q! を使う

これを知っているだけで、「戻れなくなった」が消えるでしょう。

07 / 08

なぜ今も vi なのか

50年前の道具がいまも現役なのは、理由があるよ。

1. どこにでもある2. 遠くから使っても軽い3. キーボードだけで完結する

2つめが意外と大事なんだ。

遠くのサーバーに入って編集する  → 画面を大きく描き換えると遅い  → vi は必要な行だけ描き換える

細い回線でも使えるでしょう。生まれた時代が厳しかったからこそ、いまも軽いんだ。

もう1つ、うれしい話をしておくね。vi の指の動きは、他の道具にも移っているんだ。

less の G / q / /探す    vi と同じ(章2でやったね!)man の中の操作           同じtop の q                 同じ多くの編集ソフトの vi モード

章2で less を覚えたとき、あなたはもう vi の一部を覚えていたんだよ。

G    最後へgg   先頭へ/    探すn    次へq    抜ける(less)

道具をまたいで同じ手が効くのは、Unix の世界の良いところだね。1つ覚えると次が楽になるでしょう。

正直な話も1つしておくよ。

> vi が最高の編集ソフトだ、とは言わないよ

ふだんの開発では、もっと便利なものを使えばいいんだ。でも逃げ場が無いときに使えるものを1つ持っておくのは、職人の道具箱として大事でしょう。

この章では「1行直して保存する」ができるところまでいくよ。それで十分に実用なんだ。

08 / 08

さあ、打ってみよう

この回で使うものをまとめておくね。

vi ファイル      開くi                入力モードに入るEsc              命令モードに戻る:w               保存する:wq              保存して抜けるZZ               同じ(短い):q               抜ける(変えていないとき):q!              捨てて抜ける

打つときの型はこれだよ。

Esc → : → 命令 → Enter

必ず Esc からだね。

画面の下も見てね。

[Modified]      保存していない-- Insert --    入力モードに居る~               ここには行が無い

今日いちばん覚えてほしいことは3つだよ。

1. 開いた直後は命令モード(打った文字は命令になる)2. 迷ったら Esc3. 何をしても :q! なら元のまま抜けられる

そして今日の結論。

> 抜け方を知っていれば、怖くない

これは vi に限った話ではないよ。新しい道具を触るときは、やめ方を先に確かめるでしょう。lessqtopqCtrl-C、そして :q!戻る道があると、思いきって試せるんだ。

この回では、まだ本格的な編集はしないよ。開いて、1文字か2文字打って、保存する、捨てる、を何度も繰り返してもらうんだ。

指が覚えるまで繰り返すのが、この回の目的だからね。次の回で入力の始め方を、その次で移動と編集をやるよ。では打ってみよう。