Vim講座3

#絵をちょっと見やすくした。(2009.02.13)


前回からだいぶ日にちが空いてしまった。
Vim講座2は都合により作者がお休みするので、今回は3です。まあ日にち的に。

さて教育とは小さい子供にとってはある種洗脳とも言えるほど大きな影響をもつものです。その教育の目的とは一体なんでしょう。それは一言で表すなら自立を促すことです。自立とは、自己判断が出来、親の元から離れること。つまり自立とは親の立場から見れば自律(automation)ともいえます。自律主張ジェネレータ作成が教育の目標であります。

Vimを勉強する人は大抵自律しているので教育はすでに終わっていると思いますが、私はこのような入門講座の目的にも、同様のことが成り立つと考えます。
つまりこの講座は、Vimを一人前に使う人が増え、その人たちにがんがんpluginを作ってもらい、俺のVimライフを豊かなものにするという目標があるのです。Vim Plugin AutoGenerator Generatorがこの講座の最大の目標なわけです。
それゆえ、この講座を見た人はVim pluginを書けるまでに成長できる必要があるわけです頑張れ特に俺。


さて自分への言い訳も作ったところで、そろそろ始めようと思う。
理由を作らなければ動けない人間を真の意味で馬鹿と呼ぶのだ、とのたまう爺さんがそこにいると思いますが、それは私の祖父です。安心してください危害は加えないはずです。
その言葉を受けて俺は「気まぐれ」というポリシーを導入することにしました。
理由は単純で、「気まぐれ」はとても良い動機になってくれるからです。
その導入の結果、私は普段は入らないような店にも、「気まぐれ」という理由で突入することが可能になりました。今の私は全能感であふれています。嘘ですが。

コンテンツ

  • モード概念拡張
  • カーソル移動拡張
  • インサートモード拡張
  • 保存周り拡張
  • ビジュアルモード拡張
  • コピー、ペースト、切り取り
  • 検索、置換拡張
  • スペシャ

Vim講座1で出たコマンドも全て網羅したので、この講座だけ見れば大体わかる。

モード概念拡張

モードには4つあると2回前の抗議で説明しているのだけど、その時は最低限のことしか書かなかったので、今回はそれを拡張しようと思う。

ノーマルモード 普通のモード。移動、文章の切り貼り、修正は大抵ここ。Vimにいる大部分はこのモード。
インサートモード 文章を書く普通のモード。文章を書くよりも実は修正の方が多かったり。コマンドは少なめ。重要なのは単語補完。
ビジュアルモード 選択モード。Vimでは単語選択に名前が付いているだけです。メモ帳に於けるShift+Cursorと似たようなもんです。
コマンドモード 最強のモード。なんでも出来る。とはいえ主に使うのは上記モードでは扱いきれない操作中心。ファイル開閉やウィンドウ、バッファ操作とか


モード概念は以下。

モードによってカーソルの位置、形状が異なるので分かりやすい。Linuxvimだと形状が変わらなかったりする。Macは知らん。


カーソル移動拡張 ( ノーマルモード、ビジュアルモード )

前回と区分が少し違うが、カーソル移動の中でも行内に収まる移動をまとめた。

ヒトマス移動。前回やったので省略。
hjkl 左下上右
単語移動。前回はさらっと出ただけ。

基本はwとb。似たようなコマンドは並列に覚えるのではなく、重みづけして覚えるのが良い。
つまり、使い易い、重要なものをまずしっかり覚えると。まあ当たり前だけど。

w 次の単語の先頭へ。Wordの頭文字。
b 前の前単語の先頭へ。Backの頭文字。
e 単語の後ろへ。endの頭文字。

この3つ、qwertyでは全て左手担当になる。
カーソル移動は右手、単語移動は左手。
まあ左手は偶然だろうけど。


w,bは便利なのだけど、デフォルトでは単語以外に記号にも引っかかってしまう。これがジャンプ幅が極端に変化してしまうから面倒。

何とかしてくれ。と思った時にはpluginを書くんだ。これは俺がそのうち書くけど。

行移動。
f fxと押すと行内にある次のxにジャンプする。
; 次の文字へ
, 前の文字へ

関係ないけど、fはvimperatorではリンクへのジャンプへ使われる非常に重要なコマンド。

行頭、行末へ。

行頭、行末からの挿入はIとAがあるからあまり使わないけど。

^ 行頭の文字へ。正規表現に由来。
$ 行末へ。正規表現に由来。
0 真の行頭へ。

ここで0を「真の行頭へ」と書いたのは、^の場合、タブ等でインデントしている時は行頭のタブを含めないからだ。
よって^,$の方が使い易い。

インサートモード拡張

ノーマルからインサートへ

a,iだけだったが、2つ増やす。

i カーソル前からインサートモードへ
a カーソル後ろからインサーとモードへ
o カーソルの次の行から(改行して)インサートモードへ
c 選択範囲を消してインサートモードへ※後述

大文字はめんどいからぬかした。以下の図を見ればわかるだろう。

インサートモードでのコマンド

普通のメモ帳と思ってもらっていい。わけない。補完は唯一eclipseのエディット機能で使える機能であるくらい補完は重要。
インサートモード内でのカーソル移動はカーソルキーで出来るが、使う奴はいないだろう。
俺はカーソルキーをホームポジションのまま打てるようにして使っているけど。

C-h BackSpace
C-d Delete
C-n 前方検索補完, next
C-p 後方検索補完, previous

補完とは、vimで開いている文章ないにすでに使われている単語を補完する機能だ。
C-n,C-pは、補完候補を探しに行く際に、を見に行くかを見に行くかの違いだから、そんなに変わらない。と思う最近のVimでは。


保存周り拡張

保存とか終了とか

Read Only fileに書き込むときとか、変更を保存しないで終了するときは!が必要。

:w 保存
:w filename.txt filename.txtの名前で保存。
:q 保存せずに終了
:wq 保存して終了
ZZ 保存して終了(:wと同じ)
ZQ 保存しないで終了(:q!と同じ)
ファイルを開く
:e filename.txt filename.txtを開く。edit
:o filename.txt filename.txtを開く。open

ファイルを開くだけならeもoもたいして変わらないのだが、
とりあえず:eは補足しておこう。文字エンコードや改行形式を変えたいことはままあるからだ。

文字エンコード、フォーマット

以下の2つをとりあえず覚えておくといい。ともに重要。
ENCODEにはsjis,utf8,euc-jp等をあてはめる。FORMAT(改行形式)にはdos,unix,macのどれかをあてはめる。

  • ファイルを別の文字コードで読み込みたい!(ファイルを開いたら文字化けしたから)
e ++enc=
bold;">ENCODE ++ff=FORMAT
set fenc=
bold;">ENCODE ff=FORMAT

:w

:eとはファイルを再度新しく読み込むイメージ、
:setとはvimの環境設定を変えるイメージ。

ビジュアルモード拡張

疲れてきたぜ。以下の3つは前のまま。

v 選択モードへ
C-v 矩形選択モードへ
V 行選択モードへ

普通WinではShift-Cursorで選択領域を選ぶわけだが、
それがvimではビジュアルモードに移行後(v)、普通にカーソル移動(h,j,k,l)しているというだけだ。

一括挿入(ブロック挿入?正しい言葉は知らない)

ここでVimの凝った技をひとつ。
あー複数行コメントアウトしたいなー、と思ったとする。

  1. C-vで挿入したい位置が左側になるように矩形選択。矩形選択した幅は関係ない。
  2. おもむろにI(大文字のi)を押す。
  3. え?これ本当に一括挿入なの?と思いながら挿入文字//を入力。
  4. Escを押す。
  5. 感動する。

2.でIの代わりにAを押せば、矩形選択領域の右側に挿入できる。
手順が5つあるわけだが、何かと役立つので覚えておくといい。
もちろん//だけでなく、タブでも数字でも好きな文字を挿入できる。
行末に一括挿入したいけど行末が揃ってないから出来ない!てときは、1.で$を押して選択範囲を広げ、2.ではAを押せば良い。

コピー、ペースト、切り取り

小規模コピー、カット

x,yy,ddは以前やった。

x 一文字カット
yy 一行コピー
dd 一行カット
cc 一行カットの後、インサートモードへ
D カーソルから行末までをカット
C カーソルから行末までをカットの後、インサートモードへ
領域選択後コピー、カット

yとdはいいやな。前述してあるが、cを加えよう。cはy,dと同列にある。

選択後y yank
選択後d delete
選択後c 選択範囲を切り取りインサートモードへ。change。
ペースト
p カーソルの後にペースト。paste
P カーソルの前にペースト。paste

ここで「カーソルの後ろ」、「カーソルの前」と言うのは、コピー(カット)したものが行か否かで違う。
行の場合、(yy,dd,cc,Vのあと)

p 下の行
P 上の行

行でない場合は全て(x,C-vなど)、

p カーソルの右
P カーソルの左

検索、置換拡張

この辺は前と同じ。
前は後方検索だけだったが、前方変換も一応ある。Vimなら後方検索だけで十分だ。

/ 後方検索
? 前方検索
* カーソル上の単語後方検索
# カーソル上の単語前方検索
n 検索語、正順に回る
N 検索語、逆順に回る
r 一文字置換
R 複数文字置換(Escで終了)
:s/hoge/piyo/gc 行内のhogepiyoに置換する
:%s/hoge/piyo/gc ファイル全体でhogepiyoに置換する

そのた

u undo
C-r redo
% 対応する括弧へ移動
~ カーソル上の文字の大文字小文字をトグル
== インデント調節

:echo "Hello Vim World!!"

ここまでで、大抵の動作は出来るようになったと思う。
後は細かいTipsをちょこちょこ出していくようなのかな。


しかしまあid:bonarさんが素晴らしい記事を既に書いておられるので、
ここまで終わったのならそちらを見てみると良いと思います。