vi と腕試し

INPUT · スライド

写して、貼る

01 / 08

似た行を、もう一度打たない

設定ファイルを見ると、よく似た行が並んでいることに気づくよ。

host web1host web2host web3

3行とも、違うのは最後の1文字だけでしょう。これを3回打つのは、もったいないよね。

1行書く写す貼る1文字だけ直す

打ち直さずに増やすんだ。これがこの回でやることだよ。

使う命令は2つだけだね。

yy   いまの行を控えに取る(写す)p    控えを貼る

yy は yank(引き抜く)、p は put(置く)だよ。

そして、もう1つ大事な使い方があるんだ。

dd   行を消す(このとき控えにも入る)p    別の場所に貼る

消して貼ると、行が動いたことになるでしょう。

dd → 動く → p    行を移動する

切り取って貼り付けだね。よく知っている操作でしょう。vi にもちゃんとあるんだ。

この回で持って帰るものを並べておくね。

yy p     行を増やすdd p     行を動かすx p      文字を入れ替えるP        上に貼る3yy      3行まとめて写す

打つ量が減るというのが、この回の値打ちだよ。同じことを2回打っているなと思ったら、写せないか考えてみてね。

02 / 08

yy で写す — ファイルは変わらない

まず yy だよ。いまカーソルが乗っている行を控えに取るんだ。

ichi     ← ここに居るnisan  ↓ yy(ichi を控えに取った)

大事なのは、ファイルは何も変わらないということだよ。

yy を押した画面は同じ[Modified] も出ない

写すだけだから何も起きないでしょう。だから安心して押していいんだ。

控えはどこに行ったのか、と思うかもしれないね。

vi の中の「控え置き場」に入っている

目には見えないんだ。貼るまで分からないということだね。

数を付けると、複数行を写せるよ。

yy    1行3yy   3行(いまの行から下へ3行)

dd と同じ形でしょう。

dd    1行消す2dd   2行消すyy    1行写す3yy   3行写す

数 + 命令という形は、どこでも同じだね。

y は範囲も選べるよ。d と同じ形なんだ。

yw    単語を写すy$    行末までを写すyy    行を写す
d + 範囲   消すc + 範囲   変えるy + 範囲   写す

動詞が3つ、範囲は共通でしょう。前の回で言ったとおりだね。だから yy を覚えるのは簡単なんだ。dd の消すところを写すに替えただけだからね。

03 / 08

p で貼る — 下に貼るか上に貼るか

控えを取ったら、貼るんだ。

p    カーソルの行の下に貼るP    カーソルの行の上に貼る(大文字)
ichini      ← ここに居るsan

この状態で ichi を貼ると、こうなるよ。

押す結果
pichi ni ichi san
Pichi ichi ni san

下か上かだけの違いでしょう。oO の関係と同じだね。

o p    小文字は下O P    大文字は上

大文字は上という決まりが、ここでも通っているよ。

貼ったあとのカーソルの位置も覚えておいてね。

p で貼ったカーソルは貼った行に移る

これが便利なんだ。

yy      写すp       貼る(貼った行に居る)$ r 2   その行をすぐ直せる

貼ってすぐ直せるでしょう。host web1 を写して貼って、末尾を 2 に直す — この流れが一息でできるんだ。

続けて押すと増えていくよ。

yy p p p

同じ行が3つ増えるんだ。10台ぶんの設定を作るときは、これでいいでしょう。

1つ注意しておくね。控えは上書きされるんだ。

yy      ichi を控えにdd      別の行を消した(控えが入れ替わる)p       消した行が貼られる(ichi ではない)

控え置き場は1つなんだよ。だから「写す → 貼る」はできるだけ続けてやるのが安全だね。あいだに消す操作を挟むと、控えが入れ替わってしまうからね。

04 / 08

ddp で行を動かす

ここが面白いところだよ。dd で消した行も、同じ控えに入るんだ。

dd    消す(控えにも入る)p     貼る

つまり、こうなるでしょう。

dd → 別の場所へ動く → p

行が動いたことになるね。切り取って貼り付け、だよ。

実際にやってみるとこうだよ。

ichi     ← ここに居るnisan  ↓ dd(ichi が消える)ni       ← カーソルはここsan  ↓ j(san へ)  ↓ p(下に貼る)nisanichi     ← 動いた

順番を入れ替えられるでしょう。設定ファイルの行の順番を直すときに使うよ。

よく使う組み合わせを挙げておくね。

dd G p     その行を最後に移すdd gg P    その行を先頭に移すdd j p     1つ下に移す

移動を挟むだけだね。前の回で覚えた G gg が、そのまま効いてくるでしょう。

文字でも同じことができるよ。

ab^ ここに居る  ↓ x(a が消えて控えに入る)b  ↓ p(カーソルの後ろに貼る)ba

2文字が入れ替わったね。xp は「打ち間違いで前後が逆になった」ときに使う定番だよ。

porrt → 直すteh → the に直す

2打で直るでしょう。

ここで、行と文字の貼り方の違いに気をつけてね。

行を写した控え     p は行の下に貼る文字を写した控え   p はカーソルの後ろに貼る

控えの中身に合わせて、貼り方が変わるんだ。vi が覚えていてくれるので、あなたは気にしなくていいよ。押してみれば分かるでしょう。

05 / 08

10台ぶんの設定を作る

この回の技が、いちばん効く場面を見せておくね。

host web1

これを10台ぶんにしたいとするよ。打つならこうだね。

host web1host web2host web10

同じことを10回打つでしょう。打ち間違いも増えるね。

vi ならこうだよ。

yy         1行写すp p p …    貼る(必要なぶん)

同じ行が並ぶね。あとは番号だけ直すんだ。

2G $ r2    2行目の末尾を 2 に3G $ r3    3行目の末尾を 3 に

1文字ずつ直していくでしょう。r は前の回でやったね。

もっと言うと、こういう手もあるよ。

yy p $ r2      写して貼って直すyy p $ r3      それを写して貼って直す

直した行を写すんだ。こうすると、貼ったあとカーソルがその行に居るので、続けて作業できるでしょう。

ここで章5を思い出してほしいな。同じことをシェルでもできるんだ。

for i in 1 2 3; do  echo "host web$i" >> settei.confdone

繰り返しで作るやり方だね(章11)。

どちらを使うかというと、こうだよ。

規則的で数が多い     for で作る少しずつ違う・数が少ない   vi で写す

規則があるなら機械に任せるでしょう。10台なら for、3台なら vi のほうが速いかもしれないね。

大事なのは、どちらもできるということだよ。あなたはもう両方持っているんだ。場面で選べるでしょう。それが道具を増やすということなんだよ。

06 / 08

控えは1つしかない

気をつけてほしいことを1つ、しっかり書いておくね。

> 控え置き場は1つだけ

yy     A行を控えに取ったdd     B行を消した(控えが B行に入れ替わった)p      B行が貼られる

A行はもう無いんだ。上書きされてしまったでしょう。

だから作法はこうだよ。

写したら、すぐ貼る

あいだに消す操作を挟まないんだ。挟むなら、先に貼っておくんだよ。

控えに入る命令を並べておくね。

yy yw y$    写す(ファイルは変わらない)dd dw D x   消す(控えにも入る)cw cc       変える(消したぶんが控えに入る)

消す命令も控えを書き換えるというのが、うっかりの元なんだ。

見分ける目印は無いので、覚えるしかないよ。でも大丈夫、続けて貼るという癖にしておけば困らないからね。

もう1つ知っておくと安心なことがあるよ。

控えは vi を抜けると消える
vi a.txt → yy → :wqvi b.txt → p        貼れない

別のファイルへは持っていけないんだ(この環境ではね)。ファイルをまたいで写したいときは、こうするよ。

sed -n '3p' a.txt >> b.txt

シェルの道具を使うでしょう。章5の sed だね。

vi の中で写す      同じファイルの中シェルで写す        ファイルをまたぐ

使い分けがあるんだ。vi で全部やろうとしなくていいんだよ。端末に戻れば、もっと得意な道具があるでしょう。適材適所が、この course で何度も出てきた考え方だからね。

07 / 08

貼る前に、行数を見る

貼る操作は、増えすぎる失敗が起きやすいんだ。

p を押したつもりが、指が滑って p p p3行増えている

消す失敗と違って、増える失敗は気づきにくいでしょう。画面がぱっと見て同じように見えるからね。

だから、いつもの場所を見てね。

- settei.conf [Modified] 2/5 40%

/5 の部分が行数だよ。

貼る前   2/2貼った後 3/3     ← 1行増えた(正しい)貼った後 5/5     ← 3行増えた(多すぎる)

保存する前に気づけるでしょう。

増えすぎたときの直し方は、前の回のものでいいよ。

dd     余分な行を消すu      直前の貼り付けを戻す:q!    ぜんぶ捨ててやり直す

どれでも助かるね。

抜けたあとの確かめ方も覚えておいてね。

wc -l < settei.conf     行数を数えるgrep -c 'host' settei.conf   何台ぶんあるかsort settei.conf | uniq -d   同じ行が無いか

最後のものは章5でやったね。同じ行が2つあると出てくるんだ。

host web2host web2      ← 番号を直し忘れた

写して貼るときのいちばん多い失敗がこれだよ。番号を直し忘れて、同じ行が2つできてしまうんだ。

uniq -d で見つかる

機械に探させるでしょう。目で10行見比べるより確かだね。

写して貼るのは速いけれど、速いぶん確かめが要るんだ。打ち直したほうが確実な場面もあるよ。3行なら写す、100行なら for で作る、2行なら打つ — 量で選ぶといいからね。

08 / 08

この回で持って帰るもの

まとめだよ。写して貼るがそろったね。

yy    1行写す3yy   3行写すyw    単語を写すp     下に貼るP     上に貼る

消すと組み合わせると、動かせるようになったよ。

dd p      行を動かすdd G p    行を最後へx p       文字を入れ替える

「消す」と「貼る」が同じ控えを使っていることが、この回でいちばん覚えてほしいところだよ。

dd で消したものは、控えに入っている

だから消しても、貼れば戻せるでしょう。u とは別の戻し方だね。

ここまでの5回で、vi の技はほぼそろったよ。

出入り    :wq :q! Esc書く      i a I A o O動く      h j k l 0 $ w b gg G 3G消す      x dw D dd r cw写す      yy yw p P戻す      u繰り返す  .

これで設定ファイルの仕事は全部できるんだ。

足りないものが1つだけあるよ。

300行のファイルの中から"port" と書いてある行を見つけたい

探すということができないでしょう。行番号が分かっていれば 300G で行けるけれど、分からないときは困るんだ。

次の回はそれをやるよ。

/port → ⏎    port を探して飛ぶn            次の port へ:%s/80/8080/g   まとめて置き換える

探して、置き換えるんだ。章5の grepsedvi の中でやるようなものだね。ここまで来れば、vi はもうあなたの道具だよ。