vieweditattachhistorytopchangessearchhelp

Genie その2(ジェスチャーにコードを割り当てる)

カット、コピー、ペースト、取り消しなどテキスト編集周りを整備してみましょう。--sumim - 2003-01-17, 12:48:53

テキスト編集周り,了解です.--人狼 - 2003-01-17, 14:11:39

まず、コピーやペーストなどが誰へのどんなメッセージ送信で行なわれているのかを調べてみましょう。復習を兼ねてどんなふうにして調べると簡単か分かりますか?--sumim - 2003-01-17, 17:00:33

コピーであれば,恐らくメッセージ名に「copy」が含まれているだろうと当たりをつけてcmd-Wでは如何でしょうか?--人狼 - 2003-01-17, 17:17:04

ん〜、まあそれはある意味正しい姿なのですが、不良 Squeaker はメニュー項目(a MenuItemMorph)をインスペクトして、target と selector と arguments を覗いてなるほどね、と済ませてしまいます(^_^;)。--sumim - 2003-01-17, 17:23:34

>不良Squeakerはメニュー項目(a MenuItemMorph)をインスペクトして
あ,そうですね.その方法がありましたねぇ.う〜ん,そっちは気付きませんでした.こうして僕も悪の道に踏み込んで行くのですね(笑)^^人狼 - 2003-01-17, 17:31:27

では、Sqewton ではアシスト機能なんかいらんのだぜ、ゴルァ…というささやかな(<弱気)例として print-it をジェスチャーで実装してみましょう。まず、くだんの方法で、黄ボタンメニューが print-it で誰にどんなメッセージを送信しているのかを調べてみましょう。--sumim - 2003-01-17, 17:34:05

>誰にどんなメッセージを送信しているのか
え〜っとa Workspaceに#(#printIt a PluggableTextMorph(hogehoge))を送信しているのですか?--人狼 - 2003-01-17, 17:50:20

メニュー自身は a Workspace に対して、perform:orSendTo: というセレクタに #printIt と a PluggableTextMorph を引数にして送っているのですが、StringHolder >> #perform:orSendTo: を見るとおわかりいただけるように、ワークスペースは単なる仲介者にすぎなくて、結果的には a PluggableTextMorph に対して、printIt を送っているだけだということが分かります。引数も無いし、なんか Genie コードフレンドリっぽいですね(笑)。--sumim - 2003-01-17, 17:55:05

でも,なんか変だなぁ.printItをimplementしているのはParagraphEditorとPluggableTextMorphだけですよねぇ.でも,メニューをinspectすると,targetはa Workspaceですし…--人狼 - 2003-01-17, 17:57:38

上の説明を是非(^_^;)。--sumim - 2003-01-17, 17:59:00

でも、こうした状況(selector を見落としている)でそうした疑問を持つことは大切だと思います。--sumim - 2003-01-17, 18:00:39

説明を拝読しました.了解しました.targetにselectorをargumentsを引数に送っているのですね.(つーか気付け>自分)で,StringHolder >> #perform:orSendTo:の「or」の意味もなっとく.--人狼 - 2003-01-20, 10:42:02

したがって、現在注目している a PluggableTextMorph を特定するメッセージ式がかければ、あとはそれに printIt を送るだけなので簡単…ということになります。--sumim - 2003-01-20, 12:40:46

これも復習ですが、Wiki 的機能の実装のときの応用でなんとかできませんかね。--sumim - 2003-01-20, 12:42:46

>応用でなんとかできませんか
今一つすっきりしないです(汗)
|workspace targetmorph|
workspace _ (SystemWindow windowsIn: ActiveWorld satisfying: [ :win | win isActive ]) first.
targetmorph _ (workspace submorphs select:[:mrph | mrph isKindOf: PluggableTextMorph ]) first.
^targetmorph

と言うのを考えてみました.最後の行は,targetmorphを使っておかないと怒られるので,とりあえず付けてみました.--人狼 - 2003-01-20, 15:09:17

>targetmorphを使っておかないと怒られる
怒られる…というのは?--sumim
- 2003-01-20, 17:06:46

すみません。ワークスペースのときのアプローチよりもっと簡単で直接的な方法がありました(^_^;)。適当なジェスチャーコードで、self をインスペクトしてみてください。具体的には、
##
self inspect
です。ここにジェスチャーを受け付けたターゲットを束縛している target があるので、これが a PluggableTextMorph であるかどうかを判断すればよいだけでした。ごめんなさい。--sumim
- 2003-01-20, 17:12:06

したがって、簡単には
#printIt#
(target isKindOf: PluggableTextMorph) ifTrue: [target printIt]
で目的は果たせるはずです。ところがこれだとちょっと(いやかなり?)問題があります。--sumim
- 2003-01-20, 17:21:20

同じワークスペースでも、ジェスチャーの場所によって機能するときとしないときがあり、さらには a TextMorph では完全に機能しないはずです。--sumim - 2003-01-20, 17:23:20

>怒られる…というのは?
^targetmorphの無い状態では“targetmorph appears t be unused in this method.”と言われてしまうのです.--人狼 - 2003-01-22, 15:11:41

>ワークスペースのときのアプローチよりもっと簡単で直接的な方法
ありゃ,そうですか.selfのインスペクト…確かそんなジェスチャーが残っていたはず.あ,ありますあります.--人狼 - 2003-01-22, 15:14:53

>同じワークスペースでも、ジェスチャーの場所によって機能するときとしないとき
あれれ?ワークスペースの中では全然受け付けてもらえないです.必ず文字入力になってしまいます.なぜだろう?--人狼 - 2003-01-22, 15:16:52

>targetmorph appears to be unused
定義しないって選択はなしですか?--sumim
- 2003-01-22, 15:48:27

>あれれ?ワークスペースの中では全然受け付けてもらえない
たぶんそれが“かなり問題”というやつです。じつはこのジェスチャーコード、ワークスペースなどで入力済のテキストの終わりのさらに下の余白部分では動作するのですが、文字が入力されている場所の近く(たとえばすぐ右側とか、文字の直上とか)では動作しません。それは何故でしょう…というのが課題です。ちなみに a TextMorph でも動作しないですよね?--sumim
- 2003-01-22, 15:51:16

ちなみに登録する辞書を間違えている…ということはないですよね? いままで、StarMorph の登録とかをしていた PasteUpMorph 用ではないほうの辞書です。念のため、
#printIt#
(target inspect isKindOf: PluggableTextMorph) ifTrue: [target printIt]
としたときに、当該ジェスチャーでインスペクタが開くことを確認してください。--sumim
- 2003-01-22, 15:57:13

>定義しないって選択はなしですか?
えっと,ワークスペース変数を使うと言う事ですか?Genieにメッセージ式として組み込む為に,一時変数を宣言しなくちゃ…と思ったのですが.何か誤解しているのでしょうか?--人露 - 2003-01-22, 16:10:39

>さらに下の余白部分では動作する
そう言う事ですか,それは失礼しました.もう少し大胆に下で掻けば良かったのですね.
>a TextMorphでも動作しない
はい,ダメでした.--人狼 - 2003-01-22, 16:12:58

>ちなみに登録する辞書を間違えている
いや,それは大丈夫です.Exported nameがTextの方でやっています.んでは,課題を考えて参りまする.--人狼 - 2003-01-22, 16:13:44

>Genieにメッセージ式として組み込む
いえ。それでも良いと思うのですが、最後のメッセージ式の返値に printIt を送るだけでいいかなぁ…とも。--sumim
- 2003-01-22, 16:47:47

>最後のメッセージ式の返値に printIt を送るだけでいい
確かにそうでした.何を勘違いしていたのでしょう?>自分--人狼 - 2003-01-23, 09:23:13

>最後のメッセージ式の返値に printIt を送るだけでいい
あれれ?targetmortph printItとすると,VMが反応しなくなるのですが?--人狼 - 2003-01-23, 09:25:30

>最後のメッセージ式の返値に printIt を送るだけでいい
あ,ひょっとして…
((workspace submorphs select:[:mrph | mrph isKindOf: PluggableTextMorph ]) first) printIt
かな?……ダメか(汗)やっぱりVMが固まります.--人狼 - 2003-01-23, 09:44:09

#printIt#
(SystemWindow windowsIn: ActiveWorld satisfying: [ :win | win isActive ]) first submorphs inspect
の結果はどうなりますか?--sumim
- 2003-01-23, 11:05:02

ちなみにどこで評価していますか? ワークスペースですか? Genie コードとしてジェスチャー駆動でですか?--sumim - 2003-01-23, 11:09:11

>結果はどうなりますか?
Arrayのインスペクタが表示されます.selfは#(an AlignmentMorph(xxxx) a PluggableTextMorph(xxx))です.--人狼 - 2003-01-23, 11:10:31

>ちなみにどこで評価していますか?
ワークスペースで評価した場合は,VMが無反応になります.(OS XにおけるSqueakアプリケーションのメニューは生きてます)また,ジェスチャーとした場合は固まりはしませんが,何もおきませんでした.--人狼 - 2003-01-23, 11:12:39

ワークスペースで printIt や doIt を送るメッセージ式を評価(do-it、print-it)すれば、当然おかしなことになりますよ(^_^;)。--sumim - 2003-01-23, 11:13:35

ワークスペースではあくまで、ターゲットの特定に留めましょう。--sumim - 2003-01-23, 11:15:02

話をもとに戻しましょう。Wiki ライクな機能拡張のときの応用で printIt のレシーバを特定する話は忘れてください。もう一度謝ります。よけいなことをさせてしまいました。ごめんなさい。Genie コードで target に束縛されるオブジェクトがそれに当たりますので、これを使いましょう。これで簡単には
#printIt#
(target isKindOf: PluggableTextMorph) ifTrue: [target printIt]
で動作するはずなのですが、うまくゆくときと駄目なときがあります。この違いを調べるために、target をインスペクトしてみてください。
#printIt#
(target inspect isKindOf: PluggableTextMorph) ifTrue: [target printIt]
インスペクタが開けばこのコードはきちんと駆動しているのに pirntIt は送信されていないことになります。このときの target は何になっているのでしょうか、なぜそうなるのか、を考えていただくのが課題です。--sumim
- 2003-01-23, 11:20:46

>ワークスペースでprintItやdoItを送るメッセージ式を評価
えっと,これがどうして「当然おかしなこと」になるのかがピンと来ないのですが,本題とはずれますので追々の疑問と言う事で.--人狼 - 2003-01-23, 11:37:54

>話をもとに戻しましょう
了解です.いや,そんな謝って頂かなくても.こちらこそ,引きずってしまい済みませんでした.
>インスペクタが開けばこのコードはきちんと駆動
インスペクタはちゃんと開きました.えっと,ダメになっていたような場所でジェスチャーを動かすと,a TextMorphForEditViewと言う初めてお目にかかりますなオブジェクトに遭遇しました.正常動作していた当たりではa PluggableTextMorphになっています.--人狼 - 2003-01-23, 11:47:05

a TextMorphForEditView とは端的には何者でしょうか。--sumim - 2003-01-23, 11:56:08

ジェスチャーを描いたときうまくいかない場所を cmd-クリックしてゆくと見えてきます。うまく行く場所では想定どおり a PluggalbeTextMorph が最終的に選択されます。ところが、うまくいかない場所では、さらにサブモーフがあり、それが a TextMorphForEditView となります。緑ハローで複製をとってみると分かりますが、入力中の文字列の表示を担当するのがこのモーフで、名前から分かるように TextMoprh のサブクラスです。--sumim - 2003-01-23, 12:52:06

>a TextMorphForEditViewとは端的には何者
ちょっと別件でもたついてる間に答えを示して頂いてしまいました.お手数をおかけして済みません.
>うまくいかない場所では、さらにサブモーフがあり
はい,たしかにそこにa TextMorphForEditViewがありました.緑ハローで複製を取ったら,そっちにもちゃんと入力出来ました.入力中の文字列の表示を担当するんですね.これのownerがTransformMorphって言うのも謎です.--人狼 - 2003-01-23, 13:04:53

TransformMroph はモーフを回転させたときに現われるのですが、よく調べていないので知りません。いろいろな問題の原因にもなっているのでそのうち…とは思っているのですが(^_^;)。で、話を戻すと、ここでは a TextMorphForEditView にも、a PluggableTextView に printIt を送ったときと同じ仕事をさせれば解決…となるはずですね。ところが、TextMorph は printIt が理解できません。--sumim - 2003-01-23, 13:26:01

では、TextMorph では printIt ができないか、というとそういうこともないようです。Supplies フラップから Text を取り出し、3 + 4 などと入力して print-it してみてください。黄ボタンメニューが出せないので、このメニュー項目を選択しての実行はできませんが、キーボードショートカットでは大丈夫なはずです。このしくみを調べれば、TextMorph でも TextMorphForEditView でも動作するコードが組めそうですね。--sumim - 2003-01-23, 13:28:12

>いろいろな問題の原因にもなっているのでそのうち
了解しました.見慣れぬ物があったので気にしただけです.済みません.問題そのもに関係無いみたいですので忘れておきます.おっしゃる通り,a TextMorphForEditViewがprintItを送った時の仕事をしてくれれば良いと言う事になりそうです.--人狼 - 2003-01-23, 13:43:03

>3 + 4 などと入力してprint-it
確かに動いています.7が帰ってきました.と,言う訳でこの仕組みを調べてみます.--人狼 - 2003-01-23, 13:43:56

ワークスペースやテキストモーフで self halt を print-it したときに現われるコンテキストスタックを観察すると参考になると思います。--sumim - 2003-01-23, 14:19:25

>ワークスペースやテキストモーフでself haltをprint-it
さっきから眺めているのですが,あまり違いが見つかりません.TextMorphで行った場合はTextMorph(Morph)>>#handleFocusEvent:とTextMorph(Morph)>>#handleEvent:の2行が先頭にありますが,そこから後ろのイベントチェイン(と言うのでしょうか?)はほぼ同じに見えます.「ほぼ」と申し上げたのは,a TextMorphのスタックではTextMorph>>#hogeが,ワークスペースのスタックではTextMorphForEditView>>#hogeとそれぞれ違うからです.とは言え,TextMorph>>#keyStrokeまたはTextMorphForEditView>>#keyStrokeの後はともにTextMorphEditorになっていますので,その先は同じかと思われます.
肝心なのはTextMorphEditor>>#evaluateSelectionからCompiler>>#evaluate:in:to:notifying:ifFail:のところだろうとは思うのですが…ここで止まってしまいました.--人狼 - 2003-01-23, 14:54:48

evaluateSelection 以降は print-it の処理なので、その手前までが知りたいことになります。ようするに printIt を理解できない a TextMorph や a TextMorphForEditView が printIt を誰に送っているか、ということが分かればよいわけです。答えはすでに述べられているように a TextMoph や a TextMorphForEditView には a TextMorphEditor というエディタが editor というインスタンス変数に束縛されていて、これに printIt を送っているように思われます。したがって、話を戻すと、target が a PlugableTextMorph ならそのまま printIt を送り、a TextMorph か a TextMorphForEditView なら、その editor に printIt を送ればよいことになります。TextMorph の editor へは editor というセレクタでアクセスできますので(TextMorph >> #editor)これを用いて、
#printIt#
((target isKindOf: PluggableTextMorph)
	ifTrue: [target]
	ifFalse: [target editor]) printIt
と書けます。これで理屈ではどこでジェスチャーしても printIt されるはず…なのですが、どうも描画がおかしいようです。--sumim
- 2003-01-23, 15:22:46

そこで描画の更新がきちんと行なわれる a PluggableTextMorph に printIt が送られたときのコンテキストの流れをみてみましょう。cmd-p で print-it してしまうと、かならず、a TextMorphForEditView が応答してしまうので、この場合は self halt を黄ボタンメニューの print it で print-it します。--sumim - 2003-01-23, 15:38:37

>evaluateSelection以降はprint-itの処理
確かにおっしゃる通りです.済みません.Compilerがどうとかやってもダメですね.問題は「誰に」printItを送っているかでしたね.それであればTextMorphEditorになりますね.a TextMorph>>#editorを利用して,a TextMorphEditorにprintItを送るわけですね.なるほど.描画がおかしいとおっしゃっていらっしゃるのは,「 ''」のようになってしまう事を指していらっしゃいますか?--人狼 - 2003-01-23, 15:38:49

>描画がおかしいとおっしゃっていらっしゃるのは,「 ''」のようになってしまう事
いえ、ちがいます。何も起こっていないふうで、実は画面を書き換えるイベントを他から与えて(たとえばデスクトップのクリックとか)やるとちゃんと pirnt-it されている(たとえば、3 + 4 なら 7 が選択された状態になっている)ことを示します。--sumim
- 2003-01-23, 15:41:26

>a PluggableTextMorph に printIt が送られたときのコンテキストの流れをみてみましょう
あるいは、PluggalbeTextMoprh >> #printIt でなにをしているかを観察します。--sumim
- 2003-01-23, 15:50:08

>PluggalbeTextMoprh>>#printItでなにをしているか
textMorph editor selectFrom: selectionInterval first to: selectionInterval last.
self scrollSelectionIntoView.

あたりが怪しそうです.--人狼 - 2003-01-23, 16:23:52

またまたしくじりましたかね。PluggalbeTextMoprh >> #printIt はとくに複雑なようです。PluggalbeTextMoprh >> #cut なんかを代わりに見てみていただけますか? こちらはシンプルでわかりやすいと思います。--sumim - 2003-01-23, 16:29:27

>こちらはシンプルでわかりやすいと思います
すみません,またしくじったようです>自分.情けなや.TextMorph>>#handleEdit:ですね.--人狼 - 2003-01-23, 16:43:33

です(^_^;)。これをかましてやれば画面描画は大丈夫そうなので試してみましょう。
#printIt#
(target isKindOf: PluggableTextMorph)
	ifTrue: [target printIt]
	ifFalse: [target handleEdit: [target editor printIt]]
こんなんでいかがでしょうか。--sumim
- 2003-01-23, 17:13:08

もっとも、PluggableTextMoprh >> #printIt も必要なくしてあれほど複雑なわけではないので、たぶんいろいろと問題はあるかと思いますが、まあそれはおいおいということで。--sumim - 2003-01-23, 17:14:53

これで、doIt、cut、copy(copySelection)、paste、undo などは同様に実装可能になりますが、printIt が2ヶ所あるので、変更箇所をひとつにしぼれるとコードをコピペするとき便利かな…と思いますよね。思ってください(笑)。そこで、printIt というメッセージ送信をプログラマブルにしてみます。具体的には、メッセージセレクタ(#printIt)を一時変数に束縛して、そのセレクタを使ったメッセージ送信を perform: というセレクタを使ったメッセージ式で表現します。
#printIt#
| selector |
selector _ #printIt.
(target isKindOf: PluggableTextMorph)
	ifTrue: [target perform: selector]
	ifFalse: [target handleEdit: [target editor perform: selector]]
という具合です。--sumim
- 2003-01-23, 17:22:22

これで selector への代入部分のシンボルを書き換えるだけで別のメニューコマンドのための機能にすることができます。しかし、こうなると、ジオングの足も使いたくなりますよね。なってください(笑)。同じコードで冒頭のコード名を変えるだけでそれ用のコードになるとしたら便利ですよね。--sumim - 2003-01-23, 17:26:27

そこで、適当なジェスチャーをまたこしらえて、#myName#self inspect してみます。割り当てたジェスチャーでインスペクタを呼び出したとき、どこかに myName が見つかりますでしょうか…。--sumim - 2003-01-23, 17:33:03

>これをかましてやれば画面描画は大丈夫そう
大丈夫でした.なるほど.sumimさんがお書きになっていらっしゃるように,確かにcutとprintItの時では複雑さが違いますね.まぁ,おいおい.--人狼 - 2003-01-24, 10:15:07

>変更箇所をひとつにしぼれるとコードをコピペするとき便利かな
確かにその方が便利ですよね.それに間違いも減らせますし,その方が好ましいですよね.そこで,selectorと言う一時変数にメッセージセレクタを束縛して,分岐先のコードでは一時変数を参照しているのですね.--人狼 - 2003-01-24, 10:17:54

>同じコードで冒頭のコード名を変えるだけでそれ用のコードになるとしたら便利
えぇ,それはもう便利です.ジオングの足でもなんでも使い道があるのなら,使わない手は無いと言うことで.--人狼 - 2003-01-24, 10:18:56

>どこかに myName が見つかりますでしょうか
CRGestureのCRLookupResultに見つかりました.--人狼 - 2003-01-24, 10:19:56

そうですね。正確には、インスペクトした a CRGesture(self に束縛)の lookupResult に束縛されている a CRLookupResult の 一番目の要素の char に束縛されている a CRChar の string の 文字列として、ですよね?(ただし前後に # 付きの #myName# +コード)。--sumim - 2003-01-24, 12:30:31

loockupResult はある理由で Genie コード中で直接参照できますので、問題は a CRLookupResult の char ですが、これも幸い、CRLookupResult >> #char でアクセスできますので、
#myName#
lookupResult first char inspect
としてこのコードを適当なジェスチャーで起動すると、インスペクタの内容から string で Genie コード名を参照できていることが分かります。--sumim
- 2003-01-24, 12:33:51

問題は前後の # をどうやって削除するかですね。ま、とりたてて問題というほどのこともないのですが、String と仲良くするためにちょっと課題にしてみましょう。ここに '#myName#'(言うまでもありませんが myName 部分は任意)という文字列(a String)があります。この前後から # を除いた文字列を返すメッセージ式、もしくはメッセージ式列を記述してみてください。--sumim - 2003-01-24, 12:36:49

a String が受け付けることのできるメッセージの一覧は、String を browse-it して、メッセージペインの browse protocol で呼び出せます。文字列の加工は accessing 、copying カテゴリのメソッド役立つと思います(ま、これでも結構な数になりますが、楽しいメソッドもあるのでこれを機会に捨て目を利かせてみてください)。--sumim - 2003-01-24, 12:41:42

>正確には、インスペクトした
そうですね,失礼しました.おっしゃる通りです.…と思ったのですが,一番目の要素と言うのは,これが配列に見えるから判るのですが,charと言うのは?--人狼 - 2003-01-24, 13:40:25

>このコードを適当なジェスチャーで起動する
はい,大丈夫です.受け取れています.--人狼 - 2003-01-24, 13:41:32

>題は前後の#をどうやって削除するか
えぇっと,a Stringの場合でしたら,
'#myName#' copyReplaceAll: '#' with: ''
で出来るかと.これを先程の例で使おうと思うと,如何にしてCRCharからa Stringを取り出すか,と言うところではまってます.--人狼 - 2003-01-24, 13:51:54

>一番目の要素と言うのは,これが配列に見えるから判るのですが,charと言うのは?
インスペクタで、lookupResult のところをダブルクリックすると、a CRLookupResult をインスペクトできます。そこで要素 1 をダブルクリックすると a CRChar がインスペクトできて、さらにその char というインスタンス変数をダブルクリックすると a CRChar の string というインスタンス変数に '#myName#' が束縛されているのがわかります。--sumim
- 2003-01-24, 14:17:33

>如何にしてCRCharからa Stringを取り出すか
そうですね、追記しておきましたがおっしゃるとおり a CRChar のさらに string に目的の文字列は束縛されているようです。でもこのインスタンス変数 string は、CRChar >> #string でゲットできそうなのですが、何か他に問題がありそうですか?--sumim
- 2003-01-24, 14:32:47

>CRCharのstringというインスタンス変数に'#myName#' が束縛されている
実は,まさにここでず〜っと頭を捻っていました.a CRCharのselfは#myName#ですが,stringは'#myName# self inspect'なのです.ですから,#myName#だけをどうやって取得しようかなぁ…と.--人狼 - 2003-01-24, 15:13:08

なるほど。すっかりとちくるっていました(^_^;)。失礼いたしました。まあ、いろいろと方法はありますが、lookupResult first char printString が簡単でいいのではないでしょうか。--sumim - 2003-01-24, 15:34:31

もっと直接的には lookupResult first char hearderString とか。--sumim - 2003-01-24, 15:40:28

まああと、変わり種としては
('#myName# self inspect' findBetweenSubStrs: '#') first
こんなのとか。いや、それを言うなら
('#myName# self inspect' findTokens: '#') first
かな…(^_^;)。
--sumim
- 2003-01-24, 15:47:21

>lookupResult first char printString が簡単
う〜ん,ここまで探し切れませんでした.有り難うございます.んで,んじゃ,こんなのはどうだろうと思って
#myName#
lookupResult first char printString copyReplaceAll: '#' with: '' inspect
等と書いてみたのですが,開くインスペクタは確かにa Stringなのですが,''でした.う〜ん.
#myName#
lookupResult first char printString  inspect
では明らかに#myNameだったんだけどなぁ.--人狼 - 2003-01-24, 15:47:41

それはいけません。典型的かつ初歩的なミスです(^_^;)。inspect は '' に送られてしまいますので、
#myName#
(lookupResult first char printString copyReplaceAll: '#' with: '') inspect
とせねばなりません。--sumim
- 2003-01-24, 15:53:06

ま、最後のインスペクトでケチがつきましたが、正解は得られましたね。最終的にはシンボルにして、
#printIt#
| selector |
selector _ (lookupResult first char printString copyReplaceAll: '#' with: '') asSymbol.
(target isKindOf: PluggableTextMorph)
	ifTrue: [target perform: selector]
	ifFalse: [target handleEdit: [target editor perform: selector]]
ってのでどうでしょう。--sumim
- 2003-01-24, 16:08:41

>それはいけません。典型的かつ初歩的なミス
ちゅど〜ん.やってまいました.--人狼 - 2003-01-24, 16:12:49

>ま、最後のインスペクトでケチがつきましたが
これがまた,お恥ずかしいようなミスで.失礼しました.んで,asSymbolですね.なるほど.コードは理解出来ました,んで動きました.--人狼 - 2003-01-24, 16:14:43

これをコピペしてコード名だけ変えて適当なジェスチャーに割り振れば、とっても簡単…となりますね。もっともこのコード本体をメソッドとして登録しておけば、もっとメンテナンス性は向上すると思うのですが、そうするとこんどは辞書のポータビリティが落ちてしまうのでこのくらいにしておきましょう。--sumim - 2003-01-24, 16:16:23

これで、#(#accept #again #browseChangeSetsWithSelector #browseIt #cancel #changeStyle #chooseAlignment #classCommentsContainingIt #copySelection #cut #debugIt #doIt #explain #exploreIt #fileItIn #find #findAgain #implementorsOfIt #inspectIt #languagePrefs #methodNamesContainingIt #methodSourceContainingIt #methodStringsContainingit #offerFontMenu #paste #pasteRecent #presentSpecialMenu #prettyPrint #prettyPrintWithColor #printIt #printerSetup #recognizeCharacters #referencesToIt #saveContentsInFile #selectionAsTiles #sendContentsToPrinter #sendersOfIt #setSearchString #spawn #translateIt #undo #verifyWordSpelling #wordDefinition #yellowButtonActivity) といったコマンドが作れますね。よく利用するものをピックアップして分かりやすいジェスチャーに割り当てましょう。私は各機能を象徴する最初の数文字の筆記体のジェスチャーにこのいくつかを割り当てました。--sumim - 2003-01-24, 16:20:11

>コピペしてコード名だけ変えて適当なジェスチャーに割り振れば
そうですね,便利…になるでしょうが…トラックパッドでは実感できない(汗)--人狼 - 2003-01-24, 16:35:13

と,言うことで何個か選んで登録してみました.--人狼 - 2003-01-24, 16:35:48

>便利…になるでしょうが…トラックパッドでは実感できない
便利ってのはジェスチャー及びコードの登録が…ということです。やはりペン入力のデバイスがないとジェスチャーの使い勝手としては実感できないと思います。--sumim
- 2003-01-24, 16:39:51

おっしゃる通りです.失礼しました.でもわずかな数ながら,指でぐりぐりってやると動作するのは気持良いですね.WACOMのタブレット欲しいかも.買えないけど.--人狼 - 2003-01-24, 16:44:58

いやぁ。タブレット付き LOOX S でしょう! やはし!(笑)。--sumim - 2003-01-24, 16:57:57



このページを編集 (31437 bytes)


Congratulations! 以下の 1 ページから参照されています。

This page has been visited 2230 times.