一括表示

− 野ざらし言 −

[3373] 文字列検索の仕様の統一について

としき 2009/06/27(Sat) 12:27
http://www.hinocatv.ne.jp/~toshiki/
とりあえず、^Cで止まってくれるので実害はないのですが。

vz.defに標準で装備されている「複数テキストで検索・置換」マクロです。
うっかり、\[F07]のつもりで\[F06]を押してしまうことが多くなりました。
このマクロ、本来の仕様としては、複数のファイルを開いていることが求め
られていると思います。
ちょっと残念なことは、たとえば複数ファイルで検索時、全てのファイルで
該当の文字列が発見できなくても、#cと違い、見つからなかったことを報告
してくれないこと。これもできればなんとかしたい気がしますが、どちらか
というと優先順位は低くて。

ありがたいことに、このマクロ、幸いというか、ファイルを一つしか開いて
いない場合であっても、特に誤動作する事もなく、複数のファイルを開いて
いる時と同じように動作してくれます。開いているファイルの数をチェック
していないんですね。
だけど、開いているファイルがさらに少ないというか、consoleファイルだけ
が開かれている場合。直前の検索文字列があれば、きちんとそこにカーソル
が動いてくれます。が、開かれているのがconsoleファイルだけの場合であっ
て、かつ、直前の検索文字列が見つからない場合は、あたかも無限ループし
ているような挙動を示します。
これを回避するには、どのようなコードを付け加えればよいのでしょうか。
一番嬉しいのは、開かれているのがconsoleファイルだけの場合でも、文字列
が存在すればきちんとその位置にカーソル移動を行い、文字列が見つからな
ければ見つからないと報告してくれるようになってくれることです。

どなたかご教示いただけると幸いです。

[3374] Re: 文字列検索の仕様の統一について

めざら 2009/06/28(Sun) 17:55
[3373]へのコメント http://homepage3.nifty.com/mezala/
> このマクロ、本来の仕様としては、複数のファイルを開いていることが求め
> られていると思います。

 そうですね,複数のファイルを開いていることを求める記述がなくてもそのように解釈できるのであれば,「編集中の全ファイル」(マニュアル p66)というところにも注目すべきだったかもしれません。コンソールファイルは「編集ファイル」ではありませんので。:-)

> どちらかというと優先順位は低くて。

 うーん。面白そうな方が優先順位が低いのですね。残念。

> 開いているファイルの数をチェックしていないんですね。

 チェックしていますよ。i=wc がファイル数チェック部分です。で,wcにはコンソールファイルは含まれません。#T の連続実行よる次のテキストへの切替えを無為にやり過ごし,次に (i--)??. をすり抜けて(コンソールファイルしかひらいていない場合は,i-- で i が -1 になってほぼ永遠に偽にならない)しまって夢幻る〜ぷ状態となっています。

> これを回避するには、どのようなコードを付け加えればよいのでしょうか。

 コンソールファイルしか開かれていない場合のチェックをしないという不具合を取り除くだけであれば,最初の i=wc, を,(i=wc)??. にするだけだったのですが,なかなか注文が厳しいですね。それでは,(i=wc)??>> としてローカルマクロに飛ばすのはいかがでしょう。ローカルは 0: #_ #r のみ。
 ローカルマクロの方で処理の重複をみますが,コンソールファイルの性格上,カーソルが末尾付近にあることがほとんどだと思いますので,#^ #c よりも #_ #r の方が速度も有利です。もちろん見つからなければ報告されるでしょう。
 うーん,そう考えると,(i=wc)??{ #_ #r . } でもいいのかな。

[3375] Re^2: 文字列検索の仕様の統一について

としき 2009/06/29(Mon) 19:06
[3374]へのコメント http://www.hinocatv.ne.jp/~toshiki/
> コンソールファイルは「編集ファイル」ではありませんので。:-)

おっと、これはすっかり失念していました。

>  うーん。面白そうな方が優先順位が低いのですね。残念。

もしかして、めざらさんオリジナルのマクロがリリースされるのかな。
わくわく。

>  チェックしていますよ。i=wc がファイル数チェック部分です。

なるほど。
私はてっきり、開いているファイル数が2未満なら終了、みたいなチェック
がなされているものだと思っていたのですよ。私の発想だと、複数ファイル
が開かれていることが前提のマクロなら、当然、開かれているファイル数の
チェックが行われているべきだ、ということになっているもので。
実は、数年前に作った会社で使っているDelphi製のツール、非常に低い頻度
で謎のエラーを吐いていて、やっと数週間前に判明した原因がなんと、既に
閉じているファイルをさらに閉じようとしていたというもの。なので、微妙
に過剰反応しているだけかもしれません。

>  うーん,そう考えると,(i=wc)??{ #_ #r . } でもいいのかな。

言われてみれば確かにその通り、という感じですが。
なかなか自分一人ではこのコードにたどりつけません。
とりあえず、いただいたコードにさらに追加して、現在は

(i=wc)??{ #r (r)??. #c . }

という形にしてみました。
これでとりあえずは満足しています。
またそのうちに不満が膨張してくればさらに書き換えるかもしれませんが。

どうもありがとうございました。

[3376] Re^3: 文字列検索の仕様の統一について

めざら 2009/06/30(Tue) 12:44
[3375]へのコメント http://homepage3.nifty.com/mezala/
> わくわく。

 いや,自発的な動きはなさそうですよ。このところ体調が悪くて,さっぱり。仕事のモチベーションが不足していることもあって,これじゃイカンと思いつつ,でも何をやっても中途半端にしてきたことを一からまたやってるような気がしてしまって,でも気のせいじゃなかったりして,これ前に途中までまとめていたはずだけれどどうしたんだっけ。
 あ,人間ドック申し込まなきゃ。脳ドックかな。

> なので、微妙に過剰反応しているだけかもしれません。

 微妙に過剰が受けました。
 その微妙に過剰なところが,わたしの現況にマッチしていて,つまり意識は無駄に強いのだけれど身体がついていかないっていう状況をかさねて,微妙にへこんでいたりするわけですが。あれ,なんの話だったか。

> (i=wc)??{ #r (r)??. #c . }

 整理しちゃる。ま,結果は一緒で好みの問題なんですけど。

(i=wc)??{ #r (r)?#c . }


 そういえば,仕様の統一って何でしたっけ?

[3377] Re^4: 文字列検索の仕様の統一について

としき 2009/06/30(Tue) 13:43
[3376]へのコメント http://www.hinocatv.ne.jp/~toshiki/
>  あ,人間ドック申し込まなきゃ。脳ドックかな。

人間ドックは今年も11月頃に受診予定なのですが。
脳ドックというのにも行っておかないとまずいかな。
最近、ちょっと自覚症状があって。
まず、時間の計算力が著しく衰えてきた。
以前は60進数の計算なんておちゃのこさいさいだったのですが。
あと、性格も多少変わってきた。単純化すると、僻みっぽくなってきた感じ。
記憶力はちょっとしか落ちていないんですけどね。
それだけに、以前の自分ではそんな考え方はしなかった、ということを思い出しては愕然とする、というパターンが多い。
単に老化しているだけならいいのですが、器質的な問題だとちょっと恐い。

>  整理しちゃる。ま,結果は一緒で好みの問題なんですけど。
> (i=wc)??{ #r (r)?#c . }

うわぁ、これもまた、言われてみればその通り、なパターン。
こっちの方が好みに合うので、早速書き換えます。

>  そういえば,仕様の統一って何でしたっけ?

検索対象が単一ファイルであっても、複数ファイルでも、consoleファイルのみであっても、検索語句が見つからなかったときの挙動が同じになること、が希望です。
完全に同一とするのが難しいのは理解しています。
とりあえず、検索終了時のメッセージやカーソル位置が大体同じなら満足します。

[3378] Re^5: 文字列検索の仕様の統一について

めざら 2009/06/30(Tue) 18:19
[3377]へのコメント http://homepage3.nifty.com/mezala/
> あと、性格も多少変わってきた。単純化すると、僻みっぽくなってきた感じ。

 あれ? それって典型的な老人化傾向のような。(^^;
 以前,胃検診を予定していた日の朝,自分の朝食だけないことに「ムっ」としてしまって,それでもなお検診当日だということに気付かないということがあり,「なんでオレだけ朝メシがないんだよっ」的な顔をしていたのを厳しく妻に指摘され,呆れられ,死ぬまで言われそうな雰囲気。僻みっぽいのは生まれつきらしいのですが,輪をかけてしまうパターンにはまっているのです。

> 単に老化しているだけならいいのですが、器質的な問題だとちょっと恐い。

 老化です,老化。(これはフォローになっていない。(^^;)

> 完全に同一とするのが難しいのは理解しています。

 コンソールだけしか開いていない場合は仕様に反するものの,簡単だったわけですが,コンソールを含めて複数のファイルを検索・置換というのは,かける手間の割にあまり得るものがないように思いますよ。やはり仕様どおり「編集ファイル」対象としておいた方がよいと思います。

> とりあえず、検索終了時のメッセージやカーソル位置が大体同じなら満足します。

 あれ? すべてのファイルで見つからなかったときって,「見つかりません」が出たままになっていないのかな。#T #T って,手動でやった時とマクロで実行したときって,メッセージの挙動が変わるのですね。知らなかったなぁ。

 あまり美しくないのですが,いっそのこと下のようにしてみるとか。

 検索の方だけです。 (i--)??. → (i--)??{ &m(19) . }

 としきさんの要求が,置換の時の全置換数の計数とか,ファイルごとの置換数を表示するものかと早とちりしていたのですが,そういうわけでもなかったのですね。結構面白そうと思って食指がぴくりとしたのですけれど。

[3379] Re^6: 文字列検索の仕様の統一について

としき 2009/07/01(Wed) 18:47
[3378]へのコメント http://www.hinocatv.ne.jp/~toshiki/
>  老化です,老化。(これはフォローになっていない。(^^;)

これで十分フォローになっている、というところが、いやはやなんとも。

>  あまり美しくないのですが,いっそのこと下のようにしてみるとか。
>  検索の方だけです。 (i--)??. → (i--)??{ &m(19) . }

あ、いいかもしれない。
確かに、ロジックは美しくないというか取ってつけた感じだけど。
結果の方はなかなか。

>  としきさんの要求が,置換の時の全置換数の計数とか,ファイルごとの置換数を表示するものかと早とちりしていたのですが,そういうわけでもなかったのですね。

ほら、私、RXとかZHとかのデフォルトの値が変なんで、複数ファイルの全置換て恐くて行わない人間なんです。
というのは表向きで、つい最近になるまで #57 を知らなかったりするなど、置換系の機能は十分に把握できていなかったりします。
まだまだ勉強が足りません。

[3381] Re^7: 文字列検索の仕様の統一について

めざら 2009/07/04(Sat) 09:35
[3379]へのコメント http://homepage3.nifty.com/mezala/
> 確かに、ロジックは美しくないというか取ってつけた感じだけど。

 うーん,ロジックは至極正当だと思うのです。残りテキスト数をデクリメントしていって,残りテキストがゼロになったので「結局見つかりませんでしたよ」メッセージを出しているわけですから。これ,きちんとしたメッセージ,例えば (i--)??{ &m("すべてのファイルを検索しましたが見つかりませんでした.") . } にしたら,ほらふつうでしょ。

 同じメッセージを出すために規定のメッセージ番号を使っているので,直前に出ていたメッセージを消さない,あるいは復活表示するというのが一番スマートなのですが,相当面倒だったので「取ってつけた感じ」風に見えてしまうんですよね。

> というのは表向きで、つい最近になるまで #57 を知らなかったりするなど、置換系の機能は十分に把握できていなかったりします。

 いや,#57 なんてこのマクロのためにあるようなコマンドだと思いますよ。だって,よくあるパターンとして,確認ありで置換を始めて「ふむふむ,これなら漏れはあるまい」と思い,確認置換を中断して全置換をしようとしますね。検索・置換文字列は同じなのに #57 が使えないわけですよ。範囲や確認などのオプションが異なるので。結局使える場面と言えば,空行削除で最終的に一定の空きにするときに \n\n\n → \n\n という置換を行い,置換の戻り値がゼロになるまで繰り返すときくらい。知らなくて,使ってなくて当然でしょうね。

[3383] Re^8: 文字列検索の仕様の統一について

としき 2009/07/04(Sat) 22:10
[3381]へのコメント http://www.hinocatv.ne.jp/~toshiki/
>  うーん,ロジックは至極正当だと思うのです。

至極正当だというご意見には賛同します。

>  いや,#57 なんてこのマクロのためにあるようなコマンドだと思いますよ。

そんなものですか。
う〜ん、確かに、そんなものかもしれない。

> 知らなくて,使ってなくて当然でしょうね。

ここ数ヶ月ばかり、#57 を、月に数回程度ですが、毎月確実に使っています。
何に使っているかというと、自分のところのサイトの更新の関係。
仕上げの段階で、直前と同じ置換を行う、という事を5〜6年前からやって
いて、だけど再変換を知らなかったもので、毎回、めんどくさいなぁと思い
つつ、どんなに多くても月に10回未満なので、そのまま放置していました。
それが、半年かそこら前、直前の置換の再実行というコマンドを発見したの
ですから、全くなにをやっているのだか。

↑ このページの先頭