純粋マクロのロジックというかコーディングのご相談なのですが。 タイトルの如く、ファイル末を改行文字2字にしたいのです。置換でヌル2つ に変換して、ヒストリーバッファに送って、バッファ終端にしようという魂胆です。 できたら、モバでも遅くないようにと願っています。 下では最後の行のところで、カーソルを激しく動かしていますが、その 部分は無視していただいてよいのですが、これより速いやり方や、短い書き方、 あるいはこんなときに使えるコマンドなど、何かありましたらお教えいただけない でしょうか。 けっこう情けないくらい泥臭いと思うのですが、これ。 12: ;-----keep 2 '\n's at the end of the file ei[-, #_ #> #s (ct==1)?? {#d #m #m >s} ;ない場合、2つ付ける。 #s (ct==1)? #s ;1つあった。その前は?2つ目あり。1つ前へ :t (ct==1)? {#g #s >t} ;ありすぎは削る :s ei], #^ #<
ヒストリバッファに転送してから末尾にヌルを書き込む方が簡単かと思います。 その行がラインバッファにあれば,行頭オフセットと行末オフセットから, 実質的な行の長さを求められるので,その位置にヌルを2個書き込みます。 改行をヌルに置換すると,行が連結されて1行になりますね。 その1行を丸ごとラインバッファに入れて,標的のバッファに転送します。 ラインバッファから出ずに行の長さを計算して,そこをバッファの終端にします。 既に最後にひとつヌルがあったときはヌルが3個になりますが,2個も3個も 終端になることは変わりはないので,手を抜くことができるのです。 = test = by H_ear #if 0 ファイル/行をヌル区切りのデータにしてバッファに転送 #endif * mad for vz! 1 ^\ "" ?. (mr==$80)?{ &m(32,nm) . } ;リードオンリーです #56 "\n" #m &o($0) #m "ay" ;改行をヌルに置換 &> a=r, b=wm+230, #28 ;ラインバッファの内容をバッファサイズを限度に指定バッファに書込み &Sm(a,b,a..-1) ;;ラインバッファにいるうちに長さを算出しヌル2個でバッファ終端にする ((a+(wa..19-wa..18))..0-, ;bend-btop==length :z ; ---- exit ---- &d #] . 00: ; ---- buffer ---- (5+$)."$(50,0)$[82]" * wa..19-, というのは危険ぽいから止めておきましょう。
> ヒストリバッファに転送してから末尾にヌルを書き込む方が簡単かと思います。
> その行がラインバッファにあれば,行頭オフセットと行末オフセットから,
> 実質的な行の長さを求められるので,その位置にヌルを2個書き込みます。
>
> 改行をヌルに置換すると,行が連結されて1行になりますね。
> その1行を丸ごとラインバッファに入れて,標的のバッファに転送します。
> ラインバッファから出ずに行の長さを計算して,そこをバッファの終端にします。
> 既に最後にひとつヌルがあったときはヌルが3個になりますが,2個も3個も
> 終端になることは変わりはないので,手を抜くことができるのです。
> プロファイル機能を乗っ取ればいいようにも思いますが,ほれ,そこは特化し
> たマクロを作りたいという要求もあるのでしょう。
> しかし,別に古かったり壊れているような履歴でも,別に残っていて害はなさ
> そうな気もしますけどね。無害・有害の範囲が有用・無用と同じと考えるのであ
> れば初期化は必要なのでしょうけど。
> たぶん、YASATさんに解説してくださったのだろうと。m(__)m
> わ、わかんにゃい。ワンワン。
> 自分が書いていることに筋が通っているのか、自信なし。
> もちろん、危険です。コピーしたほうを加工し転送します。
YASATさん 僕には、 いつも慎重な YASAT さんが僕の意図を取り違えていると想像しにく いのです。 ですから、 めざらさんが「さすが YASAT さん、いつもどおりシャープだね」 とおっしゃるのじゃないかと怯えているのですが、YASAT さんの意図が読めませ ん。 恐れながら暫定的に僕が抱いている結論は、YASAT さんに僕の欲しいものが伝 わっていなかった、です。つまり、下のマクロの意味が分かんにゃいのよん。 === Macro Tmp by Bunta ===; * Macro 50 ^^ "mactest" &Sc(pa,"test1234") ;ヒストリーでない文字列コピー (1) pa.0-, ;バッファ・クリア (2) &Sh(pa,"test") ;ヒストリー復活(?)で文字列コピー (3) * (1)とりあえず、バッファの普通の状態みたいにすべく文字列を入れておいた。 (2)クリアするなら、これだけでいいじゃん。 (3)ほら、ふつうにヒスト・コピーだよ。 はい。でもそういう意図? なのですが、ファイル(ラインバッファ状態でもテキストバッファ状態でもよ い)をヒストリーバッファに送るというのが趣旨で、そのために改行を全てヌル に置換して(1行1アイテム)、ファイル終端だけ2つの改行文字、というか2 つのヌルにしてヒストリーバッファの終端の形にして転送、というのが目論見の 全体です。 これがディスコミュニケーションの発端かな? 僕の完全読み間違い? >めざらさん 酔ってない頭ならマクロ読めました。完璧。> wa..19-, というのは危険ぽいから止めておきましょう。試してないのですが、意図は「wa..19+2-,」なのかな、と思いました。ライン バッファの終端って何か決まった文字が入ってるんでしたっけ? あ、改行文字 が入ってるのか? (何かsedの話みたいだ)…基本的知識が足りない。 もちろん、危険です。コピーしたほうを加工し転送します。
> 試してないのですが、意図は「wa..19+2-,」なのかな、と思いました。ライン
> バッファの終端って何か決まった文字が入ってるんでしたっけ? あ、改行文字
> 私が考えていたのは、オープンテキストの最終行から一つずつヒストリバッファ
> に格納していくかたちです。
めざらさん> YASAT さんのヒントは、現在の文太さんのレベルに適切なアドバイスだったと> 思います。わたしは自分勝手に自分の好きなやり方を書いただけ。実に実に。 それで、「なぜ YASAT さんが考えていることが分からないんだろ う、たとえ何かのディスコミュニケーションがあったにしても」と強く思ってい たのです。単なる勘違いではないとは確信してました。自分の中に足りないもの があるのは知ってたのです。無知の知。 謎が解けて、ああ、それが筋というものだよなぁ、と。 バッファ内というメモリー上のデータと、切った貼ったする「ファイル」上の データのふな渡し的なところにハードルがあるようなんですよね。ポインタやラ インバッファに行く前に便利なもの(考え方)があるはずなんだけど、的に。 それでも、めざらさんの考え方も、とても勉強になりました(ちょっと調べる のがまだ終わってないことがないではないですが)。多謝です。m(__)m あ、そろそろ既存マクロをお教えいただけます? もちろん、bhis.defは完成 させますけれど。
あれからしばらく考えていますが,単純にラインバッファにおける行サイズを 算出して,書き込み先バッファ先頭からの位置を終端処理するのは結構危険とい うことに思い至りました。 ラインバッファ(行サイズが書込先バッファサイズよりも大きい場合) ↓先頭 ↓末尾 ■■■■■■■■■■■■■■■■□□□□□□□□□□□□□ ↓ 複写されるサイズ ↓ &Sm(a,b,a..-1) ;バッファサイズを限度にコピー ヌル→次の領域 ■■■■■■■■■■■○○△△××△△△△△△△△△△△△ ↑↑((a+(wa..19-wa..18))..0=0, ;ヌル埋込位置 書込先バッファ 既存のヒストリバッファが書込先になっている場合は,次のヒストリバッファ の中途にヌルが埋め込まれて終端処理されてしまいます。サンプルマクロのよう に自前バッファがマクロの最後尾に配置されている場合は最悪で,次のマクロの ヘッダ部分を壊したり,マクロコードの中にあれば実行がその位置で中断される ことになります。これは非常にまずい。 サイズ計算でヌルを書き込むコードを使うのであれば,それより前に測定サイ ズが書込先バッファより大きければ,警告を出して中断させるというのもひとつ の手かもしれません。変なところで切られるよりも親切というところでしょうか。 #> (cp>a..-1)?{ &m(11) . } ;*1 バッファがいっぱいです あるいは,複写先のバッファの終端を強制終端処理するという手もあります。 入り切らなかったものはそもそも欠けている状態ですからさらに1,2バイト余 計に切れても問題はないでしょう。 ((a+a..-1)..0-, ;バッファの末尾を終端化 この処理は複写前にサイズチェックを行う場合は不要になります。(あっても 害はなく,ゴミ箱をゆすってみるようなもの。)