コマンド拡張マクロのページあたりに掲載があるかと思ったのですが、無かったのでリクエストさせていただきます。 [ESC]Lに割り当ててあるクローズ・オープンですが、閉じるファイルがRead OnlyやViewモードのときには、新しく開くファイルに閉じるファイルのモードを引き継がせたいのです。当然ですが、入力ファイル窓でファイル名を指定した場合ばかりでなく、入力ファイル窓でリターンを打ってファイラーに移行して、そこでファイルを選択した場合でも、同じくモードを引き継がせたいのです。もちろん、通常の編集モードのファイルであれば通常通りの挙動を希望します。 って、あれ? 今、確認したら、私のところでは、[ESC]Lで必ずファイラーになる。 これってそういうもんでしたっけ。 それとも、何か別のマクロが動いているのかな。 あ、VZ.DEFではなくVZFL.DEFのほうの!Closeでファイラーに戻るお呪いのpv.103+,をしている。 まぁ、このへんは本質ではないと思います。 ファイラーが絡まなければ自力でなんとかできそうな気もしますが、ファイラーだと複数ファイルの選択もできたりして、なんとなく難しいように思い、自助努力を放棄しました。ネタ振りという側面も半分以上あったりしますが。 ということで、お力をお貸しいただけると幸いです。
先に枝葉末節から。> 今、確認したら、私のところでは、[ESC]Lで必ずファイラーになる。 > これってそういうもんでしたっけ。 通常の動きとしては,直前にファイラからオープンしていればファイラになります。直前に入力窓からオープンすれば入力窓になります。ただ,本人がファイラーからしかオープンしなくてもマクロで入力窓からオープンしている場合もあるので「必ず」とは限りません。> [ESC]Lに割り当ててあるクローズ・オープンですが、閉じるファイルがRead OnlyやViewモードのときには、新しく開くファイルに閉じるファイルのモードを引き継がせたい こりゃ難しいですね。 1 オープン中のファイルAの現在のモードをaに記憶する 2 キー監視しつつファイルBをオープンさせる 3 オープン後にBのモードとaが異なれば#Lで開きなおしてaを反映 4 オープン中のファイルAを閉じる 本当は先にAを閉じられればよいけれど,ファイルがひとつもなくなった場合に動きが限定される(気が変わってオープンをやめたときに,入力窓でA名を貼り付けなければならない)ので,この辺が難しそう。
!closeイベントに、必ずファイラーに戻るおまじないを入れていたことを忘れていたくらいですから、ほかにもいろいろと忘れていることがありそうな気はしています。 で、本題ですが、> こりゃ難しいですね。 ありゃ。 そんなに難しいとは思っていませんでした。 それで、サンプルとかFAQとかで見つからなかったのか。 攻め方を変えれば楽になりますかねぇ? たとえば、現在[ESC]Rに割り当ててあるRead onlyオープンですが、これのシフト起動時は現在開いているファイルを(モードにかかわらず)クローズする、というのはどうでしょうか。
> そんなに難しいとは思っていませんでした。 まぁ,達人なら易しいのでしょうけれど,仕様が固まっていないと簡単ではないでしょうね。マクロで勝手に特定のファイルを開くのであれば簡単ですが,ユーザの自由な意志にまかせるというプロセスが途中に入るので難しいです。もしも気が変わってオープンするのをやめた場合とか,コンソールファイルしか開いていない場合とか,もろもろエラーチェックが必要な場面が想像できるので。> たとえば、現在[ESC]Rに割り当ててあるRead onlyオープンですが、これのシフト起動時は現在開いているファイルを(モードにかかわらず)クローズする、というのはどうでしょうか。 こちらの方がむしろ易しい気もしますが,やはりユーザの自由意志が実行中に漂うことになるので,どうしたものかなと思います。例えば次のような場合に,どうすることを想定しますか? ・オープンしようと見せかけてキャンセルした場合に,元のオープンしていたファイルはどのような扱いにするか(閉じる・閉じない) ・上の例で閉じないことにする場合,オープン済みのファイル数がオープン可能なファイルの上限にあったらどうするか(何もしない・強制的に閉じる) ・先にオープンしているファイルを閉じるという仕様にした場合,オープン中ファイル数がひとつだけの場合に編集モードに戻れなくて無限ループに陥る可能性がないか 基本形は, 1 [ESC]R "" ?. i=id, ;元アクティブファイルのidを記憶 k1&ks, ;シフト起動の有無を記憶 (wc<tc)?{ ;新たにオープンする余裕があれば #R ;先にオープンさせる ;;; ユーザの自由意志を泳がせる (r<0)?. ;キャンセルされたら終了(戻り値が-1の場合) (k)?{ ;シフト起動なら,このブロックを実行 &#T(-i) ;元アクティブファイルに切り替え mr-, ;未修正にすりかえて #C ;閉じる } } …みたいな感じでしょうか。
> ユーザの自由な意志にまかせるというプロセスが途中に入るので難しいです。もしも気が変わってオープンするのをやめた場合とか,コンソールファイルしか開いていない場合とか,もろもろエラーチェックが必要な場面が想像できるので。 なるほど。 いわゆる高級言語だと、オープンの結果のステータスが返ってくるのですが、マクロだとそういうのがないんですか? 入力窓やらメニューの場合はキャンセルした場合の戻り値があるのに。 あれ、そういえば、めざら資源内「VZ resources」のどこかで、メニューについて解説してあるところが見つからない。case文の解説のところで、戻り値についてのみ説明してあるのは見つけたけど。 さらに脇道というか、「トークン関連覚書」の「!」記号のところでメニューの呼び出しってないんですけど、これはトークン扱いにはならないんですか?> 例えば次のような場合に,どうすることを想定しますか? う〜ん、ならば、さらに制限をつけて、元ファイルに編集済みフラグがたっていないときのみ元ファイルをクローズして、編集済みのファイルの場合はシフト起動であっても通常の#Rと同じ挙動にしてしまうかなぁ。 あとは、キャンセル時の扱いか。 う〜ん、う〜ん。> 基本形は, > > 1 [ESC]R "" ?. > i=id, ;元アクティブファイルのidを記憶 > k1&ks, ;シフト起動の有無を記憶 > (wc<tc)?{ ;新たにオープンする余裕があれば > #R ;先にオープンさせる > ;;; ユーザの自由意志を泳がせる > (r<0)?. ;キャンセルされたら終了(戻り値が-1の場合) > (k)?{ ;シフト起動なら,このブロックを実行 > &#T(-i) ;元アクティブファイルに切り替え > mr-, ;未修正にすりかえて > #C ;閉じる > } > } なんかおかしい。 わたしの手元の実験では、 = r * m 1 ^\ "" ?. #R &m("%d",r) * #Rでファイルを選択する前に「0」が帰ってきてしまう。 なので、キャンセルしようが複数ファイルを選択しようが、判別がつかない。 この辺、何か設定できるスイッチのようなものがありましたっけ? あれ? #Rを#Oに変えても同じだ。 絶対何か変。 ポケ3でも同じ挙動だ。 イベントマクロが何か悪さをしているのかな。 こちらを解決しないと次に進めないような気がする。
まぁまぁ。人間が仕事の合間にやっていることですから,すべて完璧に情報が整理できているわけではありません。それなりに抜けている情報はあります。そもそも制作者でも頒布者でもないのですから。トークンの抜けは気が向いたら更新したいという思いは持っています。> いわゆる高級言語だと、オープンの結果のステータスが返ってくるのですが、マクロだとそういうのがないんですか? 一応,正常にファイルをオープンしたときの戻り値が0。オープン済みのファイルをオープンしたときは戻り値がファイルの番号。オープンに失敗したときに,-1が戻るということになっています。実験はしていません。> 編集済みフラグがたっていないときのみ元ファイルをクローズ こういうのは簡単ですよね。> なんかおかしい。 > わたしの手元の実験では、 > #Rでファイルを選択する前に「0」が帰ってきてしまう。 #Rコマンド単体の戻り値は常に0だったかも。 ファイルをオープンした/しない,によって戻り値が変わってきます。 サンプルでは手を抜いて,#R の次がありませんけれど, 入力窓で1行入力を受け付けて,オープンさせるまで気を抜けませんね。 気が抜けないので &Cr を使って,ファイルのオープンが完了するまで次の命令を実行させないようにします。
&Crとかを教えてもらったので、制限つきながら、とりあえず動くものをこしらえてみました。いや、制限つきというよりも、ある条件なら動く、といったほうが正確かもしれません。 = r * m 1 [ESC]R "" ?. k=ks&1, (mr==128&&k==1)?{w=wc, i=wn,} #R &Cr (w<wc&&k==1)?{&#T(i) #C} * 私のところではファイルオープンの戻り値が当てにできないようなんで、オープンが成功したかどうかはwcの値の変化を使っています。キャンセルとか何とかは全部こいつに吸収させています。 mrについては今後要検討。 不思議なのは、テキストの切替にwnを使っていますが、ここをidにすると、なぜか思ったような動きをしてくれない。上記のような使い方の場合は、wnとidを単純に変更するだけではダメなんでしょうか。
> オープンが成功したかどうかはwcの値の変化を使っています。 その手もありますよね。色々な手法があっていいないいなだと思います。要は自分にとって一番安心な方法を使うのがよいということでしょうか。> 不思議なのは、テキストの切替にwnを使っていますが、ここをidにすると、 思ったような動きになりませんか。ふうむ。 wnの値は,そのファイルよりも前に開いたファイルを閉じると変化しますが,idは変化しません。それで通常は確実な動作をさせるためにはidを使うことが推奨されていると思います。ですので,wn と id を単純に変更するというのは,ふつうはやらないことだと思います。むしろ,なぜ思ったような動きにならないのかを,今のうちに解明しておくほうがよいと思います。 idを指定するときは,符号を反転させていますよね.&#T() ではそれをしないと思ったような動きにはなりませんが…
> idを指定するときは,符号を反転させていますよね.&#T() ではそれをしないと思ったような動きにはなりませんが… これが原因でした。 ほんとに、単にwnとidを置き換えただけで、マイナス符号をつけるのを忘れていました。 おかげさまで、原因が判明しました。ありがとうございました。 あとは、自分で使いやすいように、いろいろと書き換えていきたいと思います。 このマクロが必要なのは、母艦よりもポケ3なんです。 ポケ3の場合、メモリが少ないので、ちょっと大きめのファイルを普通に開いて文字列検索なんかすると、すぐにテンポラリファイルエラーにお目にかかることになります。viewモードで検索すれば問題はないのですが、複数のファイルを次々と検索するような場合、ファイルを開くたびに、いちいちモードを変更するのも面倒。ということで、クローズ・オープンに細工を加えたかったのです。 ん〜、[ESC]Vというキーアサインを使ってviewモードでファイルを開くようにして、こちらのシフト起動でクローズ・オープン、というのもいいな。 ということで、すいません、追加の質問です。 私、今使っているviewモードへの変更マクロは、おそらく、上村さんあたりの作ったマクロのはずです。作者は違うかもしれませんが、基本的に、モードの変更機能しかありません。 誰かの贋作マクロで、Read onlyではなくViewモードで開くようなものがあったような気がするのですが、ご紹介いただけないでしょうか。
> ファイルを開くたびに、いちいちモードを変更するのも面倒。
そのために製品版の View Mode マクロがあるんですよね。
26 ^QV "V Viewモード"
am[,
(ro!)?{ am=5, &m("View mode") }
?{ &m("Edit mode") }
am],
このマクロを実行して,それ以降はすべて View Mode でオープンするように
しておいて,次々とファイルを開き直します。
> 作者は違うかもしれませんが、基本的に、モードの変更機能しかありません。
・現アクティブファイルを View Mode で開きなおす機能が付加されている
・シフト実行でroを反転させる製品版マクロの実行
…という雰囲気が贋作だったかと。
> そのために製品版の View Mode マクロがあるんですよね。 そうじゃなくて。 #Rみたいに、次に開くファイルのみをViewモードにする、というマクロを紹介していただきたいところでして。 現在使用中の、上村さんか誰かの作ったマクロの場合、単に^QVを行うと、そのとき開いているファイルをViewモードにしてくれるだけですが、シフト起動で^QVを行うと、製品版のように、それ以降に開くファイルを全てViewモードにしてくれます。ただ、この場合、キーアサインは[ESC]Oなり[ESC]Lなり、通常の編集モードでファイルを開く場合と同じものを使うことになると思います。私の場合、#Oと#Rでキーアサインが別のものが割り当てられているのと同様、Viewモードで開くというのも別のキーアサインにしたいわけなのです。 ということで、重ねてアドバイス募集中です。 なにとぞよろしくお願いします。
> そうじゃなくて。 あ,やっぱり。このキーにアサインしたい…という雰囲気だったので,なんとなく違うように思ったのですが,自分の感覚からすると,次々とファイルをオープンする際に View モードでオープンするためのキーをその都度押すというのが面倒だなと思ったもので。あは。 でも,それならもっと簡単なのではないでしょうか。このスレッドのクローズ・オープンで考えるから難しいのかもしれませんが。 1 [ESC]V "View mode open" ?. ro[+, #O &Cr ro], こんな感じでしょうか。これにクローズオープンを付けるとすると, 1 [ESC]V "View mode open" ?. ro[+, (ks&1)?#L ?#O &Cr ro], ;シフト起動でクローズ・オープン あれ,ばかに簡素ですね。 #L の動作というのが割りと読めないところもありますし,入力窓でマクロを実行されると動作は不定となるかもしれませんが,そういうのを承知のうえでファイルを開くことしかしないと割りきってしまえば,エラーチェックの思い切った省略もアリかと思います。
> 1 [ESC]V "View mode open" ?. そうそう、これこれ。 ぅぉぉ、これは便利だ〜! そうかぁ、roって、名前からread onlyかと思いこんでいました。 いや、ホンと、助かりました。 どうもありがとうございました。> #L の動作というのが割りと読めないところもありますし, これは、具体的なことは覚えていませんが、昔、DCで話題が出ていたのを読んだ記憶はあります。が、> 入力窓でマクロを実行されると動作は不定となるかもしれませんが, これがよくわかりません。 入力窓で今回のマクロを起動しようとしても、[ESC]を押した時点で、たいていの入力窓は閉じてしまうような気がします。 何か私が勘違いしているのかな。 もうちょっと解説していただけないでしょうか。
確かに,ro の変数名称は紛らわしいですね。> 入力窓で今回のマクロを起動しようとしても、[ESC]を押した時点で、たいていの入力窓は閉じてしまうような気がします。 今回のマクロの入力窓で[ESC]以外のプリフィクスキーのコマンドキーに割り当てた編集マクロ(ファイル名の補完マクロとか)を起動すると,…という意味です。 常にファイラーから次のファイルをオープンするのであれば,問題はなさそうに思いますよ。
> 今回のマクロの入力窓で あぁ、なるほど。 私、そもそも、入力ファイル窓に限らず、窓で起動するようなマクロはほとんど使っていないもので、その点については問題ありません。 でも、通常の#Oや#Lでは問題なくて、今回のマクロでは問題が出そうなマクロってありうるのでしょうか。今回のマクロで問題が出るなら、通常のファイルオープンでも問題が出そうな気がします。
> でも、通常の#Oや#Lでは問題なくて、今回のマクロでは問題が出そうなマクロってありうるのでしょうか。 よほど行儀の悪いマクロでなければだいじょうぶだとは思いますが,入力窓の前後でプッシュ・ポップを使っているので,ちょっと神経質になりますね。 &Crを使ったモード変更待ちの場合,モード型のマクロで行われるような監視やエラーのフォローにまでは気を遣わないので,色々と心配をしはじめるときりがないのですが,他人様の手の動きや環境,常用マクロというのは想像がつきませんから,断言はしにくいというレベルです。 プッシュ・ポップを ro+ 〜 ro- に変えるとよほどひどい事にはならないかもしれませんが,ちょっと恥ずかしい仕様に難ありですよね。
そうか、プッシュ・ポップの間でマクロが終了する可能性があるのか。 それは思い至りませんでした。 今回もいろいろと勉強になりました。 どうもありがとうございました。 また、些細なことでもネタを振らせていただきます。
↑ このページの先頭