For Development HEAD DRAFTSearch (procedure/syntax/module):

12.69 text.gap-buffer - ギャップバッファ

Module: text.gap-buffer

ギャップバッファは、編集可能なテキストを実装するのに便利なデータ構造です。

ギャップバッファは、「カーソル」を持つ文字のベクタと考えることができます。 カーソル位置への文字の挿入、もしくはカーソル位置の文字の削除はO(1)時間でできます。 ほとんどの編集APIは現在のカーソル位置を対象にします。

Function: make-gap-buffer :key initial-capacity

{text.gap-buffer} 新たなギャップバッファを作って返します。初期状態では中身は空です。

キーワード引数initial-capacityは、正の正確な整数でなければならず、 初期状態のバッファの大きさを指定します。バッファは必要に応じて自動的に拡張されるので、 この引数は単なるヒントです。例えば最初に大きな文字列を挿入することがわかっていれば、 あらかじめ大きなバッファを取っておくことで再アロケーションのオーバヘッドを避けることが できます。

Function: string->gap-buffer string :optional pos whence start end

{text.gap-buffer} 与えられた文字列stringを保持するギャップバッファを作って返します。

カーソルの初期位置は、デフォルトでは文字列の最後です。 poswhence引数で初期位置を変更することができます。 whenceはシンボルbeginningendで、posは whenceからのオフセットを表す正確な整数です。例えばposが10で whencebeginningなら、文字列の先頭から10番目の文字にカーソルが 置かれます。posが-1でwhenceendなら、文字列の最後から ひとつ手前の文字にカーソルが置かれます。poswhenceの組み合わせが 文字列をはみ出してしまう場合はエラーが投げられます。

省略可能なstartend引数は、ギャップバッファを作る前に 入力文字列の範囲を制限します。

Function: gap-buffer? obj

{text.gap-buffer} objがギャップバッファなら#tを、そうでなければ#fを返します。

Function: gap-buffer-copy gbuf

{text.gap-buffer} ギャップバッファgbufの新たなコピーを作って返します。内容およびカーソル位置は gbufと同じになります。

Function: gap-buffer->string gbuf :optional start end
Function: gap-buffer->generator gbuf :optional start end

{text.gap-buffer} ギャップバッファgbufの内容を文字列もしくは文字のジェネレータとして取り出します。 省略可能なstartendはバッファ内の文字インデックスを指定する非負の正確な整数で、 取り出す内容の範囲を制限します。

返ってきたジェネレータを最後まで読む前にギャップバッファの内容を変えた場合、 一貫性のある振る舞いは保証されません。

Function: gap-buffer-pos gbuf

{text.gap-buffer} ギャップバッファgbufの現在のカーソル位置を非負の正確な整数で返します。

Function: gap-buffer-pos-at-end? gbuf pos

{text.gap-buffer} 位置を表す非負整数posがギャップバッファgbufの末尾を差していれば#tを、 そうでなければ#fを返します。

Function: gap-buffer-capacity gbuf

{text.gap-buffer} ギャップバッファgbufに現在アロケートされているストレージの大きさを 文字数で返します。gbufに格納する文字がそれを越えたら、ストレージは自動的に拡張されます。

Function: gap-buffer-content-length gbuf

{text.gap-buffer} ギャップバッファgbufに現在格納されている内容の大きさを、文字数で返します。

Function: gap-buffer-gap-at? gbuf whence

{text.gap-buffer} whence引数はシンボルbeginningendのいずれかです。 ギャップバッファgbufの現在のカーソル位置がそれぞれバッファの先頭または末尾 である場合に#t,をそうでなければ#fを返します。

Function: gap-buffer-ref gbuf index :optional fallback

{text.gap-buffer} ギャップバッファgbufindex番目の文字を返します。indexが 範囲外の場合、fallbackが与えられればそれを返し、無ければエラーが投げられます。

Function: gap-buffer-set! gbuf index char

{text.gap-buffer} ギャップバッファgbufindex番目の文字をcharで置き換えます。 indexが範囲外の場合はエラーが投げられます。

Function: gap-buffer-move! gbuf pos :optional whence

{text.gap-buffer} gbufのカーソル位置をposに移動します。posは正確な整数でなければなりません。 poswhenceからの相対位置と解釈されます。whenceは シンボルbeginningcurrentendのいずれかです。 省略された場合はbeginningと同等です。

Function: gap-buffer-insert! gbuf content

{text.gap-buffer} contentは文字または文字列です。contentwおgbufの 現在のカーソル位置に挿入します。 カーソルは、挿入された内容の末尾へと移動します。

Function: gap-buffer-delete! gbuf size

{text.gap-buffer} gbufの現在のカーソル位置からsize文字を削除します。 sizeは非負の正確な整数でなければなりません。 sizeが現在の内容を越えてしまう場合はエラーとなります。

Function: gap-buffer-clear! gbuf

{text.gap-buffer} gbufを空にします。

Function: gap-buffer-replace! gbuf size content

{text.gap-buffer} これは(gap-buffer-delete! gbuf size)(gap-buffer-insert! gbuf content)を続けて実行するのと同じです。 sizeは非負の正確な整数でなければならず、 contentは文字か文字列でなければなりません。

Function: gap-buffer-contains gbuf str :optional gstart gend sstart send

{text.gap-buffer} 文字列strをギャップバッファgbufの中から探します。 見つかったら、その先頭の文字インデックスを返します。 見つからなかったら#fを返します。

省略可能引数startgendは、gbuf内で検索すべき範囲を 制限する整数インデックスです。デフォルトではバッファ全体が検索対象となります。 #fを渡すことでデフォルトの動作とすることができます。

省略可能引数sstartsendは、strから 検索文字列を切り出す整数インデックスです。 #fを渡すことでデフォルトの動作とすることができます。

Function: gap-buffer-looking-at? gbuf str :optional point

{text.gap-buffer} 整数インデックスpoint以降の内容の先頭が文字列strと一致する場合に #tを、そうでなければ#fを返します。 point#fか省略された場合は現在のカーソル位置が使われます。

Function: gap-buffer-edit! gbuf edit-command

{text.gap-buffer} これはギャップバッファgbufに対する編集を「リプレイ」するのに便利な手続きです。 edit-command引数は、次のいずれかの形のフォームです。

(i pos string)

stringpos位置に挿入 (<b>I</b>nsert)。

(d pos length)

pos位置からlengthj文字を削除 (<b>D</b>elete)。

(c pos length string)

pos位置からのlength文字をstringへと変更 (<b>C</b>hange)。

ただし、posはバッファ先頭からの文字位置を示す非負の正確な整数です。

この手続きは、加えた変更を元に戻す編集コマンドを返します。

この手続きの使用場面のひとつは、undo/redoリストの処理です。

(define buf (string->gap-buffer "Hello, World!"))

(gap-buffer-edit! buf '(d 0 5))
  ⇒ (i 0 "Hello")

(gap-buffer-edit! buf '(i 0 "Konnichiwa"))
  ⇒ (d 0 10)

(gap-buffer->string buf)
  ⇒ "Aloha, World!"

;; gap-buffer-edit!の戻り値を逆順に適用すると元に戻せる

(for-each (cut gap-buffer-edit! buf <>) '((d 0 10) (i 0 "Hello")))
(gap-buffer->string buf)
  ⇒ "Hello, World!"


For Development HEAD DRAFTSearch (procedure/syntax/module):
DRAFT