Squeak 5.1 をエディタ代わりに使い始めたので気付いたことを記録


ちょっとしたことを書くときに使うようにエディタ代わりに立ち上げている Squeak環境を 4.3J から久しぶりに 5.1 に更新して気付いたこと。


▼ duplicate があっさり殺されていた件

duplicate は、任意のテキストを選択→ alt-shift-d というキー操作で、選択操作の直前のキャレットの位置に選択テキストを複製して挿入する機能なのですが、よりよく使われるであろう debug it にキーアサイン奪われた上に、あろうことかメソッド(#duplicate:)ごと削除の憂き目をみていたようです。ペーストバッファを汚さないので個人的には気に入って使っていた機能だったので、Squeak 5.1 をエディタ代わりに使い始めて、まず最初にこのことに気がつきました。残念なことです。

カット、コピー、ペースト、アンドゥなどと違い、duplicate は後述の alt-j のモードレス検索や alt-e のスワップ機能(選択テキストを直前の選択テキストと交換)と共に、Mac/Win に継承されず、知らない人は一生知る機会もなく、ともすれば不要と思われがちな編集機能三兄弟なので、again のモードレス検索が殺されそうになったときにこちらも同時に気をつけておくべきでした。ということで、アラン・ケイがむかし Scheme で書いたものを移植したと言われる手書き認識(!?)が外されて以降、空席のままになっているっぽい alt-r に復活させました。

同様に、alt-shift-z を redo に奪われた #makeCapitalized: についても、あればあったで地味に便利なので、こちらも alt-shift-q あたりに復活しておきました。

▼ alt-shift-r、alt-shift-l による編集行もしくは選択行一括インデント/アウトデントのキーアサインが tab、shift-tab に変更&選択時のみ機能に制限

alt-shift-r、l が使えないことに気付いて、さすがにこの機能がなくなるとも思えないので、どうするのかと思ったら、1行以上の複数行を選択して tab 、shift-tab を押すのに変わっていました。alt-shift-r は行を選択しなくても機能していたので1行のみの場合に限っては不便だったのでその意味では改悪ですが、まあ許容範囲でしょうか。なお当該機能は今回のキーアサイン変更の前から行内の文字数が1文字だと機能しないバグがあるのでフィックスしておきました。


ちなみに空いた alt-shift-r、alt-shit-l はそれぞれ Recent Submissions 、File List の呼び出しに転用された模様です。alt-k(ワークスペース起動)、alt-t(トランスクリプト呼び出し)などと違い、テキスト編集中でも使える類似の「何かを起動する」タイプのキーショートカットの一覧はこちら。

    • alt-shift-l → File List
    • alt-shift-o → Monticello Browser
    • alt-shift-p → Preference Browser
    • alt-shift-r → Recent Submissions


alt-k、alt-t など、デスクトップをクリックするなどしてキーボードのフォーカスを明示的に外せば使えるショートカットを含め、PasteUpMorph>>#defaultDesktopCommandKeyTriplets で確認できます。


▼ again (alt-j) によるモードレス検索が alt-g に移動

これはすでに以前 Qiita で書いた通り。検索テキストをダイアログボックスなど UI をいっさい使わずに、おもむろにタイプした文字列を again (alt-j)で検索できる機能が Apple Smalltalk-80 時代からありSqueak にも継承されたこの機能を知って以来ずっと愛用していたのですが、Squeak 5.0 からこの使い方は again からは分離され、代わりに find the current selection again (alt-g) に引き継がれました。削除を含むテキスト置き換えの操作を繰り返す again 機能はそのまま alt-j(一括は alt-shift-j )で使えます。

余談ですが、新しい again では、一度 alt-j(alt-shift-j)をタイプしてヒットしたパターンが選択状態になってからもう一度 alt-j(同じく alt-shift-j) をタイプすると、改めて再度置換(同、一括置換)になるという二段階になったので要注意です。


▼ alt - 1〜4 のフォントサイズ変更にいつの間にかなんか変な機能が割り振られているw

もっとも alt-1〜5 のフォントサイズ変更の機能にはバグがあっていまままで正常に動作していなかったので潰されても文句は言えませんが…。^^; 新しい機能は、ブラウザのコードペイン(つまりメソッド定義時)での使用を念頭においた機能で、一行目にメッセージパターンとして宣言された仮引数をキャレットの位置に挿入する機能。何番目の仮引数を挿入するかが 1〜4 に対応しています(SmalltalkEditor>>#typeMethodArgument:)。

これはこれで便利な機能なのかもしれませんが、メソッド定義時以外は意味をなしませんし(実際、ワークスペースなどで普通の文章を打っているときに試したときは何が起こっているか分かりませんでした)、伝統的な alt-1〜4 によるフォントサイズ変更(オリジナルの Smalltalk-80 ではフォント変更の機能も兼ねていた)を潰してしまうのもけしからんことなので、コードペインのときだけ機能するように細工しました。せっかくなので alt-1〜5 も機能するように修正しました。ほぼ使わないとは思いますが、コードペインでも alt-shift-1〜4 で通常の alt-1〜4 の機能も使えるようにもしておきました。

▼ .txt のエンコーダーを utf8 に、.html で保存、読み込みの機能を拡張

エディタ代わりに使うときに、開いてからいちいちエンコーダーを utf8 に変えるのは面倒なので、.txt のときは自動的に UTF8TextConverter を選ぶように細工します。

FileList >> defaultEncoderFor: aFileName

    "This method just illustrates the stupidest possible implementation of encoder selection."
    | l |
    l := aFileName asLowercase.
"    ((l endsWith: FileStream multiCs) or: [
        l endsWith: FileStream multiSt]) ifTrue: [
        ^ UTF8TextConverter new.
    ].
"
    ((l endsWith: FileStream cs) or: [
        l endsWith: FileStream st]) ifTrue: [
        ^ MacRomanTextConverter new.
    ].

    (l endsWith: 'txt')
        ifTrue: [^ UTF8TextConverter new].

    ^ Latin1TextConverter new.


あと、これもすでに以前書いたものですが、せっかくフォントサイズを変えたりカラーを変えても保存する手段がないのも悲しいので、ワークスペースなどを右クリック→ more... → save contents to file... で .html 付きで保存したときに HTML 出力する機能と、それを読み込んだ(File List の右クリックで workspace with contents)ときプロパティを再現する機能を追加しました。

▼オーサーイニシャルのペーストが undo できないバグがあったので修正

alt-shfit-v でオーサーイニシャルをタイムスタンプ付きでペーストする機能があります。前述の duplicate を復活させている作業で気がついたのですが、どうも多段階 undo がデフォになって undo の機構が変わった影響か、duplicate 同様、オリジナルの実装のとおり #replace:with:and: だけだとうまく取り消し機能が働かないようです。実際のところ、オーサーイニシャルのペースト機能自体を意識して使うことはほぼないのですが、ペーストのつもりで誤ってこの機構が機能したときに undo できないと腹立たしいので直しておく方が精神衛生上よろしかろうと。


TextEditor >> pasteInitials: aKeyboardEvent
    "Replace the current text selection by an authorship name/date stamp; invoked by cmd-shift-v, easy way to put an authorship stamp in the comments of an editor."

    self insertAndCloseTypeIn.
    self openTypeIn.
    self replace: self selectionInterval with: (Text fromString: Utilities changeStamp) and: [self selectAt: self stopIndex].
    ^ true


▼TrueType フォントの選択可能サイズを追加する機能を追加

エディタとしてはあまり必要ありませんが、将来的にプレゼンツールとして使う場合に備えて。Font Chooser のフォントサイズ枠の右クリックメニューと StrikeFont fromUser のポップアップ中のサイズサブメニューの new size 選択時に機能します。

▼querySymbol:(候補がマルチキーワードセレクタ時)と argAdvance:(コロンの直後)が移動させるキャレット位置の調整

Squeak には Apple Smalltalk 時に実装された alt-q で入力しかけのクラス名、セレクタ、変数名等をシンボルから探して補完する query 機能がまだ残っています。最近、新しい undo/redo システムに対応するため再実装されたのですが、その際に複数のキーワードからなるセレクタの場合であってもキャレットが最後に移動してしまうバグが生じていて使いにくかったので修正しました。

ちなみに query はこんな感じに操作や機能します。
https://www.youtube.com/watch?v=jYOEZVnF9eI


また、この query による補完とコンボで用いると便利な advance という機能(次のコロン+スペースの位置にキャレットをジャンプさせる)もいつの間にかコロン+スペースではなく、コロンの直後にキャレットを移動させるように変更されてしまっていたので元に仕様にリバートしました。