1 *usr_30.txt* For Vim バージョン 7.2. Last change: 2007 Nov 10
3 VIM USER MANUAL - by Bram Moolenaar
8 プログラミングに役立つ機能が Vim にはたくさんあります。プログラムをコンパイル
9 してエラーが出た行にジャンプしたり、言語に合わせて自動的にインデントしたり、コ
19 次章: |usr_31.txt| GUI を活用する
20 前章: |usr_29.txt| プログラムの中を移動する
23 ==============================================================================
26 Vim にはクイックフィックス (quickfix) 機能があります。これは、Vim の中でプログ
27 ラムをコンパイルして、エラーになった場所に移動し、エラーを修正するための機能で
28 す。そうして、正常にコンパイルできるまでコンパイルとエラー修正を繰り返します。
30 次のコマンドは "make" を実行し、その出力を読み込みます (引数はそのまま渡されま
35 エラーが発生するとそれが認識され、最初のエラーにカーソルが移動します。
36 ":make" の使い方を実際に見てみましょう。(典型的な :make セッションはもっと多く
37 のエラーあるいは少しのゴミを出力しますが) ":make" を実行すると次のような出力が
40 :!make | &tee /tmp/vim215953.err ~
41 gcc -g -Wall -o prog main.c sub.c ~
42 main.c: In function 'main': ~
43 main.c:6: too many arguments to function 'do_sub' ~
44 main.c: At top level: ~
45 main.c:10: parse error before '}' ~
46 make: *** [prog] Error 1 ~
50 (3 of 6): too many arguments to function 'do_sub' ~
51 Hit ENTER or type command to continue ~
53 "main.c" の中でエラーが発生していることが確認できると思います。<Enter> を押す
54 と "main.c" ファイルが開き、6 行目 (最初のエラー) にカーソルが移動します。自分
55 でファイルを開く必要はありません。Vim はエラーメッセージを認識できます。
57 +---------------------------------------------------+
61 cursor -> | do_sub("foo"); |
67 |(3 of 12): too many arguments to function 'do_sub' |
68 +---------------------------------------------------+
70 このコマンドで次のエラーに移動できます: >
74 カーソルが 10 行目に移動します。ファイルの最終行に余分な '}' がありますね。長
75 すぎるエラーメッセージは省略して表示されます。全部を表示するには次のコマンドを
80 すべてのエラーメッセージを表示するには ":clist" コマンドを使います。次のような
84 < 3 main.c: 6:too many arguments to function 'do_sub' ~
85 5 main.c: 10:parse error before '}' ~
87 ファイル名と行番号が認識された行だけが表示されますが、それは、重要なのはそのよ
88 うな行だけで、他の行は無駄なメッセージであると判断されるからです。しかし時に
89 は、認識されなかった行が重要な情報を含んでいることもあります。例えばリンカが未
90 解決の関数をエラー表示した場合などです。すべてのメッセージを表示するにはコマン
94 < 1 gcc -g -Wall -o prog main.c sub.c ~
95 2 main.c: In function 'main': ~
96 3 main.c:6: too many arguments to function 'do_sub' ~
97 4 main.c: At top level: ~
98 5 main.c:10: parse error before '}' ~
99 6 make: *** [prog] Error 1 ~
101 現在のエラーは強調表示されます。前のエラーに戻るには次のコマンドを使います: >
105 エラーリストを移動するコマンドは他にもあります:
115 ":make" コマンドが実際に実行するプログラムは 'makeprg' オプションで設定しま
116 す。通常は "make" に設定されていますが、例えば Visual C++ を使う場合は "nmake"
121 オプションにはプログラムの引数も含めることができます。特殊文字はバックスラッ
124 :set makeprg=nmake\ -f\ project.mak
126 プログラムの設定には特殊なキーワードが使えます。文字 % はカレントファイルの名
127 前に展開されます。例えば次のように設定すると: >
131 main.c を編集しているときに ":make" を実行すると次のコマンドが実行されます: >
135 これ自体はそれほど便利ではありませんが、すこし変更して :r (root) 修飾子を使う
138 :set makeprg=make\ %:r.o
140 これで、実行されるコマンドは次のようになります: >
144 修飾子については |filename-modifiers| を参照してください。
150 例えば ":make" を実行したときに、一つのファイルで警告メッセージが出て、他の
151 ファイルではエラーが出たとします。エラーを修正し、本当に直ったかどうかを確認す
152 るためにもう一度 ":make" を実行しました。さて、ここで先程の警告メッセージを確
153 認しようとしても、エラーリストには警告メッセージありません。なぜなら、警告メッ
154 セージを出したファイルは再コンパイルされなかったからです。次のコマンドで古いエ
159 ":clist" と ":cc {nr}" を使って、警告が発生した場所にジャンプしましょう。
160 次のコマンドで新しいエラーリストに戻れます: >
164 全部で 10 個までのエラーリストを保持しておくことができます。
170 コンパイラが出力するエラーメッセージの書式を調べ、'errorformat' オプションを設
171 定する必要があります。このオプションの構文は非常に複雑ですが、どのようなコンパ
172 イラにも対応できます。詳しい説明は |errorformat| を参照してください。
174 複数のコンパイラを使うとき、コンパイラを変更するたびに 'makeprg' や
175 'errorformat' を設定するのは面倒ですよね。簡単な方法が用意されています。例え
176 ば、Microsoft Visual C++ なら次のように設定します: >
180 "msvc" 用のスクリプトが検索され、適切なオプションが設定されます。
181 自分で設定スクリプトを書くこともできます。|write-compiler-plugin| 参照。
187 ":make" コマンドは、実行したプログラムの出力をエラーファイルにリダイレクトしま
188 す。その動作はいろいろな要因に依存しています (例えば 'shell' オプション)。
189 ":make" コマンドがプログラムの出力を拾えていないようなら、'makeef' オプション
190 と 'shellpipe' オプションを確認してみてください。'shellquote' オプションと
191 'shellxquote' オプションも関係あるかもしれません。
193 どうしても ":make" コマンドのリダイレクトが機能しない場合は、シェルからコンパ
194 イルを実行して、その出力をファイルにリダイレクトしてください。そして、次のコマ
199 ":make" コマンドと同様にエラーにジャンプできます。
201 ==============================================================================
204 プログラムを適切にインデントするとコードが読みやすくなります。Vim の機能を使え
205 ばインデントするのは簡単です。C 言語、あるいは C++ や Java などの C スタイルの
206 プログラムなら 'cindent' オプションをオンに設定してください。C 言語のインデン
207 トは組み込みで用意されていて、複雑な構文でも適切にインデントできます。インデン
208 トに使うスペースの数は 'shiftwidth' オプションで設定します。スペース 4 個くら
209 いが適切でしょうか。次のコマンドで設定できます: >
211 :set cindent shiftwidth=4
213 このオプションを設定すると、例えば "if (x)" と入力したときに、次の行が自動的に
217 インデントが増える ---> do_the_work();
218 インデントが減る <-- if (other_flag) {
219 インデントが増える ---> do_file();
220 インデントそのまま do_some_more();
223 波カッコ ({}) の中でテキストを入力すると、最初の行でインデントが増え、最後の行
224 でインデントが減ります。インデントが減るのは '}' を押したタイミングです (入力
227 自動インデントには、コーディングのミスを早く発見できるという副作用があります。
228 例えば、関数の最後で } を入力したときに、インデントが本来よりも多くなったとし
229 たら、どこかで } を入力し忘れています。"%" コマンドを使って、最後に入力した }
231 同様に、) や ; を忘れると、次の行のインデントが増えます。もし予想よりもインデ
232 ントが多くなってしまった場合は直前の行を確認してください。
234 書式が汚いコードを編集するとき、あるいは編集によってインデントが崩れてしまった
235 場合、コードを再インデントする必要があります。それには "=" オペレータを使いま
240 現在行がインデントされます。他のオペレータと同様、使い方は三通りあります。ビ
241 ジュアルモードで "=" を使うと、選択範囲の行がインデントされます。テキストオブ
242 ジェクトで便利なのは "a{" です。これは現在のブロックを選択します。つまり、次の
243 コマンドでコードのブロックをインデントできます: >
247 コードが根本的に汚い場合は、次のコマンドでファイル全体を再インデントできます:
251 ただし、手作業で丁寧にインデントされたファイルに対してこれを実行してはいけませ
252 ん。自動インデントは良い仕事をしてくれますが、場合によってはそのルールを破る必
257 ------------------------
259 インデントスタイルは人によってさまざまです。初期設定では 90% のプログラマーが
260 満足するようなスタイルに設定されています。しかし、世の中にはいろいろなスタイル
261 があるので、必要なら、'cinoptions' を設定することで、インデントスタイルをカス
263 'cinoptions' の初期設定は空です。その場合はデフォルトのスタイルが使われます。
264 このオプションに値を追加していくことでスタイルを変更できます。例えば、波カッコ
277 設定できる項目はたくさんあります。|cinoptions-values| 参照。
279 ==============================================================================
282 C ファイルを開くたびに 'cindent' オプションを設定するのは面倒ですよね。インデ
287 実際には、C ファイルに対して 'cindent' をオンにする以外の機能も有効になりま
288 す。まず最初に、ファイルタイプの認識が有効になります。認識機能は構文強調表示で
290 ファイルタイプが認識されると、そのファイルタイプ用のインデントファイルが検索さ
291 れます。Vim にはさまざまな言語に対応したインデントファイルが付属しています。イ
292 ンデントファイルが読み込まれ、自動インデントのための設定が行われます。
294 インデント設定の自動化は次のコマンドでオフにできます: >
298 特定のファイルタイプだけインデントを無効にしたい場合は、次のような一行だけの
301 :let b:did_indent = 1
305 {directory}/indent/{filetype}.vim
307 {filetype} は "cpp" や "java" といったファイルタイプの名前です。次のコマンドで
308 Vim が使っている名前を確認できます: >
312 例えばこのヘルプファイルなら次のように表示されます:
316 したがって、{filetype} には "help" が入ります。
317 {directory} はランタイムディレクトリです。次のコマンドの出力を調べてください:
321 ここでは先頭のパスを使います。つまり、出力が次のようなら:
323 runtimepath=~/.vim,/usr/local/share/vim/vim60/runtime,~/.vim/after ~
325 {directory} には "~/.vim" が入ります。したがって、ファイル名は次のようになりま
328 ~/.vim/indent/help.vim ~
330 インデントをオフにするのではなく、自分のインデントファイルを作成したい場合は、
331 |indent-expression| を参照してください。
333 ==============================================================================
336 最もシンプルな自動インデントは 'autoindent' オプションを使う方法です。これは直
337 前の行と同じインデントを使います。'smartindent' はもう少しスマートです。これは
338 インデントファイルが用意されていないような場合に使います。'smartindent' は
339 'cindent' より低機能ですが、'autoindent' よりは高機能です。
340 'smartindent' をオンにすると、{ でインデントが一つ増え、} で減ります。さらに、
341 'cinwords' オプションに設定された単語が現れた場合もインデントが増えます。# で
342 始まる行は特別扱いされ、一切インデントされません。つまり、プリプロセッサディレ
343 クティブの行はインデントされません。その次の行は通常通りインデントされます。
349 'autoindent' や 'smartindent' を設定すると、直前の行と同じインデントを使うこと
350 ができますが、自分でインデントを ('shiftwidth'の幅ずつ) 増やしたり減らしたりす
351 る必要も多々あります。それにはインサートモードで CTRL-D と CTRL-T を使うと簡単
353 例えば、次のようなシェルスクリプトを入力してみましょう:
362 :set autoindent shiftwidth=3
364 一行目を入力し、<Enter> を押して二行目を開始します:
369 二行目にはインデントが必要ですね。CTRL-T を押します:
374 インサートモードの CTRL-T コマンドは、'shiftwidth' の幅だけインデントを増やし
376 二行目を入力し、<Enter> を押して三行目を開始します。三行目のインデントは問題あ
377 りません。<Enter> を押して最後の行を入力します。テキストは次のようになりまし
385 最後の行の余分なインデントを削除するには CTRL-D 押します。これは 'shiftwidth'
386 の幅だけインデントを減らします。カーソルの位置は関係ありません。
387 ノーマルモードでは ">>" コマンドと "<<" コマンドで同様の操作ができます。">" と
388 "<" はオペレータなので、他のオペレータと同様に、インデントを変更する範囲を三通
389 りの方法で指定できます。次の組み合わせが特に便利です: >
393 現在のブロックのインデントが増えます。変更されるのは {} の中だけで、{ と } 自
394 体の行は変更されません。">a{" なら {} も含まれます。次の例では、カーソルは
397 original text after ">i{" after ">a{"
399 if (flag) if (flag) if (flag) ~
401 printf("yes"); printf("yes"); printf("yes"); ~
402 flag = 0; flag = 0; flag = 0; ~
405 ==============================================================================
408 'tabstop' の初期設定は 8 です。変更することはできますが、それはトラブルの元に
409 なります。他のプログラムはあなたが使用しているタブ幅を知ることができません。そ
410 のようなプログラムでは、恐らくタブの幅は 8 であると仮定されているので、テキス
411 トが崩れて表示されてしまいます。また、ほとんどのプリンタはタブ幅を 8 で固定し
412 ています。したがって、'tabstop' を変更するのはお勧めしません。(他のタブ幅設定
413 で書かれたテキストを修正したい場合は |25.3| を参照してください。)
414 プログラムをインデントする場合、8 桁単位でインデントするとすぐに画面が埋まって
415 しまいます。しかしスペースが一つだけではインデントが目立ちません。多くのプログ
416 ラマは (折衷して) 4 桁を好んで使います。
417 <Tab> の幅は 8 桁で、インデントを 4 桁にしたいということは、<Tab> 文字を使って
418 インデントすることはできないということです。そのようなインデントには二つの方法
421 1. <Tab> とスペースを混在させる。<Tab> は 1 つでスペース 8 個分の幅になるので
422 ファイルサイズの節約になります。スペース 8 個より <Tab> の方が入力も削除も
425 2. スペースだけを使う。違うタブ幅を使う他のプログラムでもトラブルが起きませ
428 Vim はどちらの方法もサポートしています。
432 --------------------------
434 タブとスペースを混在させる場合は特別な設定は必要ありません。初期設定でうまくい
436 'softtabstop' オプションを設定すると編集が少し楽になります。このオプションが設
437 定されると、タブ幅が 'softtabstop' の値に設定されたかのように、<Tab> キーが動
438 作します。しかし実際にはタブとスペースが混在して使われます。
439 次のコマンドを実行すると、<Tab> キーでカーソルが 4 桁ごとに進むようになります:
443 行頭で <Tab> を押すと、スペースが 4 個挿入されます。次に <Tab> を押すと、最初
444 のスペース 4 個が削除されて <Tab> 文字が挿入されます (つまりカーソルは 8 列
445 目)。このように、スペースは可能な限り <Tab> 文字で置き換えられます。
446 バックスペースはその反対の動作になります。<BS> を押すと、'softtabstop' の幅だ
447 け削除されます。可能な限り <Tab> が使われ、余りはスペースになります。
448 次の図は、<Tab> をいくつか入力してから <BS> を使ったときの様子を示しています。
449 "." はスペースで "------->" は <Tab> です。
454 <Tab><Tab><Tab> ------->....
455 <Tab><Tab><Tab><BS> ------->
456 <Tab><Tab><Tab><BS><BS> ....
458 同様の動作は 'smarttab' オプションを使っても実現できます。このオプションを設定
459 した場合、インデントの入力のために <Tab> を押すと 'shiftwidth' の幅が使われ、
460 何かの文字より後ろでは実際の <Tab> 文字が使われます。ただし、<BS> の動作は
461 'softtabstop' のときと同様にはなりません。
467 Tab 文字を一切使いたくない場合は 'expandtab' オプションを設定してください: >
471 このオプションをオンにすると、<Tab> キーでスペースが入力されるようになります。
472 つまり、<Tab> 文字と同じ量のスペースが挿入され、<Tab> 文字は使われません。
473 バックスペースキーはスペースを一つずつ削除するので、<Tab> を押した後でそれを削
474 除するには <BS> を 8 回押さなければなりません。インデントの削除は CTRL-D を使
478 タブをスペースに変換する (あるいはその逆)
479 -----------------------------------------
481 'expandtab' を設定しても、それ以前に入力されたタブ文字は影響を受けません。つま
482 り、文章中のタブ文字はタブ文字のままです。タブ文字をスペースに変換したい場合
483 は、":retab" コマンドを使ってください。次のように使います: >
488 すべてのインデントがスペースに変換されます。ただし、何かの文字より後ろにある
489 (インデント以外の) タブ文字はそのままです。それらのタブ文字も変換したい場合は
494 これは少し注意が必要です。なぜなら、文字列の中のタブ文字も変換されてしまうから
495 です。文字列の中でタブ文字が使われているかどうかは、次の検索パターンで確認でき
500 文字列の中でタブ文字を使うのはお勧めしません。トラブルを避けるためにも "\t" を
503 同様に、スペースをタブ文字に変換できます: >
508 ==============================================================================
511 Vim のすばらしいところはコメントを解釈できるところです。コメントの整形を指示す
513 例えば、次のようなコメントがあるとします:
517 * of the text formatting. ~
520 最初の行に移動して次のコマンドを実行すると、コメントを整形できます: >
524 "gq" はテキスト整形のためのオペレータです。"]/" はコメントの末尾に移動するコマ
528 * This is a test of the text formatting. ~
532 ビジュアルモードでテキストを選択してから "gq" を使う方法でも構いません。
534 新しい行を追加したい場合は、真ん中の行に移動して "o" を押します。次のような結
538 * This is a test of the text formatting. ~
542 行頭のスペースと * は自動的に挿入されるので、そのままコメントを入力することが
543 できます。テキストが 'textwidth' より長くなると自動的に改行されます。そのとき
547 * This is a test of the text formatting. ~
548 * Typing a lot of text here will make Vim ~
552 この機能を使うには 'formatoptions' の設定が必要です:
554 r インサートモードで <Enter> を押したときに * を挿入する
555 o ノーマルモードで "o" または "O" を使ったときに * を挿入する
556 c コメントを 'textwidth' の幅で改行する
564 コメントの書式は 'comments' オプションで設定します。一行コメントと三部コメント
565 (開始、中間、終端からなるコメント) は分けて処理されます。
566 ほとんどの一行コメントは特定の文字で始まります。C++ は //、メイクファイルは
567 #、 Vim は " です。例えば、C++ のコメントなら次のように設定します: >
571 コロンはフラグとコメント文字の区切りです。'comments' の設定は次のような形式で
576 この例のように、{flags} は空でも構いません。
577 複数のアイテムを指定するときはカンマで区切ります。アイテムを複数指定できるの
578 で、同じファイルの中でいろんな種類のコメントを使うことができます。例えばメール
579 を返信するときに、相手のメッセージに ">" や "!" を付けて引用する場合は、次のよ
582 :set comments=n:>,n:!
584 二つのアイテムが設定されました。一つは ">" で開始するコメント、もう一つは "!"
585 で開始するコメントです。"n" フラグが使われているので、コメントを入れ子にできま
586 す。つまり、">" で開始する行は、">" の後ろに他のコメントを含んでいても構いませ
587 ん。この設定により、次のようなメッセージを整形することができます:
589 > ! Did you see that site? ~
590 > ! It looks really great. ~
591 > I don't like it. The ~
592 > colors are terrible. ~
593 What is the URL of that ~
596 'textwidth' の設定を変更して (例えば 80 にして)、テキストを整形してみましょ
597 う。ビジュアルモードでテキストを選択してから "gq" を押します:
599 > ! Did you see that site? It looks really great. ~
600 > I don't like it. The colors are terrible. ~
601 What is the URL of that site? ~
603 違う種類のコメントテキストは混ざっていませんね。
604 二行目の "I" は一行目の末尾に入れることも可能ですが、しかし、一行目は "> !" で
605 始まり、二行目は ">" で始まっているため、それらのコメントは別のものであると判
609 三部コメント (A THREE PART COMMENT)
612 C のコメントは "/*" で始まり、中間には "*" が付き、"*/" で終わります。このよう
615 :set comments=s1:/*,mb:*,ex:*/
617 開始部分は "s1:/*" です。"s" は三部コメントの開始を示します。フラグとコメント
618 文字 "/*" をコロンで区切っています。フラグには "1" が指定されていますが、これ
619 により中間部分がスペース一個分、字下げされます。
620 中間部分は "mb:*" です。"m" は三部コメントの中間を示します。"b" フラグは、コメ
621 ント文字の後ろに空白が必要であることを示します。これを指定しないと、"*pointer"
622 などもコメントとして認識されてしまいます。
623 終端部分は "ex:*/" です。"e" は三部コメントの終端を示します。"x" は特殊なフラ
624 グです。中間の * が自動的に挿入された直後に "/" を押すと、余計なスペースが削除
627 詳細は |format-comments| を参照してください。
629 ==============================================================================
631 次章: |usr_31.txt| GUI を活用する
633 Copyright: see |manual-copyright| vim:tw=78:ts=8:ft=help:norl: