最終更新日 2002/08/24(Sat)

ナローイングでファイルの一部分だけ置換


ナローイング(Narrowing) とは?

ナローイング(narrowing)とは、 バッファの一部分だけを表示させて残りをアクセス不可能にする処理です。

例えば、ある関数で cnt というカウンタ目的の変数があったとします。 これをリファクタリングで wordCount という変数名に変更しようとして (つまり、意味の分かり易い名前に変えようとして)、置換をする場合を考えます。 そのファイルには他の関数があり、 その中には cnt という変数を使用しているかもしれません。 その関数が wordCount に変更されるとまずいでしょう。 そのため、一括して置換することはできません。 かといって一箇所ずつ置換するのも面倒です。

このような場合に、ナローイングによって、目的の関数だけを編集可能な状態にして、 一括変換を行なう訳です。 これによって置換してはまずいところまで置換してしまう事故を防止できます。 もちろん置換だけではなく、 バッファ全体を対象とする他の操作にも応用が可能です。

ちなみに、ナローイングの状態を元に戻すことをワイドニング(widening)と呼びます。

ナローイングの実行

ある関数の中の変数名を変更する場合の例で見てみましょう。 以下の例では関数 foo の中に cont が沢山使用されています。 この関数で contcount に変更しようと考えとします。 もし一括で置換すると、他の関数の cont を含むものまで変換されてしまいます。 continue とか使われているかもしれません。 これをナローイングを使って置換してみます。

// 略

int foo()
{
  for (int cont = 0; cont < 10; cont++) {
    // 略 (cont が沢山出てくる)
  }
}

// 略

まずは、リージョンを選択します。この例では関数 foo 全体をリージョンとして選択します。

リージョンを選択したら、C-x n n とします。

すると、初期状態では Meadow は以下のようなメッセージを出力します。 後で説明しますので、 とりあえず今回はスペースキーを押して下さい。

You have typed C-x n n, invoking disabled command narrow-to-region:
Restrict editing in this buffer to the current region.
The rest of the text becomes temporarily invisible and untouchable
but is not deleted; if you save the buffer in a file, the invisible
text include in the file. C-x n w makes all visible again.
See also `save-restriction'.

You can now type
Space to try the command just this once, but leave it disabled,
Y to try it and enable it (no questions if you use it again),
! to try it and enable all commands in this session, or
N to do nothing (comand remains disable).

するとナローイングが実行され、 以下のようにリージョン部分のみが表示されるようになります。 表示されていない部分も削除されなくなった訳ではなく、表示されたままです。

int foo()
{
  for (int cont = 0; cont < 10; cont++) {
    // 略 (cont が沢山出てくる)
  }
}

以下のようにモードラインに Narrow となっていることから、 ナローイングをしていることが分かります。

[--]S\-- foo.cpp      (C++ Encoded-kbd Narrow)------ALL--------------

この状態ですべて置換してしまいます。置換の対象となるのは、 現在表示されている部分のみです。 一括で置換しても非表示の部分は置換されません。

置換が終了したら、 C-x n w(widen) で元に戻します。

// 略 (ここは置換されません)

int foo()
{
  for (int count = 0; count < 10; cont++) {
    // 略 (cont が count に全部置換されている)
  }
}

// 略 (ここは置換されません)

キー操作

ナローイング関連のキー操作は以下のようになっています。

ナローイングの操作
キー操作
C-x n n リージョンに対してナローイングする (narrow-to-region)
C-x n w ナローイングした状態から元に戻す (widen)
C-x n p ページに対してナローイングする (narrow-to-page)
C-x n d 関数の定義に対してナローイングする。 (narrow-to-defun)
(関数でないところで実行すると、 近くの関数に対してナローイングする)

コマンドの無効化

Emacs のコマンドには、 間違って実行してしまうとユーザーが混乱しそうな機能がいくつか存在します。 ナローイングも誤操作で実行してしまうと、 現在のリージョン以外の部分がすべて非表示になってしまうので、 知らないユーザーはきっとビックリするでしょう。 Emacs ではそのようなコマンドのいくつかは無効になっていて、 誤動作でいきなり実行されてりしないようになっています。

無効になっているとはいっても、 全く使えない訳ではなく、そのコマンドを実行しようとするときに、 ユーザーにどうするかを問い合わせます。 以下のメッセージはその問い合わせのメッセージだった訳です。

You have typed C-x n n, invoking disabled command narrow-to-region:
Restrict editing in this buffer to the current region.
The rest of the text becomes temporarily invisible and untouchable
but is not deleted; if you save the buffer in a file, the invisible
text include in the file. C-x n w makes all visible again.
See also `save-restriction'.

You can now type
Space to try the command just this once, but leave it disabled,
Y to try it and enable it (no questions if you use it again),
! to try it and enable all commands in this session, or
N to do nothing (comand remains disable).

このときの操作は以下のようになります。

Y を選択すると、 以下のように次回起動時以降も有効にするかどうかを尋ねられます。

Enable command for the future editing sessions also? (y or n)

これで、y を選択すると、次回起動時にも有効になります。 Meadow は次回起動時にコマンドを有効にするために、 .emacs に以下のような行を追加します。

(put 'narrow-to-region 'disabled nil)

n を選択した場合は、.emacsは変更されませんが、 Meadow を終了するまではコマンドは有効になります。 つまり、! と同じになる訳です。

なお、コマンドの無効化はユーザによる操作を無効にするだけで、 emacs-lisp からの呼び出しについては何の影響もありません。 普通に実行されます。モードによってはナローイングを活用するモードもあります。