Next: , Previous: , Up: 目次   [Index]


プログラムの編輯

*usr_30.txt*	For Vim バージョン 8.1.  Last change: 2007 Nov 10

		     VIM USER MANUAL - by Bram Moolenaar

			       プログラムの編輯

プログラミングに役立つ機能が Vim にはたくさんあります。プログラムをコンパイルしてエラーが出た行にジャンプしたり、言語に合はせて自動的にインデントしたり、コメントを整形したりできます。

|30.1|コンパイル
|30.2|C 言語系インデント
|30.3|インデント設定の自動化
|30.4|その他のインデント
|30.5|タブとスペース
|30.6|コメントの整形

コンパイル

Vim には quickFix 機能があります。これは、Vim の中でプログラムをコンパイルして、エラーになつた場所に移動し、エラーを修正するための機能です。さうして、正常にコンパイルできるまでコンパイルとエラー修正を繰り返します。

次のコマンドは "make" を實行し、その出力を讀み込みます (引數はそのまま渡されます):

:make {arguments}

エラーが發生するとそれが認識され、最初のエラーにカーソルが移動します。

":make" の使ひ方を實際に見てみませう。(典型的な :make セッションはもつと多くのエラーあるいは少しのゴミを出力しますが) ":make" を實行すると次のやうな出力が畫面に表示されます:

:!make | &tee /tmp/vim215953.err
gcc -g -Wall -o prog main.c sub.c
main.c: In function 'main':
main.c:6: too many arguments to function 'do_sub'
main.c: At top level:
main.c:10: parse error before '}'
make: *** [prog] Error 1

2 returned
"main.c" 11L, 111C
(3 of 6): too many arguments to function 'do_sub'
Hit ENTER or type command to continue

"main.c" の中でエラーが發生してゐることが確認できると思ひます。<Enter> を押すと "main.c" ファイルが開き、6 行目 (最初のエラー) にカーソルが移動します。自分でファイルを開く必要はありません。Vim はエラーメッセージを認識できます。

          +---------------------------------------------------+
          |int main()                                         |
          |{                                                  |
          |       int i=3;                                    |
cursor -> |       do_sub("foo");                              |
          |       ++i;                                        |
          |       return (0);                                 |
          |}                                                  |
          |}                                                  |
          | ~                                                 |
          |(3 of 12): too many arguments to function 'do_sub' |
          +---------------------------------------------------+

このコマンドで次のエラーに移動できます:

:cnext

カーソルが 10 行目に移動します。ファイルの最終行に餘分な ’‘}’’ がありますね。

長すぎるエラーメッセージは省略して表示されます。全部を表示するには次のコマンドを使ひます:

:cc

すべてのエラーメッセージを表示するには ":clist" コマンドを使ひます。次のやうな出力が表示されます:

:clist
3 main.c: 6:too many arguments to function 'do_sub'
5 main.c: 10:parse error before '}'

ファイル名と行番號が認識された行だけが表示されますが、それは、重要なのはそのやうな行だけで、他の行は無駄なメッセージであると判斷されるからです。しかし時には、認識されなかつた行が重要な情報を含んでゐることもあります。例へばリンカが未解決の函數をエラー表示した場合などです。すべてのメッセージを表示するにはコマンドに "‘!’" を付けます:

:clist!
1 gcc -g -Wall -o prog main.c sub.c
2 main.c: In function 'main':
3 main.c:6: too many arguments to function 'do_sub'
4 main.c: At top level:
5 main.c:10: parse error before '}'
6 make: *** [prog] Error 1

現在のエラーは强調表示されます。前のエラーに戾るには次のコマンドを使ひます:

:cprevious

エラーリストを移動するコマンドは他にもあります:

:cfirst最初のエラー
:clast最後のエラー
:cc 33 つ目のエラー

他のコンパイラを使ふ

":make" コマンドが實際に實行するプログラムは ’makeprg’ オプションで設定します。通常は "make" に設定されてゐますが、例へば Visual C++ を使ふ場合は "nmake" に設定する必要があります:

:set makeprg=nmake

オプションにはプログラムの引數も含めることができます。特殊文字はバックスラッシュでエスケープしてください。例:

:set makeprg=nmake\ -f\ project.mak

プログラムの設定には特殊なキーワードが使へます。文字 % はカレントファイルの名前に展開されます。例へば次のやうに設定すると:

:set makeprg=make\ %:S

main.c を編輯してゐるときに ":make" を實行すると次のコマンドが實行されます:

make main.c

これ自體はそれほど便利ではありませんが、すこし變更して :r (root) 修飾子を使ふとどうでせう:

:set makeprg=make\ %:r:S.o

これで、實行されるコマンドは次のやうになります:

make main.o

修飾子については |filename-modifiers| を參照してください。

古いエラーリスト

例へば ":make" を實行したときに、1 つのファイルで警告メッセージが出て、他のファイルではエラーが出たとします。エラーを修正し、本當に直つたかどうかを確認するためにもう一度 ":make" を實行しました。さて、ここで先程の警告メッセージを確認しようとしても、エラーリストには警告メッセージありません。なぜなら、警告メッセージを出したファイルは再コンパイルされなかつたからです。次のコマンドで古いエラーリストに戾ることができます:

:colder

":clist" と ":cc {nr}" を使つて、警告が發生した場所にジャンプしませう。 次のコマンドで新しいエラーリストに戾れます:

:cnewer

全部で 10 個までのエラーリストを保持しておくことができます。

他のコンパイラを使ふ

コンパイラが出力するエラーメッセージの書式を調べ、’errorformat’ オプションを設定する必要があります。このオプションの構文は非常に複雜ですが、どのやうなコンパイラにも對應できます。詳しい說明は |errorformat| を參照してください。

複數のコンパイラを使ふとき、コンパイラを變更するたびに ’makeprg’ や’errorformat’ を設定するのは面倒ですよね。簡單な方法が用意されてゐます。例へば、Microsoft Visual C++ なら次のやうに設定します:

:compiler msvc

"msvc" 用のスクリプトが檢索され、適切なオプションが設定されます。 自分で設定スクリプトを書くこともできます。|write-compiler-plugin| 參照。

出力のリダイレクト

":make" コマンドは、實行したプログラムの出力をエラーファイルにリダイレクトします。その動作はいろいろな要因に依存してゐます (例へば ’shell’ オプション)。":make" コマンドがプログラムの出力を拾へてゐないやうなら、’makeef’ オプションと ’shellpipe’ オプションを確認してみてください。’shellquote’ オプションと’shellxquote’ オプションも關係あるかもしれません。

どうしても ":make" コマンドのリダイレクトが機能しない場合は、シェルからコンパイルを實行して、その出力をファイルにリダイレクトしてください。そして、次のコマンドでそのファイルを讀み込みます:

:cfile {filename}

":make" コマンドと同樣にエラーにジャンプできます。

C 言語系インデント

プログラムを適切にインデントするとコードが讀みやすくなります。Vim の機能を使へばインデントするのは簡單です。C 言語、あるいは C++ や Java などの C スタイルのプログラムなら ’cindent’ オプションをオンに設定してください。C 言語のインデントは組み込みで用意されてゐて、複雜な構文でも適切にインデントできます。インデントに使ふスペースの數は ’shiftwidth’ オプションで設定します。スペース 4 個くらゐが適切でせうか。次のコマンドで設定できます:

:set cindent shiftwidth=4

このオプションを設定すると、例へば "if (x)" と入力したときに、次の行が自動的にインデントされます。

                            if (flag)
Automatic indent   --->        do_the_work();
Automatic unindent <--      if (other_flag) {
Automatic indent   --->         do_file();
keep indent                     do_some_more();
Automatic unindent <--      }

波カッコ (‘{}’) の中でテキストを入力すると、最初の行でインデントが增え、最後の行でインデントが減ります。インデントが減るのは ’‘}’’ を押したタイミングです (入力を豫測することはできないので)。

自動インデントには、コーディングのミスを早く發見できるといふ副作用があります。例へば、函數の最後で } を入力したときに、インデントが本來よりも多くなつたとしたら、どこかで } を入力し忘れてゐます。"%" コマンドを使つて、最後に入力した } と對になつてゐる { を探しませう。

同樣に、‘)’ や ‘;’ を忘れると、次の行のインデントが增えます。もし豫想よりもインデントが多くなつてしまつた場合は直前の行を確認してください。

書式が汚いコードを編輯するとき、あるいは編輯によつてインデントが崩れてしまつた場合、コードを再インデントする必要があります。それには "=" オペレータを使ひます。最も單純なのは次の使ひ方です:

==

現在行がインデントされます。他のオペレータと同樣、使ひ方は 3 通りあります。ビジュアルモードで "=" を使ふと、選擇範圍の行がインデントされます。テキストオブジェクトで便利なのは "a{" です。これは現在のブロックを選擇します。つまり、次のコマンドでコードのブロックをインデントできます:

=a{

コードが根本的に汚い場合は、次のコマンドでファイル全體を再インデントできます:

gg=G

ただし、手作業で叮嚀にインデントされたファイルに對してこれを實行してはいけません。自動インデントは良い仕事をしてくれますが、場合によつてはそのルールを破る必要もあるからです。

インデントスタイルの設定

インデントスタイルは人によつてさまざまです。初期設定では 90% のプログラマが滿足するやうなスタイルに設定されてゐます。しかし、世の中にはいろいろなスタイルがあるので、必要なら、’cinoptions’ を設定することで、インデントスタイルをカスタマイズできます。

cinoptions’ の初期設定は空です。その場合はデフォルトのスタイルが使はれます。このオプションに値を追加していくことでスタイルを變更できます。例へば、波カッコの位置を次のやうにしたい場合は:

if (flag)
  {
    i = 8;
    j = 0;
  }

次のコマンドを使ひます:

:set cinoptions+={2

設定できる項目はたくさんあります。|cinoptions-values| 參照。

インデント設定の自動化

C ファイルを開くたびに ’cindent’ オプションを設定するのは面倒ですよね。インデントの設定は自動化できます:

:filetype indent on

實際には、C ファイルに對して ’cindent’ をオンにする以外の機能も有效になります。まづ最初に、ファイルタイプの認識が有效になります。認識機能は構文强調表示で使はれてゐるものと同じです。

ファイルタイプが認識されると、そのファイルタイプ用のインデントファイルが檢索されます。Vim にはさまざまな言語に對應したインデントファイルが附屬してゐます。インデントファイルが讀み込まれ、自動インデントのための設定が行はれます。

インデント設定の自動化は次のコマンドでオフにできます:

:filetype indent off

特定のファイルタイプだけインデントを無效にしたい場合は、次のやうな 1 行だけのファイルを作成してください:

:let b:did_indent = 1

これを、決められた名前で保存します:

{directory}/indent/{filetype}.vim

{filetype} は "cpp" や "java" といつたファイルタイプの名前です。次のコマンドで Vim が使つてゐる名前を確認できます:

:set filetype

例へばこのヘルプファイルなら次のやうに表示されます:

filetype=help

したがつて、{filetype} には "help" が入ります。

{directory} はランタイムディレクトリです。次のコマンドの出力を調べてください:

set runtimepath

ここでは先頭のパスを使ひます。つまり、出力が次のやうなら:

runtimepath=~/.vim,/usr/local/share/vim/vim60/runtime,~/.vim/after

{directory} には "~/.vim" が入ります。したがつて、ファイル名は次のやうになります:

~/.vim/indent/help.vim

インデントをオフにするのではなく、自分のインデントファイルを作成したい場合は、|indent-expression| を參照してください。

その他のインデント

最もシンプルな自動インデントは ’autoindent’ オプションを使ふ方法です。これは直前の行と同じインデントを使ひます。’smartindent’ はもう少しスマートです。これはインデントファイルが用意されてゐないやうな場合に使ひます。’smartindent’ は ’cindent’ より低機能ですが、’autoindent’ よりは高機能です。

smartindent’ をオンにすると、{ でインデントが 1 つ增え、} で減ります。さらに、’cinwords’ オプションに設定された單語が現れた場合もインデントが增えます。‘#’ で始まる行は特別扱ひされ、一切インデントされません。つまり、プリプロセッサーディレクティブの行はインデントされません。その次の行は通常通りインデントされます。

インデントの訂正

autoindent’ や ’smartindent’ を設定すると、直前の行と同じインデントを使ふことができますが、自分でインデントを (’shiftwidth’ の幅ずつ) 增やしたり減らしたりする必要も多々あります。それには插入モードで CTRL-DCTRL-T を使ふと簡單です。

例へば、次のやうなシェルスクリプトを入力してみませう:

if test -n a; then
   echo a
   echo "-------"
fi

まづ、次のオプションを設定します:

:set autoindent shiftwidth=3

一行目を入力し、<Enter> を押して 2 行目を開始します:

if test -n a; then
echo

2 行目にはインデントが必要ですね。CTRL-T を押します:

if test -n a; then
   echo

插入モードの CTRL-T コマンドは、’shiftwidth’ の幅だけインデントを增やします。カーソルの位置は關係ありません。

2 行目を入力し、<Enter> を押して 3 行目を開始します。3 行目のインデントは問題ありません。<Enter> を押して最後の行を入力します。テキストは次のやうになりました:

if test -n a; then
   echo a
   echo "-------"
   fi

最後の行の餘分なインデントを削除するには CTRL-D 押します。これは ’shiftwidth’ の幅だけインデントを減らします。カーソルの位置は關係ありません。

ノーマルモードでは ">>" コマンドと "<<" コマンドで同樣の操作ができます。">" と"<" はオペレータなので、他のオペレータと同樣に、インデントを變更する範圍を 3 通りの方法で指定できます。次の組み合はせが特に便利です:

>i{

現在のブロックのインデントが增えます。變更されるのは {} の中だけで、{ と } 自體の行は變更されません。">a{" なら {} も含まれます。次の例では、カーソルは "‘printf’" の上にあります:

original text          after ">i{"             after ">a{"

if (flag)              if (flag)               if (flag)
{                      {                           {
printf("yes");             printf("yes");          printf("yes");
flag = 0;                  flag = 0;               flag = 0;
}                       }                          }

タブとスペース

tabstop’ の初期設定は 8 です。變更することはできますが、それはトラブルの元になります。他のプログラムはあなたが使用してゐるタブ幅を知ることができません。そのやうなプログラムでは、恐らくタブの幅は 8 であると假定されてゐるので、テキストが崩れて表示されてしまひます。また、ほとんどのプリンタはタブ幅を 8 で固定してゐます。したがつて、’tabstop’ を變更するのはお勸めしません。(他のタブ幅設定で書かれたテキストを修正したい場合は |25.3| を參照してください。)

プログラムをインデントする場合、8 桁單位でインデントするとすぐに畫面が埋まつてしまひます。しかしスペースが 1 つだけではインデントが目立ちません。多くのプログラマは (折衷して) 4 桁を好んで使ひます。

<Tab> の幅は 8 桁で、インデントを 4 桁にしたいといふことは、<Tab> 文字を使つてインデントすることはできないといふことです。そのやうなインデントには 1 つの方法があります:

  1. <Tab> とスペースを混在させる。<Tab> は 1 つでスペース 8 個分の幅になるのでファイルサイズの節約になります。スペース 8 個より <Tab> の方が入力も削除も簡單です。
  2. スペースだけを使ふ。違ふタブ幅を使ふ他のプログラムでもトラブルが起きません。

Vim はどちらの方法もサポートしてゐます。

タブとスペースを混在させる

タブとスペースを混在させる場合は特別な設定は必要ありません。初期設定でうまくいきます。

softtabstop’ オプションを設定すると編輯が少し樂になります。このオプションが設定されると、タブ幅が ’softtabstop’ の値に設定されたかのやうに、<Tab> キーが動作します。しかし實際にはタブとスペースが混在して使はれます。

次のコマンドを實行すると、<Tab> キーでカーソルが 4 桁ごとに進むやうになります:

:set softtabstop=4

行頭で <Tab> を押すと、スペースが 4 個插入されます。次に <Tab> を押すと、最初のスペース 4 個が削除されて <Tab> 文字が插入されます (つまりカーソルは 8 列目)。このやうに、スペースは可能な限り <Tab> 文字で置き換へられます。

バックスペースはその反對の動作になります。<BS> を押すと、’softtabstop’ の幅だけ削除されます。可能な限り <Tab> が使はれ、餘りはスペースになります。

次の圖は、<Tab> をいくつか入力してから <BS> を使つたときの樣子を示してゐます。"." はスペースで "——->" は <Tab> です。

type                      result
<Tab>                     ....
<Tab><Tab>                ------->
<Tab><Tab><Tab>           ------->....
<Tab><Tab><Tab><BS>       ------->
<Tab><Tab><Tab><BS><BS>   ....

同樣の動作は ’smarttab’ オプションを使つても實現できます。このオプションを設定した場合、インデントの入力のために <Tab> を押すと ’shiftwidth’ の幅が使はれ、何かの文字より後ろでは實際の <Tab> 文字が使はれます。ただし、<BS> の動作は ’softtabstop’ のときと同樣にはなりません。

スペースだけを使ふ

Tab 文字を一切使ひたくない場合は ’expandtab’ オプションを設定してください:

:set expandtab

このオプションをオンにすると、<Tab> キーでスペースが入力されるやうになります。つまり、<Tab> 文字と同じ量のスペースが插入され、<Tab> 文字は使はれません。

バックスペースキーはスペースを 1 つずつ削除するので、<Tab> を押した後でそれを削除するには <BS> を 8 回押さなければなりません。インデントの削除は CTRL-D を使ふと簡單です。

タブをスペースに變換する (あるいはその逆)

expandtab’ を設定しても、それ以前に入力されたタブ文字は影響を受けません。つまり、文章中のタブ文字はタブ文字のままです。タブ文字をスペースに變換したい場合は、":retab" コマンドを使つてください。次のやうに使ひます:

:set expandtab
:%retab

すべてのインデントがスペースに變換されます。ただし、何かの文字より後ろにある(インデント以外の) タブ文字はそのままです。それらのタブ文字も變換したい場合はコマンドに ! を付けます:

:%retab!

これは少し注意が必要です。なぜなら、文字列の中のタブ文字も變換されてしまふからです。文字列の中でタブ文字が使はれてゐるかどうかは、次の檢索パターンで確認できます:

/"[^"\t]*\t[^"]*"

文字列の中でタブ文字を使ふのはお勸めしません。トラブルを避けるためにも "\t" を使つてください。

同樣に、スペースをタブ文字に變換できます:

:set noexpandtab
:%retab!

コメントの整形

Vim のすばらしいところはコメントを解釋できるところです。コメントの整形を指示するだけで適切に處理してくれます。

例へば、次のやうなコメントがあるとします:

/*
* This is a test
* of the text formatting.
*/

最初の行に移動して次のコマンドを實行すると、コメントを整形できます:

gq]/

"gq" はテキスト整形のためのオペレータです。"]/" はコメントの末尾に移動するコマンドです。次のやうな結果になります:

/*
 * This is a test of the text formatting.
 */

各行の行頭が適切に處理されてゐますね。

ビジュアルモードでテキストを選擇してから "gq" を使ふ方法でも構ひません。

新しい行を追加したい場合は、眞ん中の行に移動して "o" を押します。次のやうな結果になります:

/*
 * This is a test of the text formatting.
 *
 */

行頭のスペースと * は自動的に插入されるので、そのままコメントを入力することができます。テキストが ’textwidth’ より長くなると自動的に改行されます。そのときも、行頭の * は自動的に插入されます:

/*
 * This is a test of the text formatting.
 * Typing a lot of text here will make Vim
 * break
 */

この機能を使ふには ’formatoptions’ の設定が必要です:

r插入モードで <Enter> を押したときに * を插入する
oノーマルモードで "o" または "O" を使つたときに * を插入する
cコメントを ’textwidth’ の幅で改行する

詳しくは |fo-table| 參照。

コメントの定義

コメントの書式は ’comments’ オプションで設定します。1 行コメントと三部コメント (開始、中閒、終端からなるコメント) は分けて處理されます。

ほとんどの 1 行コメントは特定の文字で始まります。C++ は //、メイクファイルは #、Vim は " です。例へば、C++ のコメントなら次のやうに設定します:

:set comments=://

コロンはフラグとコメント文字の區切りです。’comments’ の設定は次のやうな形式で指定します:

{flags}:{text}

この例のやうに、{flags} は空でも構ひません。

複數のアイテムを指定するときはコンマで區切ります。アイテムを複數指定できるので、同じファイルの中でいろんな種類のコメントを使ふことができます。例へばメールを返信するときに、相手のメッセージに ">" や "!" を付けて引用する場合は、次のやうに設定します:

:set comments=n:>,n:!

2 つのアイテムが設定されました。1 つは ">" で開始するコメント、もう 1 つは "!" で開始するコメントです。"n" フラグが使はれてゐるので、コメントを入れ子にできます。つまり、">" で開始する行は、">" の後ろに他のコメントを含んでゐても構ひません。この設定により、次のやうなメッセージを整形することができます:

> ! Did you see that site?
> ! It looks really great.
> I don't like it.  The
> colors are terrible.
What is the URL of that
site?

textwidth’ の設定を變更して (例へば 80 にして)、テキストを整形してみませう。ビジュアルモードでテキストを選擇してから "gq" を押します:

> ! Did you see that site?  It looks really great.
> I don't like it.  The colors are terrible.
What is the URL of that site?

違ふ種類のコメントテキストは混ざつてゐませんね。2 行目の "I" は 1 行目の末尾に入れることも可能ですが、しかし、1 行目は "> !" で始まり、2 行目は ">" で始まつてゐるため、それらのコメントは別のものであると判斷されます。

三部コメント (A THREE PART COMMENT)

C のコメントは "/*" で始まり、中閒には "*" が付き、"*/" で終はります。このやうなコメントは次のやうに設定します:

:set comments=s1:/*,mb:*,ex:*/

開始部分は "s1:/*" です。"s" は三部コメントの開始を示します。フラグとコメント文字 "/*" をコロンで區切つてゐます。フラグには "1" が指定されてゐますが、これにより中閒部分がスペース一個分、字下げされます。

中閒部分は "mb:*" です。"m" は三部コメントの中閒を示します。"b" フラグは、コメント文字の後ろに空白が必要であることを示します。これを指定しないと、"*pointer" などもコメントとして認識されてしまひます。

終端部分は "ex:*/" です。"e" は三部コメントの終端を示します。"x" は特殊なフラグです。中閒の * が自動的に插入された直後に "/" を押すと、餘計なスペースが削除されます。

詳細は |format-comments| を參照してください。


Next: , Previous: , Up: 目次   [Index]