vim-users.jp

Hack #15: ローカルオプション

Posted at 2009/05/23
このエントリーをはてなブックマークに追加

ローカルオプション

Vim のオプションの中には、ローカルな値を持つものがあります。ローカルな値とはすなわち、特定の範囲にのみ適用される値を持つことができると言うことです。これを利用することで、例えば、普段のインデント幅は 4 だけれども Ruby のソースファイルを編集する場合のみ 2 に変更する、と言ったことが可能になります。全てのオプションはそのオプションの適用範囲によって以下のように分類できます。

global (グローバル)
グローバルな値のみを持ちます。
例: 'runtimepath'
local to buffer (バッファについてローカル)
バッファごとにローカルな値を持ちます。バッファごとなので、単一のバッファを複数のウィンドウで表示した場合でもローカルな設定は同じものになります。
例: 'tabstop'
local to window (ウィンドウについてローカル)
ウィンドウごとにローカルな値を持ちます。これにより、同じバッファでもウィンドウによって違った表示ができます。
例: 'number'

各オプションがどの種類のオプションかは、help に全て記載されています。

ローカルオプションのグローバルな値

ローカルなオプションにもグローバルな値は存在します。この値は、ローカルな値の初期値として使用されます。 例えば、 'tabstop' のグローバルな値が 8 の時に新しくバッファを作成すると、このバッファの 'tabstop' のローカルな値は 8 に設定されます。

オプション値の設定と確認

Hack #5: Vim のオプションの値 でオプションの設定には :set を使うと紹介しましたが、ローカルオプションを設定する場合にはこのコマンドは不適切です。なぜならば、このコマンドを使うとローカルな値と共にグローバルな値も変更されてしまうからです。前述の通りグローバルな値を変更してしまうとその後新たに作られるバッファやウィンドウの初期値が変更されてしまいます。これは多くの場合期待しない動作となります。

そのために Vim にはローカルな値とグローバルな値のみを変更するコマンド :setlocal:setglobal が用意されています。各コマンドでどのオプションの値が設定/表示されるかを表にすると以下のようになります。

コマンドグローバルな値ローカルな値{option}? で表示される値
:set変更される変更されるローカルな値
:setlocal変更されない変更されるローカルな値
:setglobal変更される変更されないグローバルな値

ローカルな値を持つグローバルなオプション

説明を単純にするために冒頭では省略しましたが、ローカルなオプションはあと 2 つあります。

global or local to buffer (グローバルまたはバッファについてローカル)
基本的にはグローバルなオプションですが、バッファごとにローカルな値も持てます。
例: 'tags'
global or local to window (グローバルまたはウィンドウについてローカル)
基本的にはグローバルなオプションですが、ウィンドウごとにローカルな値も持てます。
例: 'statusline'

このタイプのオプションでは、:set の挙動が以下のように変化します。:setlocal:setglobal は変化しませんが、比較のために再掲します。

コマンドグローバルな値ローカルな値{option}? で表示される値
:set変更される変更されない普段はグローバルな値、ローカルな値が設定されている場合はローカルな値
:setlocal変更されない変更されるローカルな値
:setglobal変更される変更されないグローバルな値

説明や挙動の変化を見ても普通のローカルなオプションと比べて違いが分かりにくいですが、普段はグローバルな値を共有しているという点で違います。

例えば、グローバルな値を持つローカルなオプションである 'statusline' のグローバルな値を変更すると、(ローカルな値の設定されていない)全てのステータス行の表示が変更されます。一方、グローバルな値を持たない普通のローカルオプションである 'number' のグローバルな値を変更しても、すでに開かれているウィンドウの 'number' の値は変わりません。これはウィンドウを作成したときに初期値が設定されているからです。

ローカルな値は設定された時のみ使用されます。空の値を設定すると再びグローバルの値を使用するようになります。

ローカルなオプションの値を初期化する

オプションの値を初期化するには :set {option}& ですが、これは初期値に設定するコマンドです。これとは別に、ローカルなオプションに現在のグローバルなオプションの値と同じ値を設定する方法があります。以下のようにします。

:setlocal {option}<

この方法でローカルなオプションはグローバルなオプションと同じ値になりますが、先ほどの global or local なオプションの場合ローカルな値が設定されるとグローバルな値が変更されてもそちらに追従しません。そのためには、ローカルな値を空にする必要があります。以下のようにします。

:set {option}<

これは global or local なオプションに対してのみ効果があります。特に文字列のオプションは :set {option}= とすることで空に設定することもできますが、文字列以外のオプションはこの方法で空にする必要があります。

例外

'filetype''modified' などの一部のオプションはバッファの作成時に値がコピーされません。一般的に考えてコピーされない方が自然なオプションについてはこうなっているようです。ほとんどの場合自然な動作になっているので、普段は意識する必要はありません。

thinca

もどる
blog comments powered by Disqus