さよなら again ~ Pharoに受け継がれなかったApple Smalltalk由来のマジカルなテキスト編集機能の記録 ~

  • 3
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Squeak は、アップルがゼロックスからライセンスを受けて同社の Lisa および Mac 向けに開発した Apple Smalltalk-80 をベースにして作られた Smalltalk 環境です。開発陣は、古い MC68000向けの仮想マシンを PowerPC向けに焼き直す際、デバッグを楽にするために新しい仮想マシンを Smalltalk のサブセットで記述しました。Smalltalk 環境内で動作を確認してからそれを C に変換してビルドするというこの開発方式により、他のプラットフォームへの移植も容易になり、その後、Mac だけでなく様々な OS やデバイスで動作するようになりました。

Apple Smalltalk-80 の処理系本体は、ゼロックス製の本家 Smalltalk-80 の v1(製品化された v2 の前のバージョン)に相当する仮想イメージ(処理系を構成する Smalltalk オブジェクト群を納めたファイル)が提供され使用されました。Apple の開発者は、この仮想イメージが動作する仮想マシンを構築する作業と同時に、独自の機能を環境それ自体にも追加しています。そうした Apple Smalltalk 独自拡張の中のひとつに again の in-place 検索機能があります。

again 自体もたいへん面白く便利な機能なのですが、残念ながらあまり知られていません。これはカット&ペーストなどのように Mac や Win に継承され、世に広められなかったためだと思われます。そんなこともあってか、現状では、本家 Smalltalk-80 v2 の流れをくむ VisualWorks でも、Squeak から派生した Pharo からも again はすっかりメニュー項目から排除されてオーソドックスな Find/Replace 機能に置き換えられてしまっています。

again は、直前の編集操作(文字の置き換えやテキストスタイルの変更)を、次の現われる同じ内容のテキストに in-place でダイアログなどを介さずに適用する機能です。ワープロなど備わっている検索・置換というと、検索キーを設定したり、置換後のテキストを指定したり、その他、細かな設定をダイアログボックスを使って事前に行なう手続きが現在主流ですが、この again ではダイアログボックスの介在なしに作業を進められるというメリットがあります。

▼置換(クリックで再生)
Smalltalk again #02 - find and replace

▼直前の属性変更の繰り返し適用(クリックで再生)
Smalltalk again #03 - find then change text size and style


Apple Smalltalk では、この again にちょっと手が加えられて、検索キーすら特別なダイアログボックスを介さずに指定できる工夫がなされています。

もちろん任意の検索キーを使った検索である以上、検索キーの入力は必須なわけですが、again の in-place 検索では思いついたら検索キーをどこでも適当な場所にキャレットを置いて挿入する、という大胆な方法をとります。その後、黄ボタンメニュー(今でいうコンテキストメニュー、右クリックメニュー)から again を選択する(Squeak では alt/cmd + j をタイプする)とそこから下流にあるテキストから検索キーに一致した部分が選択されます(なければ画面フラッシュ)。

直前に検索キーとして文中に挿入したテキストは検索のキーに設定されると同時に自動的に消されるので、編集中のテキストは汚されないというカラクリです。

言葉で説明すると面倒そうですが、次の動画見てもらえると動きがわかりやすいと思います。この動画では文頭に挿入していますが、場所は文章のどこでも OK です。

▼in-place 検索(クリックで再生)
Smalltalk again #01 - in place find

個人的には、again の真骨頂と思える大好きでいつも使うこの again の in-place 検索の機能なのですが、残念ながら Squeak の次のバージョンでは again の刷新にともなって、どうやら again の機能ではなくなってしまうみたいです。Apple Smalltalk-80 からひっそりと受け継がれてきたこの機能が消えてしまうのは、なんだか寂しいものがありますね。

なお今後 in-place 検索の振る舞いは、again とは別の find next (alt/cmd + g) に引き継がれる予定です。

この投稿は Smalltalk Advent Calendar 201520日目の記事です。