GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Replacing.html ・ emacs-doc.conao3.com

33.23 バッファテキストの置換

以下の関数を使用して、現在のバッファ内のテキストの一部を置換できます。

関数: replace-region-contents beg end source &optional max-secs max-costs inherit

この関数は、現在のバッファの beg から end までの範囲を、source に含まれるテキスト(通常は文字列またはバッファ)で置き換えます。その際、バッファの場合はアクセス可能な部分のみが使用されます。

この関数は、現在のバッファ内のポイント、マーカー、テキストプロパティ、およびオーバーレイをそのまま保持しようとします。この動作が有用なケースの一つとして、外部のコード整形プログラムが挙げられます。こうしたプログラムは通常、整形後のテキストを一時バッファやファイルに書き出しますが、insert や delete-region を使用すると、これらのプロパティが破壊されてしまいます。

しかし、そうするためには、replace-region-contents が元のバッファの内容と source の内容を、計算コストの高いアルゴリズムを用いて比較する必要があり、その結果、単純な insert や delete-region に比べて処理速度が大幅に低下します。多くの場合、このような精緻な処理は不要であり、その場合は max-secs の引数に 0 を渡すことで、そのコストの高いアルゴリズムをスキップさせたいところでしょう。そうすれば、ポイントやマーカーをわずかに良好に保持しつつ、insert や delete-region と同等の速度で処理できるようになります。

こうした基本的な使い方に加え、バッファのアクセス可能な領域の一部をソースとして使用する必要がある場合、source はベクトル [sbuf sbeg send] にもなり得ます。この場合、バッファ sbuf の sbeg と send の間の領域が、ソースとして使用したいテキストとなります。

挿入したテキストに隣接するテキストの文字プロパティを継承させたい場合は、inherit 引数として nil 以外の値を指定できます。

コストの高い洗練された代替手段を利用したい場合、replace-region-contentsの実行時間を範囲内に収めるため、2つのオプション引数が用意されています。

max-secs は秒単位のハードバウンダリを定義します。これが指定され、かつ超過した場合は、delete-region および insert-buffer-substring にフォールバックします。

max-costs は差分計算の品質を定義します。実際のコストがこの上限を超える場合は、ヒューリスティックを用いて、より高速ながらも最適ではない解を提供します。デフォルト値は 1000000 です。

replace-region-contents は、非破壊的な置換が可能であれば t を返します。そうでない場合、すなわち max-secs を超えたか、あるいは過剰なメモリが必要となった場合は、nil を返します。

注:改良版置換アルゴリズムを使用する際、置換対象が文字列である場合、内部的に一時バッファにコピーされます。したがって、他の条件が同じであれば、source の引数として文字列ではなくバッファを渡すことが推奨されます。

場合によっては replace-region-contents が変更の性質を認識できず、オーバーレイやマーカーなどの情報が期待通りに保持されないことがあります。この点が重要であり、かつ変更内容について十分な知識がある場合は、これらの情報を手動で保持することが可能です。例えば、領域内の行をソートする場合、まず overlays-in と markers-in を用いて影響を受ける領域内のすべてのオーバーレイとマーカーを収集し、それらが見つかった行の説明を記録することから始めます。ソート済みの行を挿入した後、オブジェクトを本来の位置に戻すことができます。

関数: markers-in &optional beg end

現在のバッファ内で beg から end の間に見つかったすべてのマーカーのリストを返します。beg のデフォルト値は point-min であり、end のデフォルト値は point-max です。リスト内のマーカーの順序は規定されていないため、それに依存しないでください。