割と知らない人が多い(と感じる)ので書いておきます。
Vimのオプションのほとんどはグローバルなオプションですが、バッファまたはウィンドウに対してローカルな値を持つオプションもあります。例えば'encoding'はグローバル、'tabstop'はバッファに対してローカル、'number'はウィンドウに対してローカルです。
これだけなら話は簡単なのですが、実はローカルな値を持つオプションは同時にグローバルな値も持っています。このグローバルな値は新たなバッファやウィンドウが作成されたときにローカルな値の初期値として用いられます。
普通、オプションの設定には:setを使いますが、:setlocalと:setglobalという派生系も存在します。各々の動作の違いは次の表の通りです。
| コマンド | グローバルな値 | ローカルな値 |
|---|---|---|
:set option=value |
値はvalueに設定される | 値はvalueに設定される |
:setlocal option=value |
値は変化しない | 値はvalueに設定される |
:setglobal option=value |
値はvalueに設定される | 値は変化しない |
つまり、ローカルな値を設定するときは:setlocalを使うべきです。そうしないと新たなバッファやウィンドウを開いたときに予期しない値が設定されることになります
例えば特定のバッファのタブ幅を変えようとしてset tabstop=20とした場合、新たなバッファを開いたときのタブ幅のデフォルトは20になります。これでは元に戻すためにset tabstop&としなければなりません。実際、私がVimを使い始めた頃はこの挙動でかなり混乱させられました。自分でインタラクティブに設定した分には許せるのですが、プラグイン等で似たようなことをされるとかなりアレです。
なお、ローカルな値を持つオプションの一部には「普段はグローバルなオプションとして振舞う。ローカルな値が設定されればそちらを使う」という派生系が存在します(:help global-local参照。ヘルプには「global or local to {x}」と記述されているオプション)。この種類のオプションについては、:setで値を設定するとグローバルな値のみが設定されます(上の表の動作と異なり、ローカルな値は設定されません)。ややこしいですが、この辺は知らなくても普通に使う分には困らないので忘れても構いません。
ちなみにVim 7.1 (パッチ1-221適用済み)でのオプションの数と種類は次の通りです。
| 種類 | 数 | 割合 |
|---|---|---|
| グローバル | 246 | 71% |
| ローカル | 85 | 25% |
| global-local | 14 | 4% |
| 合計 | 345 | 100% |
なお、一部のオプションは上記の原則に沿わない場合があります。特にローカルな値を持つオプションの一部は新規バッファ作成時にグローバルな値をコピーされません(詳細はsrc/option.cのbuf_copy_options()参照)。例えば'filetype'や'readonly'はコピーされません。これはコピーされる方が不便になるからだと思われます。