home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 2001 June
/
VPR0106A.BIN
/
OLS
/
JED194V
/
JEDDOC.LZH
/
JEDMAC.DOC
< prev
next >
Wrap
Text File
|
1996-09-21
|
30KB
|
787 lines
[JED Macro programming guide]
******************************************************************
* *
* JEDマクロプログラミングガイド *
* [98版]/[DOS/V版]共通 *
* (JED Ver1.90以降) *
* *
* Copyright (C) 1993- H.Orikawa *
* *
******************************************************************
1993. 3.28 初版
11.16 改訂
12.15 改訂
1994. 7.28 誤記訂正
1996. 8. 7 一部改訂
9.21 一部改訂
■0.目次
----------------------------------------------------------------------
1.はじめに
1-1 JEDとVZ のマクロ
1-2 JEDのマクロの制限
2.文法説明
2-1 【演算子】
2-1-1 優先順位
2-1-2 単項演算子
2-1-3 二項演算子
2-2 【制御コマンド】
2-2-1 コマンド
2-2-2 制御構文
3.機能説明
3-1 【変数】
3-1-1 内部変数
3-1-2 システム変数
3-2 【関数】
3-2-1 標準関数
3-2-2 システム関数
3-2-3 コマンド関数
4.補足
5.おわりに
----------------------------------------------------------------------
■1.はじめに
JEDのマクロは条件分岐、ループ制御機能を持ったプログラム実行が可能
な構造化マクロで、その基本的な仕様はVZ(*)のマクロに準じています。
但し、プログラム実行に最低限必要な機能に絞ってあるため、VZ に完全準
拠ではありません。そのためVZ 用のマクロをそのまま実行しようとしてもま
ず動作しませんので、あらかじめご了承願います。
解凍ファイルに含まれているサンプルマクロには、できるだけ詳しいコメン
トを付けてありますので、本マニュアルと照らし合わせながらご覧になること
をおすすめします。
□ 1-1 JEDとVZ のマクロ
JEDとVZ のマクロの違いはそのマクロ定義書式にあります。
(例)
VZ | JED
----------------------+----------------------
* M マクロ | ←不要
(プログラム部分) | (プログラム部分)
* | ←不要
VZ では一つのXXX.DEF 形式のファイルにカスタマイズデータやマクロデー
タを混在記述できるため、各データの識別のために[*] で始まるヘッダ、フッ
タ部分を付けることになっています。
しかしJEDではマクロファイルは独立した物になっているので、そのよう
なヘッダ、フッタは不要です(というか、付いていると誤動作します)。
□ 1-2 JEDのマクロの制限
JEDのマクロの欠点として、JEDでは一つのマクロファイルに複数のマ
クロを定義できないことがあげられます。VZ のようにポップアップメニュー
を開けて、その中から必要なマクロを実行させるといったことができません。
ただし添付の"TEXTFORM.MCR"のように、ポップアップメニューからサブルー
チンコールの形でローカルマクロを呼び出す、といった手法はあります。
(*)VZ は(株)Village Centerの市販エディタです。
■2.文法説明
ここではマクロに使用する演算子やコマンドの基本的な仕様について
説明します。
□ 2-1 【演算子】
演算子は書式、優先順位とも基本的にC言語の仕様に準じています。
以下ではC言語の仕様と異なる部分を中心に説明します。
以下の説明の中で「変数」とは、2バイト(16ビット)の符号付き整
数を格納した変数を意味します。
○ 2-1-1 優先順位
演算子の優先順位は下表の通りです。従って、
a = 3 - 2 * 5 + 1,
の a の計算結果は(6)ではなく(-6)となります。しかし、この例のよう
な簡単な場合は別として、正確を期するためには
a = 3 - (2 * 5) + 1,
のように括弧を用いて優先順位を明示した方が無難でしょう。
(括弧は全ての演算子に優先するものとして式の評価を行います)
| (高) ← 優先順位 → (低) 演算の種類
------+--------------------------------------+-----------------
| (1) ++ -- ~ ! !! + - 単項演算
(高)|
| (2) [ ]
|
↑ | (3) . .. ポインタ演算
|
| (4) * / % 乗除算
優 |
| (5) + - 加減算
先 |
| (6) << >> ビットシフト
順 |
| (7) < <= > >= 比較演算
位 |
| (8) == !=
|
↓ | (9) & ^ | ビット演算
|
| (10) && || 論理演算
(低)|
| (11) = *= /= %= += -= &= ^= |= 代入演算
|
○ 2-1-2 単項演算子
これは1個の変数に対する演算で、結果はその変数に直ちに代入され
ます。
a[ | 変数a をスタックにプッシュ
a] | 変数a をスタックからポップ
| (注)スタックのネストは10段まで
|
a++ | 変数a に 1を加算(a = a + 1, と同じ)
a-- | 変数a から1を減算(a = a - 1, と同じ)
| (注)Cのような前置記法(++a,--a)はない
|
a~ | 変数a のビット反転
a! | 変数a のNOT
| a == 0のとき1 、それ以外では0 を返す
| (注)Cの記法(!a)とは異なる
|
a!! | 変数a の上・下位バイトを反転する
|
a+ | 変数a に1を代入(a = 1 と同じ)
|
a- | 変数a に0を代入(a = 0 と同じ)
|
○ 2-1-3 二項演算子
これは2個の変数に対する演算で、結果は内部レジスタに、また代入
演算の場合はさらに左辺の変数に格納されます。
(*) 内部レジスタ....右辺値計算結果の格納や条件分岐、ループ制御時
に参照される変数で、ユーザーはアクセスできな
い。
a.ofs | a をポインタとしてofs バイト先のバイトデータを返す
| (例)a = "12345", として、
| c = (a.2), は変数c に文字'3'の値(33h)を返す
|
a..ofs | a をポインタとしてofs ワード先のワードデータを返す
| (例)a = "あいうえお", として、
| c = (a..2), は変数c に文字'う'の値(A482h)を返
| す(シフトJIS漢字コードの上/下位が反転して
| いることに注意)
| 実際の使用例は添付の"ZENHAN.MCR" を参照のこと
|
□ 2-2 【制御コマンド】
○ 2-2-1 コマンド
[記号の意味]
A ラベル名(半角英大文字 A ~ Z)
nn ローカルマクロ番号(2桁の数字。2桁に満たない場合は先
頭を0 で埋める(01,02など))
n 整数値
◆ ラベル ---------------------------------------------------------
:A ラベル(分岐命令の飛び先指定用)
nn: ラベル(ローカルマクロ、ポップアップメニュー用)
◆ 関数呼び出し ---------------------------------------------------
#nn nn番の標準関数呼び出し
nnには予め定義済みの短縮文字も使用可(#d,#mなど)
&nn nn番のローカルマクロ呼び出し
&a システム関数呼び出し(3-2-2項参照)
◆ 分岐(ジャンプ)命令 -------------------------------------------
>A ジャンプ(GOTO)
>^ 現在実行中のローカルマクロの先頭に戻る
>> 次のマクロにジャンプ
>+n, >-n n 番目のマクロにジャンプ
◆ ポップアップメニュー -------------------------------------------
!nn nn番のポップアップメニューを呼び出す
但し、内部的な呼び出し手順はローカルマクロに準じる
ので、マクロ番号と重複しないこと
結果は内部変数 [r] に格納される
r > 0 選択されたメニュー項目番号
r = -1 [ESC]キーによりキャンセルされた場合
[メニューの記述形式]
+- メニュー番号(コロン[:]が必ず必要)
| +- メニュータイトル(省略時は "" とする)
| | +- メニューの幅
| | | +- 項目数
| | | |
01: "タイトル", 20, 3
"項目 1"
"項目 2"
"項目 3"
.
|
+- ピリオド(必ず必要)
◆ その他 ---------------------------------------------------------
. 現在実行中のマクロ、ポップアップメニューから呼び出
し元に戻る
/ マクロを終了させる
'a' 文字a
"string" 文字列string
式, 「式」を評価、実行(最後に','(カンマ)を付けること)
(注)文字(列)中に[']["]及び[\]を入れる時は、[\]を用いて
'\''
"\'\""
'\\'
などのように記述してください。
○ 2-2-2 制御構文
以下の説明の中で「ブロック」とは、
{ }、( )、' '、" " で囲まれた式、文字、文字列等
# 、& で始まる関数
を指します。
◆ ループ制御(Cのwhile文 に相当) -------------------------------
(式){ブロック}
「式」の回数だけ「ブロック」を実行
「式」が最初から 0 でも一度は実行する
「式」を -1 とすると無限ループとなる
(例)(5){#d} カーソル右移動を5回
◆ 条件分岐 (Cのif文に相当) -----------------------------------
(式)?{ブロック}
「式」の結果が真(非0) の時ブロックを実行
(式)??{ブロック}
「式」の結果が偽(0) の時ブロックを実行
(式)?{ブロック1}?{ブロック2}
「式」の結果が真(非0)ならブロック1を
偽(0) ならブロック2を実行
◆ 多重分岐 (Cのswitch文に相当) -------------------------------
(式)>?{ブロック, ...}
「式」の値に対応したブロック内のコマンドを
実行
「式」が0 の時はスキップする
(例)(n)>?{#d #s {#x #d}}
n が1の時#d、2の時#s、3の時{#x #d}を
実行
ブロック中で、引数をとる関数(&b(0)など)を
記述する場合は( )で囲って下さい。
(例){ &b(0) a = 1 #m ..... } ×
{ (&b(0)) (a = 1) #m ..... } ○
(注)これら3つの構文は、ネストさせると期待した動作をしないことがあり
ます。
■3.機能説明
ここではマクロで使用可能な変数及び関数群について説明します。
□ 3-1 【変数】
○ 3-1-1 内部変数
ユーザーが自由に使用できる変数で、変数名として
[a] ~ [z]
[aa] ~ [zz]
[fa] ~ [fd], [fx], [fy]
の計58個が使用できます。
このうち、[r] はシステム関数の戻り値格納用として使用されますの
で、特別な理由がない限りこれに値を代入することは避けて下さい。
○ 3-1-2 システム変数
システムがマクロコマンド実行後に値を設定する専用の変数で、以下
の17個が定義されています。
これらの変数はマクロプログラム側から参照できますが、ユーザーが
設定することはできません。つまり、比較演算(==,<,など) だけが可能
となっています(ここがVZ と異なる点です)。
なおシステム変数は、参照される毎にその定義内容に従った値を算出
するようになっています。
変数名 | 内 容
----------+-----------------------------------------------------
ks | シフトキー押し下げ状態
| 下に示す8ビット数値について各キーに対応した
| ビットがたつ。
| [98版]
| (MSB) (LSB)
| 7 6 5 4 3 2 1 0
| - - - CTRL GRPH カナ CAPS SHIFT
|
| [DOS/V版]
| (MSB) (LSB)
| 7 6 5 4 3 2 1 0
| - - - - ALT CTRL SHIFT SHIFT
|
| 複数のキーが押された場合はそれらに対応するビッ
| トの論理和(OR)となる。
| (例)
| [98版] [DOS/V版]
| 0 = (シフトキー類は押されていない)
| 1 = [SHIFT] --
| 2 = [CAPS] --
| 3 = [CAPS]+[SHIFT] [SHIFT]
| 4 = [カナ] [CTRL]
| 8 = [GRPH] [ALT]
| 12 = [GRPH]+[カナ] [ALT]+[CTRL]
|
cd | カーソル位置の文字コード
| 0Dh(13) = [CR]
| 0Ah(10) = [EOF]
| その他 = 文字コード
|
ck | カーソル位置の文字種
| 0 = 半角(1バイト文字)
| 1 = 漢字(2バイト文字)
|
ct | カーソル位置の文字タイプ
| 0 = [EOF]
| 1 = [CR]
| 2 = 半角/全角空白、制御記号
| 3 = 半角/全角記号
| 4 = ひらがな
| 5 = 全角文字
| 6 = 半角文字
|
ht | 現編集テキストのタブカラム数
|
lh | 論理行先頭からのカーソルの相対Y位置 (1~)
| (行折り返しのある場合)
|
ln | カーソル位置の論理行番号 (1~)
|
lx | カーソルのカラム位置 (0~)
|
ly | カーソルのウィンドウ内Y座標 (0~)
|
mi | 挿入/上書モード
| 0 = 挿入
| 1 = 上書き
|
mr | テキスト修正フラグ
| 0 = 修正なし
| 1 = あり
|
we | 現編集テキストの表示カラム数
|
wn | 現編集テキスト番号
| 0 = クリップボード
| 1~ テキスト
|
wt | 画面分割モード
| 0 = 全画面
| 2 = 横分割の上側
| 3 = 下側
| 4 = 縦分割の左側
| 5 = 右側
|
wx | ウィンドウ横幅(枠を含まない)
|
wy | ウィンドウ縦幅(枠を含まない)
|
pc | JED起動パス名へのポインタ
|
pi | マクロ読み込みパス名へのポインタ
| -m<マクロファイル名> をつけて起動した時のみ有効
|
pw | 入力文字バッファへのポインタ
| 後述のシステム関数 &g での入力結果が格納される
□ 3-2 【関数】
○ 3-2-1 標準関数
この関数は
# + '2桁の数字'もしくは'英1文字'
で表記され、JEDの編集機能の全てを実現できます。
詳細はJEDマニュアル(JED.DOC)3-2項を参照して下さい。
○ 3-2-2 システム関数
標準関数以外にマクロプログラム専用に用意された関数群です。
& + '英小文字'
で表記され、一部の関数では引数をとります。
引数表現の中では、
"文字列":半角64文字以内
p = "文字列",
として、p を代用しても良い
(この場合p は文字列へのポインタとなります)
n :整数値、式または変数
16進数値の場合は先頭に'$' 記号を付ける($1Bなど)
このときA ~F は必ず大文字で記述すること
c :文字
----------------------------------------------------------------------
◆ &a("文字列") .................... Alarm with message
----------------------------------------------------------------------
"文字列"で示されるメッセージを表示する
入力されたキーに対応して内部変数[r] に下記の値が格納される
r = 1 [Y] キーが押された
r = -1 [ESC] キーが押された
r = 0 上記以外のキーが押された
(例)&a("なにかキーを押して下さい")
----------------------------------------------------------------------
◆ &b(n) ........................... Beep
----------------------------------------------------------------------
n が0 以外のときビープ音を鳴らす
(例)&b(1) ;”ピー”と音がする
----------------------------------------------------------------------
◆ &c .............................. Console I/O
----------------------------------------------------------------------
キーボードからの入力をそのまま出力する
入力が文字以外の時はキー定義に従った機能を実行する
入力されたコードは内部変数[r] に格納される
r < $100(256) 文字コード
r >= $100 機能番号 + $100(256)
後出の&p &o(r)を続けて実行した場合と同じ動作である
----------------------------------------------------------------------
◆ &d .............................. Display
----------------------------------------------------------------------
画面を強制的に再描画する(デフォルト)
このコマンド実行後は機能終了毎に画面表示を行なう
通常&sと組み合わせて使用する
----------------------------------------------------------------------
◆ &e("文字列") .................... Execute macro
----------------------------------------------------------------------
"文字列"で示されるマクロを実行する
但し、&c &p &l といったコンソール入力を伴うシステム関数は不可
(例)&e("#d#d#d") ;カーソルを右に3つ移動
----------------------------------------------------------------------
◆ &f(c, "文字列") ................. Find
----------------------------------------------------------------------
"文字列"の中からc と一致する文字を検索する
結果は内部変数[r] に格納される
r >= 0 見つかった位置("文字列"の先頭を0としたときのオフセ
ット)
r = -1 見つからない時
(例)&f('c', "abcdef")
&m("cは%d番目にありました", r)
----------------------------------------------------------------------
◆ &g("文字列") .................... Get string with message
----------------------------------------------------------------------
"文字列"をタイトルに入力用ウィンドウを開く
入力文字種に従って内部変数[r] に値が設定される
r = -1 [ESC] キーが押された
r = -2 [CR] キーが押された
r = 0 数字以外が入力された
r = (上記以外) 入力数値
文字列はシステム変数pwに格納される
(例)&g("文字を入力して!")
&m("文字は[%s]です", pw)
----------------------------------------------------------------------
◆ &h .............................. Hexadecimal
----------------------------------------------------------------------
カーソル以降の1語を16進数値とみなして、内部変数[r] に格納
(例)&h
&m("数値は%xです", r)
----------------------------------------------------------------------
◆ &k .............................. Key input
----------------------------------------------------------------------
DOSのファンクションコールを使って、コンソール入力を行なう
キー入力待ちはしない
入力コードは内部変数[r] に格納される
(例):A &k ;[ESC]が押されるまでループ
(r != $1B) ? >A
----------------------------------------------------------------------
◆ &l .............................. Line input
----------------------------------------------------------------------
[CR]または[ESC]が入力されるまでキーボードからの入力を受付ける
(例)&m("[CR]キーを押すまで入力します")
&l
&m("入力を終了しました ")
----------------------------------------------------------------------
◆ &m("書式文字列"<,パラメータ,...>) ... Message
----------------------------------------------------------------------
指定した書式に従って数値や文字列を画面左下隅に表示する
パラメータの数は最大5個まで
"書式文字列"に記述できる書式指定子はCのprintf関数で使用するもの
とほぼ同じで、
%[-][n] (nは整数値)
の後に下記の記号を付加する
d | 符号付き10進数
u | 符号無し10進数
x | 16進数
s | 文字列
c | 文字
n はフィールド幅で、前に'-' を付けるとそのフィールド内で左詰めで
表示する('-' を指定しないときは右詰め)
(例)&m("a=%5d", 123) ---> 実行結果は a=__123
&m("a=%-5d", 123) ---> 実行結果は a=123__
またn の前に'0' を付けると余白を'0' で埋める.
(例)&m("a=%05d", 123) ---> 実行結果は a=00123
'%' 自身を出力する場合は&m("%%") のように2つ続けて記述する
----------------------------------------------------------------------
◆ &?("文字列") .................... output string
----------------------------------------------------------------------
文字列を現カーソル位置に出力する
(例)p = "ABCXYZ",
&?(p)
----------------------------------------------------------------------
◆ &n .............................. Numeric
----------------------------------------------------------------------
カーソル以降の1語を10進数値とみなして、内部変数[r] に格納
(例)&n
&m("数値は%dです", r)
----------------------------------------------------------------------
◆ &o(c) ........................... Output
----------------------------------------------------------------------
引き数(c) の値に応じて文字出力または機能実行する
c < $100(256) 文字コードとみなし文字を出力
c >= $100 機能番号 + $100(256)とみなし番号に対応した機
能を実行
(例)&o('a') ;文字'a' を出力
&o(256+12) ;行末へジャンプ(機能番号#12を実行)
または
&o($10C)
----------------------------------------------------------------------
◆ &p .............................. Pause
----------------------------------------------------------------------
キーボードから1文字入力されるまで待つ
入力された文字は内部変数[r] に格納される
[r] に設定されるデータの意味については&cの項を参照のこと
(例)&p ;キー入力を待ち
(r < $100) ? { &o(r) } ;機能コード以外なら出力
----------------------------------------------------------------------
◆ &q .............................. Quit
----------------------------------------------------------------------
現在実行中のローカルマクロ(*)を中断してメインループに戻る
(*)ローカルマクロ:サブルーチンとして呼ばれたマクロ
----------------------------------------------------------------------
◆ &s .............................. Silent
----------------------------------------------------------------------
画面表示及びカーソル表示を停止する
マクロ実行中の画面のチラつきを防ぐために使用する
&dが実行されるまで継続する
----------------------------------------------------------------------
◆ &t .............................. Trace
----------------------------------------------------------------------
マクロを1ステップずつ実行する(マクロのデバッグに使用)
次に&tに出会うか、[CR]キーが押されるまで継続される
現在のマクロ実行位置を画面右下に表示する
次のステップに進むときは[CR]以外のキーを押す
----------------------------------------------------------------------
◆ &u(c) ........................... change to Upper character
----------------------------------------------------------------------
文字c が英小文字の場合にこれを大文字に変換し、内部変数[r] に返す
(例)&u('a')
&m("aの大文字は%cです", r)
----------------------------------------------------------------------
◆ &v(n) ........................... cursor View
----------------------------------------------------------------------
カーソル表示制御
n = 0 表示オフ
1 表示オン
----------------------------------------------------------------------
◆ &x(n) ........................... cursor location X
----------------------------------------------------------------------
ウィンドウの左端を0 としてカーソルをn の位置に移動する
(注)行末以降には移動しない
----------------------------------------------------------------------
◆ &y(n) ........................... cursor location Y
----------------------------------------------------------------------
ウィンドウの上端を0 としてカーソルをn の位置に移動する
(注)最終行(EOF行)以降には移動しない
----------------------------------------------------------------------
◆ &z(n) ........................... FEP control
----------------------------------------------------------------------
FEP制御
n = 0 FEP オフ
1 FEP オン
-1 FEP 状態取得
実行後、内部変数[r] には
n = 0/1 の時、直前の FEP状態(0 = OFF, 1 = ON)
-1 の時、現在の FEP状態
が格納される
○ 3-2-3 コマンド関数
標準関数以外にマクロプログラム専用に用意された関数群です
& + # + '数字' or '英小文字' + (引数)
で表記されます
----------------------------------------------------------------------
◆ r(n) .......................... scroll up
----------------------------------------------------------------------
引数 n の行数分だけ文頭方向にスクロールする
(注)文頭以前には移動しない
----------------------------------------------------------------------
◆ c(n) .......................... scroll down
----------------------------------------------------------------------
引数 n の行数分だけ文末方向にスクロールする
(注)文末以降には移動しない
----------------------------------------------------------------------
◆ J(n) .......................... Jump
----------------------------------------------------------------------
引数 n で示される行番号にジャンプする
(注)n が現テキストの最大行数を越える場合は最終行にジャンプ
----------------------------------------------------------------------
◆ T(n) .......................... change Text
----------------------------------------------------------------------
引数 n 番のテキストに移動する
n = 0 の時はクリップボード
----------------------------------------------------------------------
◆ Y(n) .......................... split type
----------------------------------------------------------------------
引数 n に応じて画面分割形式を変更する
n = 0 : 全画面
2 : 上下分割
4 : 左右分割
----------------------------------------------------------------------
◆ D(n) ......................... output space
----------------------------------------------------------------------
現カーソル位置から n カラムまでスペース(半角空白)を出力する
(注)n がカーソル位置より小さい時は何もしない(n = 0~)
■4.補足
・実際のマクロ作成に際しては、同梱の下記サンプルマクロを参考にして
下さい。
AUTOKETA.MCR 自動桁折り
BLOCK .MCR 矩形ブロック編集
CSCONV .MCR 英大文字、小文字相互変換
GAME .MCR テトリスもどきゲーム
KEISEN .MCR 簡易罫線描画
OUTLINEJ.MCR アウトライン作成用
OUTLINET.MCR 同上、インデント対応版
TABSPC .MCR タブ←→空白変換
TEXTFORM.MCR 文書整形支援
ZENHAN .MCR 全角半角相互変換
PAD .MCR PADファイル作成 (中井正博氏 作)
PRT .MCR PRT++用文字装飾( 同 )
REFORM .MCR 段落整形(T.Tanomura氏 原作、Ari-P氏 作)
・マクロバッファサイズは約5KBで固定です。
・^OR マクロの読み込み
^\ マクロの実行
なお、マクロの第1行目に
?.
を記述することで、2回目に^\が押された時に実行中のマクロ
を終了させることができます。
・マクロ実行中にループに入ってしまった時(暴走ともいう)は、
[CTRL]+[GRPH]/[ALT](場合によっては +[任意のキー])
を押すことで大抵の場合強制終了させられます。それでもダメな時は
残念ですがリセットボタンを押す準備をして下さい。
■5.おわりに
本マニュアルではJEDのマクロの基本的な機能を説明しました。実
際のプログラミングについての詳細は市販のVZ エディタのマクロ解説
本が参考になると思います(^^)。
マクロに関して不明の点がありましたら、下記まで連絡下さい。私に
わかる範囲で(^^;) 説明いたします。
NIFTY-Serve
FGALDC 10番会議室(エディタ・ワープロ)
MHG00017 折川(orik)浩