vi と腕試し

INPUT · スライド

消して、直す

01 / 08

直すとは、消して書くこと

前の回で狙った場所へ行けるようになったね。着いたら、次にやることは何かな。

50行目へ行ったそこを直したい

「直す」というのは、たいていこの2つの組み合わせなんだ。

1. 消す2. 書く

書くほうは前の回でやったでしょう(i a I A o O)。だから今回は消すをやるんだ。

消すものにも大きさがあるよ。

1文字      x1単語      dw行の途中から末尾まで  D1行        dd

移動と同じで、大きさで選ぶでしょう。

そして、消す量を数で指定できるんだ。

3x     3文字消す2dw    単語2つ消す2dd    2行消す

前の回の 4j と同じ形だね。「数 + 命令」はどこでも同じなんだ。

もう1つ、消して書くを一息でやるものもあるよ。

r    1文字だけ置き換えるcw   単語を置き換える

消してから打つ、を1手でやるんだ。これはとても便利だよ。

そして忘れてはいけないのが、これだね。

u    直前の変更を戻す

消しすぎても戻せるでしょう。だから思いきって消していいんだ。この回は消す練習だから、u をお守りにして進もうね。

02 / 08

x で1文字消す

いちばん小さい消し方だよ。カーソルが乗っている文字が消えるんだ。

aaa bbb ccc^ ここに居る  ↓ xaa bbb ccc

打ち間違いを直すのに、いちばんよく使うよ。

prot 80    → 打ち間違い

これを直すなら、こうだね。

2文字目へ動く(l)x で r を消す1文字目のうしろへ… 

少し面倒でしょう。だから単語ごと直す方法もあとで出てくるんだ。

x のいいところは、入力モードに入らないことだよ。

x を押す → 消える → まだ命令モード

Esc を押さなくていいでしょう。だから続けて x を押せば、続けて消えていくんだ。

x x x    3文字消える3x       同じ(2打)

数を付けたほうが速いね。

消す文字が足りないときの動きも知っておいてね。

ab^ ここで 5x を打つ(あるぶんだけ消える → 空行になる)

エラーにはならないんだ。あるものだけ消して終わりだよ。優しい作りでしょう。

Delete キーとの違いにも触れておくね。

Delete   カーソルの文字(キーが遠い)x        カーソルの文字(手を動かさない)

同じことを、手を置いたままできるんだ。これが vi の考え方だよ。前の回の h j k l と同じ理由だね。

03 / 08

dw で単語ごと消す

文字単位では遅いときがあるよ。

port 80     ^ 80 を消したい

x を2回でもいいけれど、値が 8080 なら4回、localhost なら9回だね。だから単語ごと消す命令があるんだ。

dw   カーソルから次の単語の頭まで消す
aaa bbb ccc^  ↓ dwbbb ccc

空白も一緒に消えることに気づいたかな。aaa だけでなく、そのうしろの空白まで消えているでしょう。

dw = delete word(単語を消す)

正しくは「次の単語が始まるところまで消す」なんだ。だから空白が付いてくるんだよ。

これは親切なんだ。

aaa bbb ccc  ↓ dw(空白も消える)bbb ccc          ← ちゃんとつながる

空白が残ると bbb ccc になって、先頭に余分な空白ができてしまうでしょう。

数を付けられるよ。

2dw   単語2つぶん消す3dw   単語3つぶん消す

dw の組み合わせ方にも意味があるんだ。

d     消す(動詞)w     次の単語まで(範囲)

動詞 + 範囲という形でしょう。だから w を他の移動に替えられるんだ。

dw    単語まで消すd$    行末まで消すd0    行頭まで消すdG    最後の行まで消す

移動を覚えたら、消す範囲も覚えたことになるんだよ。前の回でやった 0 $ G が、そのまま使えるでしょう。これが vi の作りのうまさなんだ。

04 / 08

dd で1行、D で行末まで

行まるごと消すのは dd だよ。前の回でも使ったね。

dd    いま居る行を、まるごと消す2dd   2行消す
ichini      ← ここに居るsan  ↓ ddichisan

下の行が繰り上がるでしょう。行が1つ減るということだね。

d を2回打つ形になっているのは、gg と同じ考え方だよ。

dw    範囲は「単語」dd    範囲は「行」

2つ目の d が「行」を表しているんだ。

もう1つ、D(大文字)があるよ。

D    カーソルから行末まで消す
aaa bbb ccc    ^ ここに居る  ↓ Daaa 

行は残って、うしろが消えるでしょう。dd は行が消えるけれど、D は行が空っぽになるだけなんだ。

dd   行が無くなる(行数が減る)D    行は残る(中身が減る)

この違いは大事だよ。設定ファイルで「行は残したいけれど値を書き直したい」ときは D だね。

Dd$ と同じ意味だよ。

d$   行末まで消すD    同じ(短い)

よく使うものは短い形があるという決まりだね。ZZ:wq の短い形だったのと同じでしょう。

注意が1つあるよ。D空白を残すんだ。

aaa bbb    ^ ここで Daaa      ← うしろに空白が1つ残っている

目には見えないでしょう。見えない空白は、wc -c で数えれば分かるよ。章3でやった数え方が、こういうときに効くんだ。

05 / 08

rcw — 消して書くを1手で

「消して、書く」を1手でやるものがあるよ。まずは1文字ぶんだね。

r    1文字だけ置き換える
port 80      ^ ここで r を押して 1 と打つport 81

x して i して打って Esc、の4手が2手になるでしょう。

r のいいところは、入力モードに入らないことだよ。

r → 1文字打つ → そのまま命令モード

Esc が要らないんだ。1文字だけ直すときは、これがいちばん速いよ。

r = replace(置き換える)

単語ごと置き換えるものもあるよ。

cw   単語を消して、入力モードに入る
port 80     ^ ここで cw を押す  ↓ 80 が消えて入力モードにport   ↓ 8080 と打って Escport 8080

消すのと打つのが続けてできるでしょう。dw して i して打つ、をまとめたものだね。

c = change(変える)

d との違いを押さえておいてね。

dw   消すだけ(命令モードのまま)cw   消して打つ(入力モードに入る)

c は入力モードに入るんだ。だから Esc を忘れないでね。前の回の事故がここでも起きるからね。

c も範囲を選べるよ。

cw   単語を変えるc$   行末までを変えるcc   行まるごとを変える

d と同じ形でしょう。動詞が違うだけなんだ。

d + 範囲   消すc + 範囲   変える

1つ覚えると2つ使えるんだよ。だから vi は覚えることが少ないと言われるんだ。

06 / 08

u で戻す、. で繰り返す

消す練習をするなら、これを先に持っておこうね。

u    直前の変更を戻す
dd で消してしまった  ↓ u戻ってきた

1手で戻せるでしょう。u は undo(取り消す)だよ。

ただし、この環境の u には限りがあるんだ。

dd dd u    → 1行だけ戻る

直前の1手だけなんだ。2手前には戻れないよ。

間違いに気づいたら、すぐ u何手も進んでしまったら :q!

使い分けがあるということだね。何をしたか分からなくなったら、保存せずに抜けてやり直すほうが速いよ。

そして、繰り返しの命令もあるよ。

.    直前の変更をもう一度やる
dd を打った  ↓ .もう1行消える  ↓ .さらに1行消える

同じことを繰り返すでしょう。押すのは .(ピリオド)1つだけだよ。

u. は、ちょうど反対の働きだね。

u    1つ戻す.    もう1回やる

行ったり来たりできるんだ。試しながら直すのに向いているよ。

dw を打つ消しすぎた → u で戻すよさそう → . で次にも同じことを

「1か所やってみて、よければ繰り返す」という進め方ができるでしょう。これは章5の sed とは違うやり方だね。

sed    まとめて全部やる(速い)vi     1か所ずつ見ながらやる(確かめられる)

取り返しがつくかどうかで選ぶんだ。大事なファイルなら、見ながらやるほうが安全でしょう。

07 / 08

消す前に控えを取る

消す命令を覚えたので、大事な作法を1つ渡しておくね。

> 触る前に控えを取る

cp settei.conf settei.conf.bakvi settei.conf

章2の cp を先に打つんだ。1手増えるだけで、事故が事故にならなくなるでしょう。

vi の中でもできるよ。

vi settei.conf:w settei.conf.bak    別名で控えを取る(ここから直す):wq

前の回でやった :w 別名 だね。開いてすぐ控えを取るという手もあるよ。

なぜここまで言うかというと、消す命令は気づきにくい失敗をするからなんだ。

2dd   2行消したつもりが、20dd と打っていたdG    最後の行まで全部消えた

打ち間違いが大きく効くでしょう。u は1手しか戻せないから、気づくのが遅いと戻せないんだ。

気づく方法も持っておいてね。

- settei.conf [Modified] 3/3 100%

画面のいちばん下の行数を見るんだ。

消す前   3/10消した後 3/3     ← 7行も減っている

思っていたより減っていたら、何かが違うでしょう。ここで気づけば :q! で助かるよ。

まとめると、消すときの手順はこうだね。

1. 控えを取る2. 消す3. 画面の下で行数を見る4. よければ :wq、変なら :q!

保存する前に確かめるんだ。:wq を打つまでは、ファイルは無事なんだからね。この「確かめてから保存」という順番が、あなたを守ってくれるよ。

08 / 08

この回で持って帰るもの

まとめだよ。消す命令が大きさで選べるようになったね。

x     1文字dw    1単語D     行末までdd    1行

置き換えは2つだね。

r     1文字だけ(入力モードに入らない)cw    単語を(入力モードに入る)

そして数と繰り返しだよ。

3x 2dw 2dd    数を付ける.             もう1回u             1つ戻す

「動詞 + 範囲」という形を覚えたのが、この回のいちばんの収穫だよ。

d + w    単語を消すd + $    行末まで消すc + w    単語を変える

移動で覚えたものが、そのまま範囲になるでしょう。だから前の回をやっておいた意味があるんだ。

ここまでで、vi でできることをまとめておくね。

開く      vi ファイル動く      h j k l 0 $ w b gg G 3G書く      i a I A o O消す      x dw D dd r cw戻す      u保存      :w :wq ZZ抜ける    :q :q!

もう実務で使えるんだ。設定ファイルの手直しなら、これで全部できるでしょう。

次の回は「写して貼る」だよ。

yy    いまの行を写すp     貼る(下に)P     貼る(上に)

似た行を作るのが速くなるんだ。設定ファイルには似た行が並ぶことが多いでしょう。1行書いて写して直す、というやり方ができるようになるからね。