MMマクロ マアニュアル
MMマクロについて
MMマクロは ソースコードデバッガ付属 の高機能なマクロ言語です。
言語体系は C言語のサブセット となっています。
C言語に不慣れな人でもシステム関数だけを使ってかなり便利なマクロが
組めますのでがんばってプログラミングしてください。
慣れればそんなに難しいものではありませんし、またC言語の勉強にもなります。
C言語はBASIC言語に比べはるかに強力な演算子をもち高速に動作します。
最近インターネット上の言語として注目されている JAVA言語 とも基本的な
演算子等は同じですので相通じるものがあります。
MMマクロには以下の特徴があります。
・作成したマクロのデバッグが、ソースコードデバッガでできます。
・インタプリタ方式なので、作成したマクロが即実行できます。
・外部のマクロファイルをマクロプログラム中から呼び出す事ができます。
・関数内のみで有効な自動変数が使用できます。
・各マクロファイル間で共通に使える大域変数がありますので、
マクロファイル間で連携したプログラムを組むことができます。
・すべてのキーコマンドをマクロプログラムより呼び出す事ができます。
言語体系
言語体系は C言語のサブセット となっています。概略は次の通りです。
C言語自体の文法や構文については、市販のC言語の教科書等をご覧ください。
・各マクロファイル間で共通に使えるMM大域変数が5個あります。
この変数はMMエディタ95 の起動時に0に初期化されます。
・MMエディタ95 の状態を知るための27個の システム変数 があります。
システム変数の値を直接変更することはできません。
・プログラム作成のための134個の システム関数 があります。
・変数の型の種類は1バイト(8ビット)系のchar型、4バイト(32ビット)系の
int型、ポインタ型と配列型が使用できます。
ポインタの配列や多次元配列も使用出来ます。
・int型は4バイト(32ビット)の値を持ちますので
-2,147,483,648 から 2,147,483,647 までの範囲の値を持つことができます。
・変数および関数の名前は半角で24文字まで有効です。
・変数の型の定義、関数のプロトタイプ宣言はありません。
・変数はグローバル変数とローカル変数(自動変数)の2種類が使えます。
extern、static宣言はありません。
・コンマ演算子、型変換、sizeof演算子は使えません。
・switch文、do文、for文、continue文、goto文は
使えません。
プログラミングの注意点
MMマクロ言語はマクロ言語ではありますが、 れっきとしたC言語 です。
C言語はBASIC言語に比べはるかに強力な演算子をもち高速に動作しますが、
その分使い方を誤ると簡単に誤動作したりしますので以下のことに留意して
プログラミングをして下さい。
これは、MMマクロ言語だけではなく普通のC言語のプログラミングにも当てはまり
ます。
・配列の宣言
配列を使う前には宣言が必要ですが、必ず使用するだけの配列エリアを確保
して下さい。宣言した以上のエリアにデータを書き込んでも警告は出ませんが
これが誤動作の元になります。
例えば、char str[10]; として10バイトの配列のエリアを確保しておいて
Strcpy(str, "123456789012345"); とすると str へ16バイト(15バイト
+1バイト(ヌル文字))がコピーされます。
str のエリアは10バイトしかないので、後の6バイトは別のエリアに書き込ま
れてこれが誤動作の原因となります。
この場合なら str のエリアは最低16バイト確保しておく必要があります。
・ポインタは必ず値を与えてから使う
宣言しただけのポインタをいきなり使うと誤動作の元です。
例えば、char *pt; として宣言しておいて
Strcpy(pt, "12345"); とすると アドレスの定かでないエリアへデータが
書き込まれてしまいこれが誤動作の原因となります。
ポインタは使う前に pt = dest; pt = &dest[0]; 等と必ず値を与えてから使って下さい。
・繰り返しの処理では抜ける手段を設ける
マクロでは、繰り返しの処理をよく行います。
例えばテキストの先頭行から最終行までで条件にマッチした行に対して何かを
おこなうとかです。
こういう場合すべてが上手く行けば問題無いですが、場合によってはマクロが
正常に終わらないということがあります。もちろんプログラミングに何らかの不具合
があるのですが、それで終了出来ないというのではまずいので必ず何らかの方法で
終了出来るようにしておきます。
例えば以下の場合は、[ESC]キーが押されると繰り返し処理を中止します。
while(1) // 繰り返し何らかの処理をおこなう
{
KbHit(); // キーが押されたかをチェック
if(Result == 0x1b) // [ESC]が押されたら中断
break;
・・・・・・・・・
・・・・・・・・・ // 何らかの処理
}
・簡単なサンプルマクロ
このマクロは検索を行ないます。
文字列が範囲指定されている場合は その文字列を検索文字列としてセットして
から検索を開始します。
main()
{
char fstr[260], line[260];
int len, spos, epos; // spos = 選択開始位置. epos = 終了位置
if(Block) // 選択モードなら
{ // 範囲指定されている文字列を検索文字列として得る
if(Col > Selcolm)
{ // 順方向の範囲選択
spos = Selcolm - 1;
epos = Col - 2;
}
else
{ // 逆方向の範囲選択
spos = Col - 1;
epos = Selcolm - 2;
}
Getline2(line); // 現在行の内容を画面のイメージで line[] へ取得する
// 検索文字列を fstr[] へセット
len = epos - spos + 1; // 文字列の長さ
if(len > 0 && len < 250) // 一応長さをチェックする
{
Strncpy(fstr, &line[spos], len);
SetFindS(fstr); // 検索文字列のセット
Select(0); // 必要であれば、選択モード 解除
}
}
SetFind(0x0); // 必要であれば、検索フラグのセット
Find(); // いよいよ 検索開始 !!
}
エラーメッセージ
エラーメッセージについて
読み込まれたマクロプログラムは、まず字区解析されコード展開されます。
この間にエラーが生じるとエラーNo.とエラーメッセージを表示して終了します。
エラーがなくコード展開が正常に終わるとコードを実行します。
字区解析エラーメッセージ
以下の 字区解析エラーメッセージ があります。左端の数字はエラーNo.です。
1 マクロエラーが発生しました
2 サポートされていないキーワードです
3 8 or 9 は8進数ではありません
4 ヌル1文字定数があります
5 1文字定数フォーマットエラー
6 文字列定数フォーマットエラー
7 コメントで終了マークがありません
8 無効な文字です
9 コントロール文字です
10 文字列登録オーバーフロー
11 固定変数登録オーバーフロー
コード展開エラーメッセージ
以下の コード展開エラーメッセージ があります。左端の数字はエラーNo.です。
21 変数の二重登録です
22 登録変数のサイズが0です
23 変数名は登録されていません
24 関数の二重登録です
25 関数名はすでに登録されています
26 関数が登録されていません
27 識別子.変数 展開データエラー
28 展開データエラー
29 代入文 る展開データエラー
30 関数の呼び出し 展開データエラー
31 変数のサイズが0です
32 ADD 右の変数エラー
33 SUB 右の変数エラー
34 配列 左の変数エラー
35 数字.定数 左の変数エラー
36 代入文 左の変数エラー
37 関数の呼び出し 左の変数エラー
38 代入文で左項目(固定変数)エラー
39 ポインタ アドレス処理エラー
40 変数の型エラー
41 BREAK がループの外です
42 プログラムのネステングエラー
51 認識できない文法があります
52 関数の引き数 文法エラー
53 変数の形宣言がありません
54 次の関数、変数、定数がありません
55 が必要な位置で見つかりません
56 変数 登録オーバーフロー
57 変数名参照ができません
58 関数 登録オーバーフロー
59 関数名、変数名 登録オーバーフロー
60 展開データ 登録オーバフロー
61 展開データが参照できません
62 変数(ポインタ,配列)の形 登録オーバフロー
63 変数入替ができません
64 右の変数処理ができません
65 左の変数処理ができません
66 アドレス処理ができません
67 プログラムのネスティング オーバフロー
68 プログラムのネスティング オーバフロー
69 プログラムのネスティング アンダフロー
70 コードデータ登録 オーバフロー
コード実行エラーメッセージ
以下の コード実行エラーメッセージ があります。左端の数字はエラーNo.です。
91 疑似スタックオーバーフロー
92 終了時で 疑似スタックエラー
コード実行は正常に終了しましたが関数呼び出しの引数のPUSHとPOPの数が
全体で合っていません。このエラーは引数の数を誤ってセットして関数を呼び出し
たときに発生します。
93 代人で スタックエラー
94 実行コードエラー
95 関数の引き数の数があっていません
96 存在しない関数が呼ばれています
97 POPUP 疑似スタック オーバーフロー
98 PUSH 疑似スタック オーバーフロー
99 POP 疑似スタック オーバーフロー
システム変数
各マクロファイル間で共通に使えるMM大域変数(int型)が5個あります。
このMM大域変数はMMエディタ95 起動時に0に初期化されます。
以下が、5個のMM大域変数(int型)です。
・Global1
・Global2
・Global3
・Global4
・Global5
MM大域変数 は
[矩形ブロックの切り取り][矩形ブロックのコピー][矩形ブロックの挿入]の
各マクロの中で使用しています。参考にしてください。
他に参照できる以下の、27個の システム変数 (int型)があります。
変数は現在の値を常に保持していますのでいつでも参照できます。
変数の値を直接変更することはできません。
・Xmax カラム方向へのカーソルが移動できる最大位置
ウインドウの大きさが変わると変わります
・Ymax 行方向へのカーソルが移動できる最大位置
ウインドウの大きさが変わると変わります
・Xpos 表示開始カラム位置(先頭は0)
・Xcsr カーソルカラム位置(先頭は0)
・DXcsr 表示カーソルカラム位置(先頭は0)−疑似カーソル位置
・Ycsr カーソル行位置(先頭は0)
・Col 論理カラム位置(先頭は1)
・DCol 表示論理カラム位置(先頭は1)−疑似カラム位置
・Cecp テキスト先頭よりの現在位置(先頭は0)
・Line 現在の行位置(先頭行は1)
・Totalline 全体の行数
・Linelen 現在の表示行1行の長さ(改行は含みません)
・Linelen1 現在の論理行1行の長さ(改行は含みません)
・Margin 折り返し文字数(10ー250)
・Tab タブの文字数(2・4・8)
・Tln 画面トップ行に表示されている行No。
・Ins インサートモード 1=ON、0=OFF
・Indent インデントモード 1=ON、0=OFF
・Code カーソル位置の文字コード
・Kcode カーソル位置の文字種 1=全角、0=半角
・Tcode カーソル位置の文字タイプ
0=EOF(テキストの終わり)
1=改行
2=00H - 20H、全角スペース(8140H)
3=半角記号、全角記号(8141H - 8151H,815CH - 824EH)
4=全角ひらがな(829FH - 82F1H)
5=上記以外の全角文字
6=上記以外の半角文字
・Block 現在の選択モード
0=非ブロック、 1=行ブロック
2=文字ブロック、3=矩形ブロック
・Result マクロ関数の戻り値
・Linestat 現在行の評価値
0=改行で終了している
1=改行で終了していない
−1=EOF行
−2=EOF行より下の行
・Selcolm 選択開始カラム位置
・IMEStatus IMEの状態
0=OFFの状態
1=ON の状態
・OpenFType ファイルを開くで使用するダイアログのタイプ
0=ビュアー付きダイアログ
1=95標準のダイアログの状態
・Sakuzu 罫線作図モード
1=ON、0=OFF
・SakuzuPen 罫線作図での罫線の太さ
1=太線、0=細線
システム関数一覧
以下、134個の システム関数 があります。
戻り値のある関数の値はシステム変数 Result へセットされます。
・検索系
Find(); 検索
FindNext(); 次(↓)を検索
FindPrev(); 前(↑)を検索
Replace(); 置換
Top(); テキストの先頭へ
GoLine(); テキストの指定行へ
Bottom(); テキストの最後へ
Mark(); カーソル位置をマーク
MarkJamp(); 最後にマークしたカーソル位置へ
PrevCur(); 直前のカーソル位置へ
Parent(); 対応する ()、[]、{、<> へ
TagJamp(); タグジャンプ
・検索モード系
SetFind(); 検索フラグのセット
SetFindS(); 検索文字列のセット
SetRep(); 置換フラグのセット
SetRepS(); 置換文字列セット
・カーソル系
Up(); カーソル移動(↑)
Down(); カーソル移動(↓)
Left(); カーソル移動(←)
Right(); カーソル移動(→)
Backward(); 1語左へ
Forward(); 1語右へ
LDEdge(); 表示行頭へ
RDEdge(); 表示行末へ
LEdge(); 論理行頭へ
REdge(); 論理行末へ
RollUp(); スクロールアップ
RollDown(); スクロールダウン
PageUp(); ページアップ
PageDown(); ページダウン
TopScr(); 画面の上端へ
BotomScr(); 画面の下端へ
GoBlok(); 選択ブロックの先頭、最後へ
・編集系
InsMode(); 挿入モードの切り替え
Ret(); リターンキー
Bs(); BSキー
Del(); DELキー
DelBWord(); 語の先頭まで削除
DelWord(); 語の終わりまで削除
DelLine(); 1行削除
DelBefor(); 行頭まで削除
DelAfter(); 行末まで削除
InsLine(); 1行挿入
PopChr(); 削除文字の復活
PopLn(); 削除行の復活
Tabs(); タブキー
ConvWord(); 1語、大/小文字変換
Select1(); 行選択モード
Select2(); 矩形選択モード
BlokCut(); ブロック切り取り
BlokCopy(); ブロックコピー
BlokPast(); プロック貼り付け
BlokIns(); ブロック挿入
StackDel(); ブロックスタックのテキスト削除
GetFindS(); カーソル位置の文字列を検索文字列として取得
Select(); 選択モードのセット
AIndent(); オートインデントの切り替え
DispOff(); 画面非表示モード
DispOff2(); 画面非表示モード(ステータスバー、ルーラーへも禁止)
DispOn(); 画面再表示モード
GotoX(); カーソルをxカラム位置へ
GotoY(); カーソルをy行目へ
SetSakuzu(); 罫線作図モードの切替え
SetSakuzuPen(); 罫線作図での罫線の太さの切替え
・クリップボード系
ClipCut(); クリップボード切り取り
ClipCopy(); クリップボードコピー
ClipPast(); クリップボード貼り付け
Delete(); テキストの削除
・文字列操作系
PutSpace(); カーソル位置からxカラム目までをタブ、スペースで埋める
PutStr(); 文字列の出力
GetStr(); ダイアログを表示して文字列を入力
GetStr2(); デフォルト入力文字列でダイアログを表示して文字列を入力
PutChr(); 文字の出力、コマンドキーの実行
StrChr(); 文字を文字列より検索
InKeyCmd(); 文字、又はキーコマンドの入力
InKeyChar(); 制御文字を含む文字の入力
・矩形ブロック系
KBCut(); 矩形ブロック切り取り
KBCopy(); 矩形ブロックコピー
KBIns(); 矩形ブロック挿入
・ユーティリティー系
MacroEx(); 外部マクロの実行
Beep(); ビープ音の出力
FPrint(); 書式付き文字列出力
GetDate(); 日付の取得
GetWeek(); 曜日の取得
GetTime(); 時刻の取得
KbHit(); キーが押されたか
Getline(); 現在行の内容の取得
Getline2(); 画面のイメージで現在行の内容の取得
GetFileName(); 編集中ファイル名の取得
GetCurDirectory(); カレントディレクトリの取得
LoadSdFile(); 表示設定書式ファイルの読込み
LoadPrFile(); 印刷書式ファイルの読込み
SetCurDirectory(); カレントディレクトリの変更
SetIMEStatus(); IMEの状態の取得
SetOpenFType(); ファイルを開くのダイアログのセット
WinExec(); 外部のプログラムを起動する
Message(); メッセージを表示する
Menu(); メニューを表示する
GetKeyState(); 特定のキーが押されているか調べる
GetVersion(); MMのバージョンの取得
・ファイル系
Open(); ファイルを開く
Save(); ファイルを保存
Close(); 確認なしでファイルを閉じる
CloseAs(); 確認ありでファイルを閉じる
・Cライブラリ文字列操作系
Strcpy(); 文字列をコピーします
Strncpy(); 文字列を指定バイト数コピーします
Strcat(); 文字列を連結します
Strcmp(); 文字列を比較します
Strcmpi(); 文字列を比較します
Strlen(); 文字列の長さを調べる
Atoi(); 文字列を数字へ変換する
Itoa(); 数字を文字列へ変換する
Memset(); メモリを指定の文字で埋める
Strstr(); 文字列の中を指定の文字列で検索
・ウインドウズ系
SetWindowCascade(); ウインドウのカスケード表示
SetWindowVTile(); ウインドウの縦タイル表示
SetWindowHTile(); ウインドウの横タイル表示
NextWindow(); 次のウインドウへ移動する
LoadLibrary(); DLLのロード
FreeLibrary(); DLLの開放
SetWindowText(); キャプションへ文字列を表示
GetWindowText(); キャプションに表示されている文字列の取得
MaxWindow(); ウインドウを最大化します
MinWindow(); ウインドウを最小化します
RestWindow(); ウインドウを元の大きさへ戻します
・ダイレクトファイルI/O系
LOpen(); ファイルをオープンします
LCreat(); ファイルを作成します
LSeek(); ファイル読み込み位置の設定
LClose(); ファイルを閉じます
LRead(); ファイルより読み込み
LWrite(); ファイルへ書き込み
DeleteFile(); ファイルを削除します
・レジストリ系
GetRegiStr(); レジストリ文字列データの読み込み
GetRegiInt(); レジストリ整数値データの読み込み