#9920 の 行番号取得ルーチンの解析 からヒントを得て
65535行を超える巨大ファイルの指定行にジャンプするマクロが出来ました。
&Ln(p,str) 十進数(ロング)の取得 の使い方、これでいいのかな。
=== jump_L.def ===
; 65535行を超える巨大ファイルの指定行にジャンプ Ver0.1
; シフト実行なら現在行の表示
; 使用変数 n,i,j,l,pu,
*m
80^\""?.
(ks&1)?>C ;シフト実行なら現在行の表示
&g("",-9) &Ln(pu,pw) ;&Ln(p,str) 十進数(ロング)の取得
n=r, &Cr (n==-1)?. ;
n=pu..1, #^ ;ファイルの先頭へ
:B (n>0)?{&#J(-1) #x n--, } ;65536行ジャンプ
(ln==0&&n>0)?>B ;n>0の間繰り返し
(ln!=0)?{&#J(-1) >C } ;指定行が大きすぎる時は最後まで
&#J(pu..0) &d pu..2=pu..0, ;余りの行ジャンプ
&m("現在%lu行 Ln=%u行 %u",pu..0,pu..1,pu..0,pu..1) ;
; . ;※ ここをコメントにすれば全行数も確認できる
&w(60) ;お好みで
:C &s #M &Le(pu,wa+126) ;現在位置マーク
#_ n=ln, ;ファイルの最後へ
&> l=ln,j=i, ;最大行取得
&> ;現在行取得
&d &m("最大%,lu行 %d 現在%,lu行 %d Ln?%u",n,j,j,l,i,i,pu..2)
.
0: i-,
:A &#J(1) #e #e (ln<0)?{i++, >A} ;i=65536*i
&Le(wa+126,pu) #U ;現在位置に戻す
.
65535行を超える巨大ファイルの指定行にジャンプ Ver0.2
通常ジャンプに対応してなかったので★印追加しました。
これで標準の行番号ジャンプと置き換えられるので、起動キーも、^QJ に。
入力窓を[ESC]や[ENTER]で閉じたら現在行表示としました。
=== jump_L.def ===
; 65535行を超える巨大ファイルの指定行にジャンプ Ver0.1
; シフト実行なら現在行の表示
; 使用変数 n,i,j,l,pu,
*m
80^QJ""?.
(ks&1)?>C ;シフト実行なら現在行の表示
&g("",-9) &Le(pu,0) &Ln(pu,pw) ;&Ln(p,str) 十進数(ロング)の取得
n=r, &Cr (n==-1)?>C ;★返り値が-1なら現在行の表示
&s n=pu..1, #^ ;ファイルの先頭へ
(n==0)?>D ;★65535行以内なら普通にジャンプ
:B (n>0)?{&#J(-1) #x n--, } ;65536行ジャンプ
(ln==0&&n>0)?>B ;n>0の間繰り返し
(ln!=0)?{&#J(-1) >C } ;指定行が大きすぎる時は最後まで
:D &#J(pu..0) pu..2=pu..0, ;余りの行ジャンプ
:E &d &m("現在%lu行 Ln=%u行 %u",pu..0,pu..1,pu..0,pu..1) ;
. ;※ ここをコメントにすれば全行数も確認できる
; &w(60) ;お好みで
:C &s #M &Le(pu,wa+126) ;現在位置マーク
#_ n=ln, ;ファイルの最後へ
&> l=ln,j=i, ;最大行取得
&> ;現在行取得
&d &m("最大%,lu行 %d 現在%,lu行 %d Ln?%u",n,j,j,l,i,i,pu..2)
.
0: i-,
:A &#J(1) #e #e (ln<0)?{i++, >A} ;i=65536*i
&Le(wa+126,pu) #U ;現在位置に戻す
.
*
2020-11-25 Ver0.2 通常ジャンプに対応してなかったので★印追加
2020-11-23 Ver0.1 &Ln()使用して65535行を超えるジャンプ実現
> なかなかに実用性の高そうなマクロですね、おいおい!
そう言ってもらえるとうれしいです。(^_^)
> とはいえ、このように日々Vzマクロが進化してゆくのを見ていると、
> けっこうな幸福感が得られているのも事実です。
実はオリジナルvzでも出来ないかと、マシン語でロングが無いかと検索したら
既にロングジャンプがありました。げげ!
進化どころか過去にも追いつけてない。(;_;)
> >入力窓を[ESC]や[ENTER]で閉じたら現在行表示としました。
> おお、やる!!!
ここだけは私のルーチンの良いところです。-1 で65535行に飛べます。
さて、見つけたのは、あむのさんのマシン語ロングジャンプマクロです。
マシン語で十進数を取得するルーチンはありがたくいただきます。m(__)m
上手く動かない場合があったので若干修正とコメントを加えました。★印部分です。
これで、-2 以下の負数も入力ジャンプできます。
&SF() が何か誤動作している気がして変更しました。間違っていたらご指摘ください。
> 07177/07189 xxxxxxxx あむの RE:Q:65535行以降へジャンプするには?
> (15) 97/08/03 03:17 07152へのコメント コメント数:1
=T
1行窓でジャンプする行番号を入力して下さい。
※ 1行窓で数字以外の文字が入力された場合はエラー
※ 数字文字列がロング変数の範囲を超える場合はエラー
* M
81 ^\ ""
?.
mx+,&g("【行番号】",14) &Cr mx-, i=r, ;★ i=r, 追加
; &SF(pu+bu+84,$a) (r)?. ;[ESC]/[CR]のみは終了 by m.gann さん
(i==-1)?. ;★[ESC]/[CR]のみは終了 &SF()は良くない?
(i<0)?{ &#J(i) i0, >e } ;★入力が - なら通常ジャンプ
&s p=pq..149, ;榊原版: pu+bu+84 -> pu+bu+340
&Sn(pw) cx=r,r=pw,
(cx){ (r.0 > 47 && r.0 < 58)?r++,? >q } ;Numeric Check
&00 &i(r) (r)?>q
#^ #< c1+p..1,i0,
:l (c--)?{
&#J(-1) (ln-0~)??{ #> #d (r)??{i++,>l} } (0)
}? &#J(p..0)
:e &m("【Long Jump】End (ln:%,lu)",ln,i) &d. ;★ :e 追加
:q &m("【Long Jump】Error") &d
0: ;数値文字列をロング変数に変換
; -> ax 数値文字列
; bx ロング変数用バッファ
; cx 数値文字列のレングス
; <- r 0:成功 1:変換失敗
ax=pw,bx=p,(3+$)."$
$(8B,EB,8B,F0,33,FF,3E,89,7E,02,3E,89,7E,00,BF,0A)$
$(00,3E,8B,46,00,F7,E7,8B,D8,AC,25,0F,00,03,D8,83)$
$(D2,00,3E,89,5E,00,8B,DA,3E,8B,46,02,F7,E7,0B,D2)$
$(75,0C,03,C3,72,08,3E,89,46,02,E2,D5,F8,C3,F9,C3)"
*
あまり大きなログファイルがなくテスト不足ですが。^^;