Vz resources : MACRO FAQ
2005-06-30T05:43:12+09:00

VZ Macro FAQ - 編集画面

編集画面の表示桁数を変更するには

次のような経験はありませんか?

これらの症状は,画面の横幅よりもちょっとだけ長い行が多かったりする場合に頻発します。別に手動でweを調整すれば済むことなのですが,ワンタッチで切り替えるのも便利です。特にこのような環境系の設定は,モードメニューやサブメニューに入れておけば手間がないですね。

モードメニューの方には,

        "R 画面の横幅(2〜250)",WE

…というアイテムがあって,手動で切替できるようになっていますので,これはこれで生かしておいて,サブメニューにマクロを登録しておくとよいでしょう。

あまり洗練されていませんが,一例です。通常実行で物理桁数と最大論理桁数のトグル切替で,シフト実行(メニューの先頭文字をシフトキーを押しながら入力)で縦分割なら左右の窓とも表示幅に合わせるというマクロです。

59 "Rmargin($we)"       ;H_ear
        ?.
        (we!=wd)                ;物理桁数と論理桁数が異なっていれば
        ?we=wd,                 ;同じにする(リセット)
        ?{      (ks&1 && wt>3)  ;画面が縦分割でシフト実行なら
                ?{ (2){ #W we=wx, } (0) }       ;左右とも表示幅に合わせる
                ?we255,         ;特に条件がなければ最大幅にする
        }
        &d

このようなマクロを VZ.def などに入れておき,サブメニューのアイテムを次のように設定します。

3       "",16,12
        &58 &59 #45 #52 #54 #67 #68 #79 #83 &21
;       L/P MGN ^QJ ^QB ^QL ^KR ^KH eX  eW  Tab
        "auto Save mode",!06
        "$4EMS p/P: $ef/$em"

&59というのが呼出の記述です。メニューからはコマンドだけでなくマクロの呼出もできるので,頻繁には使わないけれど常備しておきたいマクロの登録に便利ですね。注意点は三つです。

手作業では面倒な表示桁数の設定も,マクロを使えば簡単にすませることができます。

編集画面の右マージンを表示するには

通常,表示桁数は物理桁数に合わせているので,右マージンが表示されるということは少ないと思います。罫線を使って表示桁数を越えるような大きな表を作っているときなど,フリーカーソルでもどこまで動かせるのかは右マージンが表示されていないとよくわかりません。VZは表示幅として255桁(マニュアルや標準組込マクロでは250桁と表記されています)まで可能ですが,実際にはそのうちの一部を覗くような表示になりますから,現在どこを表示している部分を把握することが難しいのです。

右マージンを表示するオプションは Dr です。また,表示する記号「<」の表示属性を選択(AcあるいはAe)する変数は CA で,5ビット目をオン(+16)にします。

う〜ん,マクロFAQじゃなかったですね。

マクロがないと寂しいので,ちょっと蛇足ぎみの一本。

物理的な画面の横幅を越えるweが設定されているときに,カーソル位置を変更しないで参照範囲を表示行末方向にずらすマクロです。なお,左端で実行すると動作しません。最低でも,水平スクロールさせたい量+1の余裕が必要です。画面の右寄りの方で実行してください。

1 ^\ "" ?.
        wa.60+=1,               ;水平スクロールオフセットいぢり
        &d                      ;再表示

変更した表示桁数を初期設定に戻すには

物理的な画面の桁数を越える表示桁数は変数weで変更できますが,初期設定の表示桁数は変数wdにセットされています。編集テキスト変数のweと違って,wdは全テキストで共通です。起動後も変更可能で,変更後にファイルをオープンするとweに反映されるようになります。WIDETEXTで色々なサイズの画面を使用する場合はともかく,通常は80になっていると考えられますので,次のマクロのように簡単にリセットすることができます。

1 ^^ "" ?.
        we=wd, &d

編集画面の高さを確認するには

「なんじゃ,それ。」って思ったあなた,上下分割位置が変更できることを忘れてます。編集画面というのは現編集テキストを表示している領域ですから,左右分割画面であれば編集画面の高さは全画面よりも当然小さくなります。また,全画面であっても,WIDETEXT環境であれば編集画面の高さは自由自在。

編集画面の行数関係の変数は色々用意されています。

wy編集画面の高さ分割で変動 予約行を除くテキストの表示範囲
wa.54テキストウィンドウ開始位置ステータスライン0〜,上下分割下など
wa.56編集画面の表示行数wyと同じ値
vp.5表示開始位置0
vp.7表示サイズ(行数)#66実行後の値が反映されないことがある機能キー予約行を除く
vp.11表示行数 #66実行後の値が反映されないことがある機能キー予約行を除く
lc表示行数(IBM-PC起動後のみ。起動時は予約行の設定。NEC-98では行間空きモードの設定)起動後はvp.15に保持されている?FEPガイド行を除く

例えば,動的なメニューを生成する場合に,メニュー内でのスクロールが必要ないように表示行数に合わせてアイテム数を調整しようとすると,現在の表示行数の情報が必要です。このときにwyを使うと,上下分割画面では小さなメニューになり,参照画面を隠さない反面,アイテム数が減ります。vp.7を使うと,アイテム数を自由に調整できる反面,上下分割時は参照画面の一部を隠すことになります。

一応,次のマクロで色々な状況下での値を表示してみてください。

1 ^\ "" ?.
    &m("wy:%d, wa.56:%d, vp.7:%d, vp.11:%d, lc:%d",wy,wa.56,vp.7,vp.11,lc)

編集画面の高さを変更するには

編集画面の高さとは,編集テキストの表示行数ということになります。表示行数は通常は固定されたものですが,上下分割モードにおいてはおよそ半分の高さとなります。この分割位置は変更可能で,コマンド#65(仕切り線位置の変更)によって変更モードに入り,カーソルキーで調整して[Enter]で決定します。

次のマクロは,m.gann師による分割位置変更マクロです。

; Border Up/Down(分割位置の変更)
8 @[RLDN] "" ic+, >>            ;ic(愛しい)サンプル
8 @[RLUP] "" ?. (wt)?{ &s #65 &o(#s+ic-wt&2) #m &d }

ビューポイントを視覚的に変更するには

カーソル位置の前後を参照しながら入力できるように,標準で「表示位置変更」というマクロが組み込まれています。

#if 98
14 [CLR]  "表示位置変更"
#else
14 \[HOME]  "表示位置変更"
#endif
        ?. y=wy-1,y/=2,
        (ly==y)?{ ky=wy-2, >A }
        (ly==1)?{ ky=y, >A }
        ky=1,
:A      &d #]

かゆいところに手がとどく実にナイスなマクロなのですが,一瞬で切り替わるためにカーソル行がどの位置に動いたのか把握しにくいという問題があります。このような場合は,速度を犠牲にして視覚効果を付加してやると使い勝手がよくなりますね。

次のマクロは,nifty:FGALPK/MES/14/03865(1994/03/09T21:29:00) 榊原知氏の発言からの引用です。

14 [CLR] "表示位置変更"
        ?.
        (ly)??{ (wy-2){ #x #w } . }
        ((ly-1)%(wy/2)+1){ #e #z }

次のマクロは,nifty:FGALDC/MES/13/01298(1997-01-17T00:24:00) M.Miyata氏の発言からの引用です。

======== Vpos.def ======== by miyata
*M
43 \[CLR] "View pos"
        ?.
        y=wy-1,
        (l1<ly)?{                    ;top → end → ctr
                (ly>y/2)? l=y/2,
                (ly-l){ #e #z }.
        }
        (y-ly){ #x #w }
*

いずれもずりずりとスクロールして視覚的に楽しめるのですが,昨今のマシンの性能では速すぎて瞬時に切り替わっているように見えてしまいます。ウェイトを入れるなんてのも変ですね。こういったマクロが楽しめたのは,80286/20MHzくらいのスペックの時代の話です。

分割時に表裏の編集テキストを入れ替えるには

画面分割時に表と裏の編集テキストを入れ替える手順は次の通りです。

  1. #Wで表裏を交換する
  2. #Yで分割モードを変更する
  3. #Wで元のテキストに戻る

あるいは,

  1. 表テキストのテキスト番号を取得する
  2. #Wで表裏を交換する
  3. &#T(wt)で表示テキストを切り替える
  4. #Wで元のテキストに戻る

…という手順になります。VZにおける編集テキストの切替は癖がありますので,常に同じ条件でできるとは限りませんが,この癖を心得て逆に利用するに限ります。

マクロでこれをやろうとする場合,前者・後者ともなかなか複雑になってしまうのですが,コマンド関数&#Y()を使うことによって非常に簡単になります。

1 ^^ "" ?. #W &#Y(wt)

これを基本型とし,必要に応じて#W#Yを加えていけば,色々なバリエーションに発展させることが可能です。

裏テキストに切り替えるには

ずばり#Wです。全画面モードでも,画面分割モードでも同じです。

VZの編集テキストの扱いにおけるなかなか面白い例ですが,いくつものテキストをオープンしているときでも,2個のテキストだけが特別扱いになっています。

オープンしたファイルは,それぞれ固有のテキストワークが構造体によって与えられ,それぞれの環境のもとで編集されています。この編集環境を保持しているのが「編集テキスト変数」と呼ばれている変数群です。例えば,カーソル位置情報や表示属性,ファイル名,各種編集モードなどが228バイトに詰め込まれています。これらのテキストワークの先頭ポインタのうち,現在カーソルのある表テキストと裏テキストについて,それぞれwa,wbという変数によって指示されます。ActiveなWorkとBackgroundのWorkと覚えてください。

ファイルのオープン・クローズが行われると,テキストの配置が変更されたりするので注意しましょう。特にwaの指し示すテキストワークを割り当てられたテキストを閉じると,非分割時は裏テキストが,分割時は裏テキスト以外のファイルのうちで最も新しく開かれたファイルが表テキストになります。waの指すポインタは新たな表テキストになります。また編集テキスト番号wnは,若い番号のテキストが閉じられると順にずれていくので注意が必要です。

多数のファイルをオープンしているときに確実にテキストを切り替えるには

ファイルを切り替える簡単な方法はコマンド関数&#T(wn)を利用することです。しかし前項において,ファイルのオープン・クローズが行われると編集テキスト番号wnが変化するという点に触れたとおり,コマンド関数の引数となるwnが変化してしまう可能性が少しでもある場合は,確実な方法とは言えません。このような場合は,&#T()の引数として「テキストID」をマイナス符号付きで与えることにより,確実に目的のテキストに切り替えることができます。作業ファイルをオープン・クローズするようなケースでは,原則としてテキストIDによる切替を行いましょう。

テキストIDとは,ファイルがオープンされたときに自動的に発行される識別番号です。前項で述べたテキストワークに保存される2バイトの数値になります。テキスト構造体においては,wa..47に記録されている情報です。

例えば,ファイルAの一部を作業ファイル内で加工してからファイルBに出力するというケースにおいては,次のような手順になります。

        #R "a.txt" #m (s)?. a=id,       ;ファイルAのidを保存
        #O "b.txt" #m (s)?'y' b=id,     ;ファイルBのidを保存
 :a     &#T(-a)                         ;idを指定してファイルAに切替
        ;;なんかする - #< #b #> #k …のような行切出しとか
        #d (r)?>z                       ;…のようなマクロ終了判断はここで
        #R "nul" #m (s)?'y'             ;作業ファイルを開く
        ;;なんかする - 整形とか置換とかの加工ですね
        mb-, #_ #> #b #^ #< #y          ;加工物を切り取る
        #C                              ;作業ファイルを閉じる
        &#T(-b)                         ;idを指定してファイルBに切替
        ek[+, #i ek],                   ;加工物を貼り付ける
        >a                              ;ループみたいなこと
 :z     &#T(-b) &m("Done...")           ;成果を表示して終了とか

スクリーンモードを切り替えるには

NEC-98の場合は,画面モードと言えば「行間なし」の25行と「行間あり」の20行を切り替えるコマンド#66があります。30行BIOSなどの拡張表示ドライバを利用した場合は,さらにいくつかの画面モードがあるようです。一方,IBM-PCで拡張表示ドライバを利用すると,VZ側から変数vmを操作することで画面表示モードを切り替えることができます。

VZが使える画面表示モードは拡張表示ドライバに依存しますが,変数vmに値を格納してから再表示することで切替ができます。簡単に「再表示」と言いましたが,実はここのところが一筋縄ではまいりません(^^;。このような場合の再表示に使われる手法が,一旦コマンドラインに降りることです。

1 ^^ "" ?.
        vm=$70,         ;変数vmに値を格納
        &s #E #[ &d     ;コマンドラインに降りてすぐ戻る

このほか,拡張表示ドライバ付属のツールに任せるという方法も悪くありません。例えば,HP200LXのJKIT日本語環境におけるツールでは,lxdspd.exelxvm.comがあります。前者はVZ側でメニューを用意するなどすべて自前で詳細に行えますが,マクロは大きく難しくなります。後者はJKIT環境で準備した設定ファイルの範囲でしか選択できませんが,単純にツールを呼び出すだけですから内部マクロにもできるくらいです。いずれも上下分割時の行数配分調整は必要です。

後者のlxvm.comを呼び出す例です。通常実行ではコマンド#66を実行し,シフト実行でJKIT付属のツールを呼び出します。

1 ^KL "" (ks&1)??{ #66 . }
        (s)>?{ >A . >C >B }.
        :A #E >C
        :B #H
        :C "LXVM" #m
        &s mx+,
 :a     (s)?{ (wa)?#[ ?{ wa=wo, (z)?#[ } >a }   ;いつでも編集モード;Tomo
        (t1&wt)?#W (wt[)?{ (wt&2)?wh=lc/2, &#Y(0) } &#Y(0])
        (t)?#W #X #C &d mx-,

ファンクション表示を消去/再表示するには

老眼が進行したので大きなフォントを使うようにしたけれど,行数が減るのが不満。IBM-PCでは当然FEP用の予約行を設定していないけれど,ファンクションキーの表示すら消したい…。そんな要求(執念?)から生まれた,和生師匠入魂の一策・ファンキーでふを導入しましょう。

VZバージョン依存部分の再設定をお忘れなく。

= funkie.def =.06 by ζ゜ ;
*m
80 @F ""(s||wt)?.                               ;single only
        (ap^=pq..141..34)?r$302, ?r$201,        ;ap_inioptbuf:H'oka
        w=wo,r=lc<<8+lc-r,(wc){w=w..0,w..28=r,} ;wa.56:tw_sy, 57:tw_cy
        &s pn.-15=pn.4-,                        ;msgon, fkeymode
        r$7cbb,                                 ;vzibmj.com v1.6 : new line ★
;       r$81f3,                                 ;       t03k2 高橋版
        dz[=vz, r..6^=$5e6e, dz], &d            ;dec dh <--> nop
        &m($aa)
*

VZ Macro FAQ - screen
The VZ resources, valid XHTML 1.0 Strict. ©2005 by mezala.