言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Squeak における Undo

Squeak にも Undo がある。歴史的事情があってかその実装はかなりねじくり曲がって見えるが、たまに助けられる程度には便利だ。その実装についてメモ。まず念頭に置くべき事は、画像オブジェクトの操作と、テキストの操作ではまったく異なった Undo が使われている事だ。特に、テキストの Undo 操作は相当ややこしい。

Morph における Undo

まずは簡単なほうから。Morph の Undo バッファは、self commandHistory でどのオブジェクトからでも呼び出す事が出来る。実装としては、WorldState にひとつの CommandHistory が割り当てられている。メニューから Undo が呼ばれると #undoOrRedoCommand より記憶しておいたコマンドを呼び出し、状態を元に戻す。状態を元に戻すためのコマンドは #rememberCommand: より登録する事が出来る。#rememberCommand: の sender を見ると、現在 Undo 可能な操作は10個程しか無い事が分かる。

テキストにおける Undo

テキストにおける Undo では、Paragraph の以下のクラス変数が使われる。

  • UndoParagraph - Undo 対象のパラグラフ
  • UndoInterval - 文字列の位置?
  • UndoMessage - Undo 時呼ばれるメッセージ
  • UndoSelection - 削除したテキスト
  • Undone - なぞ

これらの変数はかなり多くの場所から呼ばれているが、病んでいるのかかなりあての外れた動作をする。これを直すのは相当大変だという事が分かる。