Linux標準エディッタvim
エディッタというのはプログラミングをするときに使うテキスト作成ツールで
エディッタで好きなプログラム言語でプログラムを書いて、コンパイラで機械語に変換してソフトウェアを作ります。
vimは癖がありますが慣れれば、とても使いやすいエディッタです。
Linuxでは標準のエディッタなので、ぜひ使いこなせるようになっておきましょう。
特にCプログラマーはなくてはならないエディッタになるはずです。
h(←)
j(↑)
k(↓)
l(→)
カーソル移動。
最初はびっくりすると思いますけど1週間も使ったら慣れます。
慣れれば指をホームポジションから動かさなくていいので、こっちの方が楽だったりします。
viが作られた当時はカーソルキーに互換性がなかったので、アルファベットキーを使う必要があったらしいです。
ローグと言うゲーム(風来のシレンとかの元のゲーム)も同じ操作で移動できるので、それで遊んでから慣れると言う話もあります。
i
a
編集モードに入る。iはカーソルの前からで、aはカーソルの後ろから。
編集モードに入ったら、好きなコードが書けます。
ESCAPEキーで編集モードを抜ける。
覚えていたらいいのは編集モード中はCTRL-Wで後方単語削除です。
これはbashでも使えるので使っていもいいと思います。
応用
I
A
Iで行頭から編集モードに入る。
Aで行末から編集モードに入る。
o
新しい行を作って編集モードに入る。
僕はこれの代わりにA→ENTERを使ってしまいます。
最初に気をつけて変な癖が付かないようにしましょう。
x
カーソルキーの下の文字を1文字消す。
ただ、あまり使いません。もっと便利な消し方がたくさんあるからです。
5xとかは使えるかもしれません。これは5文字消すです。
vimは数字キーを押してから編集コマンドを打つとその回数分同じことを繰り返します。
79i/ESCAPE
で/を79文字打ち込みます。
”:w"
ファイルの保存。実はもう一個モードがあって、:から色々なコマンドを実行します。
wはwriteのwです。
":wq"
ファイルを保存して終了。qはquitのq。
":q"
終了。:q!で保存せず終了。
^
行頭に移動。ちなみに^は正規表現で行頭を表します。
$
行末に移動。これも正規表現と同じ。
0
インデントしていても行頭に移動します。
w,b
単語単位で前後に移動。wはwordかな。bはback wordだと思います。
数字キーと組み合わせると楽にたくさん右に移動できたりします。3wとか。
f[移動したい文字]
fの後に移動したい文字を押して、前方にある文字に移動します。Fの後だと後ろに移動します。
下にも書きますが削除と組み合わせると便利です。
C言語で"で囲まれた文字列を一気に消したい時とかdf"
dd
一行削除。これは良く使います。便利です。
dの後にw,b,f,F,$,0とか
移動系と組み合わせて削除。dwで一単語消します。d$で行末まで削除。あ、これはDでできます。
xの一文字削除だとドットキー(.)による編集の繰り返しをする場合にいまいちですが
こっちを使っておけば繰り返し動作にも都合が良いです。
cc
一行削除してから編集モードに入る。
cの後に移動系
移動系と組み合わせて削除してから編集モードに入る。
これと/キーによる単語移動とドットキー(.)による繰り返しをするを組み合わせると同じ単語を素早く置き換えられます。
単語の置き換えはコマンドモードからも行えますが、あっちは入力するのがめんどくさいので
軽く置き換えたいときに便利です。
/検索したい単語→エンターキー
入力した単語まで移動します。これはもの凄く多用します。下手すると普通のカーソル移動よりも使います。
nでもう一回繰り返し、Nで↑に戻ります。
less,lv,moreなどページャでも使われる操作です。
注意) あまり/を多用するのも考えものです。vimには色々な移動の方法があるので、巧く使いわけましょう。
"*"
カーソル下の単語を検索。これも多用します。スーパースターとか本に書いてあった。
.(ドット)
編集操作を繰り返す。移動系は繰り返されません。
これスタックできればいいと思うんですけど、できるのかな。
u
アンドゥ。編集を一つ前に戻す。CTRL-Rで戻ったのを一つ取り消せます。
viでは3回までしか使えないので、それを補う技とかあったようです。
vimでは無限に戻れます。
CTRL-D, CTRL-U
画面のスクロール。
zz
現在のカーソル位置をスクリーンの中央にする。
あればいいのにと思っていたものがちゃんと揃っているのがvimです。
z[ENTER]
現在のカーソル位置をスクリーンの一番上にする。
z-
現在のカーソル位置をスクリーンの一番下にする。
コピーアンドペースト
yy
一行をヤンク(バッファに記憶)
y,移動系
おなじみの操作。ywで単語をヤンク。y$で行末までヤンク。
p,P
ヤンクしたバッファをペースト。pが後ろに。Pが前に。
ビジュアルモード
Vで始めます。選択モードのことです。これで範囲選択します。
反転した文字が選択している範囲です。
yでヤンク
dで削除
">"でインデントを→に
"<"でインデントを←に
"5>"でインデントを5個→に
":"で選択した範囲をコマンドモードで操作
gvでもう一度同じ範囲を選択します。5>なんてやって、インデント行き過ぎたってときにもう一度gv, <です。
他にも.(dot)で繰り返しができるのでVで選択して>でインデントさせて.(dot)を連打すれば多段インデントできます。
この場合は行き過ぎたときはuです。
CTRL-Vで縦型の選択
Iで文字を打つ→ESCAPEで、先頭に文字を追加。これで複数行を一気にコメントアウトできます。
dで削除。これで逆にコメントを消したりします。
これ知っていないと言語的に複数行のコメントアウトをサポートしていないシェルスクリプトを編集するのが辛いです。
コマンドモード
":% s/aaa/bbb/gc"
aaaをbbbに置き換えます。
%はファイル全体という意味です。gがグローバル(一行に複数単語があっても置き換える)cが確認です。
打ち込むのが正直めんどくさいんですけど、sedを知っていれば、この操作は納得でしょう。
慣れましょう。
ビジュアルモードで範囲選択して置き換えというのは他のエディッタにはあまりない、、、かしらないけど
便利です。
":! シェルコマンド"
シェルに渡して実行。
":. !シェルコマンド"
カーソル行にコマンド結果を張り付け。
うーん、いまいち使い道が思い浮かばない。
ビジュアルモードなどで範囲指定すればコマンドにテキストを渡して
処理させ、その結果を張り付けられます。
V→:→!sortでソートとか。
最近気づいた使い方は、:. !ls で、includeするヘッダーの一覧を得るとかです。
あとは拙作のソフトで申し訳ないのですが:% !xyzsh -c '| sub -global "ab(.)d" "aa\1d"'とかすれば、鬼車の正規表現で文字列処理が行えます。
":make"
コンパイル。エラー箇所はcnext, cprevで移動。clistで一覧。
gg
ファイルの先頭に移動。
G
ファイルの最後尾に移動
100g
100行に移動
その他のTIPS
q[a-z]→編集→通常モードでq
操作を記録します。
同じ様な編集が続く場合は、そのまま自分ですると自分がコンピュータになっちゃいます。
その場合これを使ってコンピュータにさせます。
移動にはカーソル移動を使わずに/,fなどの検索系の移動を使うのが不規則性に対応するコツです。
vimはそのあたりが豊富なのでとてもやりやすいです。vim love。
これで無理な場合はperlを使いましょう。
(追記)ただし、結局手で打った方が早い場合も、あります。手で打った方が早いのに凝ったperlコードを何時間もかけて書いてしまうのをハマるといいます。
この辺りはケースバイケースです。
@[a-z]
記録した操作をもう一度再現します。
:vsplit ファイル
垂直分割でファイルを開く。
僕はこれを普通のファイルを開くとして使ってます。
他のファイルからコードをコピーするときとか、他のファイルを軽く見たいときって
2つ以上開く必要がないからです。
:oによるバッファで開くは切替えるのが面倒だし。
:vsp ファイル
と短縮してもいけます。
:split ファイル
水平分割でファイルを開く
:sp ファイル
と短縮してもいけます。
最近は:vspよりも:spばかり使ってます。
現在編集中のファイルも:spで開くことができるので、ファイルの上の部分を見ながら、下の部分を編集することもできます。
C-w h,j,k,l
分割したファイル間を移動する。
C-w,C-w
分割したファイル間をトグルで移動
2つしか開いてない場合上のよりこっちのほうが便利。
[[
関数のトップへ移動
]]
次の関数に移動
ビジュアルモードと組み合わせれば楽に関数をコピーアンドペーストしたり
次の関数定義へ移動したいときに便利です。
2013/12/27日追記)ソースを読む時もどんどん関数定義の先頭に移動できるので、構造を把握しやすいです。
これがあるおかげでvimは関数定義のアウトラインが無くても大丈夫だと言っても過言ではありません。
関数の定義を行なっている時に引数を見たくなったら、"[["でトップへ移動、``で、また元に戻るなどにも使えます。
C言語のソースを編集しているときには/よりも多用するかもしれません。
ブロックの折り畳み
zfa{ 閉じる
zo 開く
操作が複雑ですが、なんとなく操作してみたら、指が覚えてたりします。
ブロックの移動
{の上で%
ビジュアルモードでブロック全体をインデントとか、削除とかに便利。
マーク
m[a-z]
マークへジャンプ
`[a-z]
ma, `aしか使っていません。
ジャンプ前に戻る
``
/を使った後や、ggを使った後に元に戻ります。
これもスタックできればいいのにと思います。
こんなところかな。僕は結構長く使っているわりにはタコなんで、参考になったか不安です。
vimはたくさん機能があるし、意外な使い方がたくさんあるので、僕が使っている機能なんて
氷山の一角だと思ってます。
また発見があれば、追記していきたいと思います。
お薦めの書籍は
Vi IMproved-Vim 完全バイブル
技術評論社
です。
最終更新:2013年12月27日 14:05