Text-C
プログラミング言語「Text-C」は、C言語をベースに文字列処理に適したテキストライブラリとプロパティを追加したWZのマクロ言語です。
Text-Cは、下記のプログラムツールに対応しています。
コマンドによる編集テキストの操作、ツールによる編集テキストのステータス表示、プラグインによるWZのカスタマイズが可能です。
コマンド | マクロメニューから選択・実行、キー割り当て用のコマンド |
ツール | ツールビューにダイアログやステータスを表示する各種ツールの作成 (例) 文字数カウント、検索ツール、置換ツール、ファイル登録ツール |
ステータスツール | ステータスバーのミニツールの作成 (例) カーソル位置の表示、検索ボックス、原稿用紙枚数表示 |
プラグイン | WZ7の標準コマンドの拡張、コマンドの追加、メニューの追加・変更 |
アプリケーション | WZ EDITORと独立動作するアプリケーションの作成 (例) WZ Filer、WZ Grep、Textc Mail、Textc Ftp Filer |
Text-Cは、ユーザカスタマイズからテキストエディタの拡張や本格アプリケーション作成に対応する、
下記のAPIと構文を提供しています。
APIの一覧や使用方法は、WZのプログラムフォルダのtext.hファイルに記載されています。
テキストの取得 | WZ7でオープン中のテキストの取得、新規テキストの作成 |
テキストの操作 | 挿入・削除・検索・正規表現・ジャンプ・ソート・段落走査・文字走査 |
テキストファイル操作 | ファイルからテキストにロード・テキストからファイルにセーブ |
テキストのビュー | テキストを各種形式のビューで表示 エディトボックス・アウトライン・リスト・ボタン・メニュー |
ビューの取得 | カーソルのあるビューの取得、HWNDからビューの取得 |
ユーザインターフェース | メニュー、ダイアログ、情報表示、問い合わせ |
設定 | ユーザデータのファイル保存、設定ダイアログ |
標準ライブラリ | 文字列操作、メモリ操作、文字操作、文字コード変換、ソケットなど |
変数 | 自動変数、static変数、global変数、3次元までの配列、ポインタ、 変数名は63文字まで |
整数 | 32bit,16bit,8bit、10進数符号付き・符号なし、16進数、 ビットフィールド |
浮動小数点 | double型による15桁の有効桁数の浮動小数点演算 |
識別値 | ID_に続く英数字6桁までの識別子を定数として自動定義 |
構造体 | struct、typedefによる構造体 |
共用体 | unionによる共用体 |
条件分岐 | if〜else〜、switch〜case、3項演算子 a ? b : c |
ループ | for、while、do〜while |
プリプロセッサ | #include、#define、#if〜#elif〜#else〜#endif、#ifdef、#ifndef |
Windows API | Windows API、DLLの呼び出し |
マルチスレッド | マルチスレッドとWindows APIによる同期 |
C言語との相違点と拡張
Text-Cは、C言語と比較して下記の相違点と拡張があります。
Text-Cでは、マクロプログラミングとWindows SDKのコンパイルに必要な仕様を限定して提供しています。
C言語にマクロプログラミング向けの変数の初期化を追加して、変数の宣言位置の制限を解除しました。
Text-C
配列 | 最大3次元まで |
文字列、数値 | 10進、16進 |
関数の引数 | 構造体はポインタ渡し、ポインタ返し |
変数の宣言 | ブロック途中の宣言にも対応 |
変数の初期化 | 自動変数を0に初期化 |
プログラムの実行 | 中間プログラムコード(Pコード)を出力、Pコードを解釈実行 |
タイプチェック | C++に近い厳密なチェック |
拡張構文 | walk、pretext |
無効な構文 | asm |
無効な宣言 | const、register |
C言語
配列 | 次元の制限なし |
文字列、数値 | 10進、16進、8進 |
関数の引数 | 構造体の制限なし |
変数の宣言 | ブロック先頭での宣言のみ |
変数の初期化 | 自動変数の初期値は不定 |
プログラムの実行 | CPUネイティブコードを出力、実行 |
TX-Cとの相違点
WZ7/6のText-Cは、WZ5〜WZ1のマクロ言語TX-Cと比較して下記の相違点があります。
Text-Cでは、TX-Cの下記の言語仕様は廃止されました。
TX-C | Text-C |
変数の自動定義 | 変数は宣言が必要 |
txstr型 | 最大4GBまでのテキストデータに対応するHTEXT型に変更 |
APIの省略記法 | APIの名称を短縮し小文字に変更 |
permanent変数 | cfgnew,property APIによるプロパティに変更 |
テキスト変数 | setmyproc APIとプロパティで代用 |
イベント関数 | TWM_EVENTによるメッセージ通知に変更 |
Text-Cでは、下記の言語仕様が追加されました。
walk文 | テキストデータを段落単位で走査 |
識別値 | 1〜6文字までの英字による定数に対応 |
自動解放 | HTEXT変数の自動解放に対応 |
浮動小数点 | double型(範囲1.7E +/- 308、有効桁数15桁)に対応 |
マルチスレッド | threadnew APIによるスレッド作成に対応 |
プロパティ | HTEXT,HVIEW,HWND型のプロパティの取得・設定に対応 |
メソッド | HTEXT,HVIEW,HWND型のメソッド呼び出しに対応 |
Text-Cでは、下記のAPIの相違点があります。
API | TX-CのWZ API呼び出し(例: txInsert)は、 Text-Cでは新しいAPI(例:add)に変更 |
Windows API | TX-CのWindows API呼び出し(例:GetWindowText)は、 Text-Cでは「#define UNICODE」環境により、 Ansi版(例:GetWindowTextA)に変更 |
キーボードマクロとText-Cプログラム
下記の操作は、WZ7.0.2より対応しています。WZ7.0.1以前の版はアップデートが必要です。
キーボードマクロ
キーボードマクロは、繰り返し実行するテキストの編集操作を記録して再生する機能です。
WZでは、下記のキーボードマクロの記録と再生に対応しています。
記録可能な操作 | 各種のカーソル移動、文字入力、文字削除、単語削除 |
記録不可能な操作 | ダイアログの表示、ウィンドウの切り換え |
記録容量 | 最近記録した300個までのキーボードマクロ |
キーボードマクロの記録から、マクロプログラムを作成できます。
作成したプログラムは、コマンドとしてキーに割り当てて簡単に実行できます。
キーボードマクロの記録
行の先頭に「・」を入力して、次行に移動するプログラムを作成します。
キーボードマクロで、下記の操作を記憶します。
- [ツール]メニューの[キーボードマクロ記録開始/終了]を実行して、記録を開始。
- [Ctrl+Left]を押して、行頭に移動。MIFESキーでは[Shift+Left]を押します。
- 「・」を入力。
- [↓]を押して、次行へ移動。
- [ツール]メニューの[キーボードマクロ記録開始/終了]を実行して、記録を終了。
プログラムの作成
キーボードマクロからプログラムを作成するには、下記の操作を実行します。
- [ツール]メニューの[キーボードマクロ一覧]を実行。
- 一覧の先頭を選択。記録したキーボードマクロは、一覧の先頭にあります。
- 「マクロ出力」を押す。
プログラムは、ファイル「wzcfg://textc\mine\idkbm.txc」に出力されます。
WZ7.0.2より、出力ファイル名が「kbmac.txc」から「idkbm.txc」へ変更となりました。
ファイルを開くには、[ファイル]メニューの[開く]-[オープンボックス]を実行してファイル名を入力します。
下記のプログラムが出力されます。
「kbm20101113_1431」は、コマンド名です。
「マクロ出力」を実行する度に、コマンド名は自動で作成されます。
プログラムの実行
マクロを実行するには、マクロを開いて、[マクロ]メニューの[実行]を実行します。
実行するコマンドの一覧が表示されます。
「kbm20101113_1431」を選択して「OK」すると実行されます。
プログラムに「・」が入力されました。
文書テキストでマクロを実行するには、文書テキストに切り換えてから、[マクロ]メニューの[履歴から実行]を実行します。
最近実行したマクロの一覧が表示されます。
「kbm20101113_1431@wzcfg://textc\mine\idkbm.txc」を選択してOKすると、マクロが実行されて、テキストに「・」が入力されます。
プログラムのキー割り当て
プログラムは任意のキーに割り当てて、キー入力から実行できます。
[Ctrl+F1]キーに割り当てるには、下記の操作を実行します。
- [ツール]メニューの[環境設定]を実行。
- 項目に「キー定義」を選択。
- 「ユーザ追加定義を追加」をON。
- 「ユーザ追加定義を追加」の「参照」を押して「定義ファイル編集」を表示。
- 「定義ファイル編集」の先頭行に下記を入力。
「^{F1}<タブ>kbm20101113_1431@wzcfg://textc\mine\idkbm.txc」
- 上書き保存して閉じる。
- 環境設定をOKして閉じる
[Ctrl+F1]のキー入力で、「・」が入力されます。
プログラムの修正
入力する文字列を変更するには、プログラムを書き換えます。
修正前 | add(text,"・");v.getcur(); |
修正後 | add(text,"[入力文字列]");v.getcur(); |
書き換えたプログラムを実行するには、プログラムを[マクロ]メニューの[コンパイル]でコンパイルします。
作成したプログラムから別のプログラムを作成するには、プログラムをコピーしてコマンド名を変更します。
コマンド名には半角英数字と_が使用できます。英字の大小は区別されます。
行頭に「・」が入力されている場合にスキップするには、add文の行にif文の条件分岐を追加します。
下記が条件分岐によるプログラムです。
キーボードマクロの記録操作から、ダイアログボックスによる入力、各種テキスト編集の処理を追加したText-Cプログラムの作成も可能です。
編集テキストの操作
Text-Cでは、WZ7で編集中のテキストをプログラムから操作できます。
テキストを操作するには、getfocus APIで編集テキストハンドルを取得します。
HTEXT text = getfocus();
getfocus APIは、カーソルのあるテキストのハンドルを返します。
テキストハンドルを用いて、各種のAPIを呼び出してテキストを操作します。
挿入 | insert(text,"文字列"); add(text,"文字列"); |
文字の挿入 | insertchar(text,'字'); addchar(text,'字'); |
改行の挿入 | insertlf(text); addlf(text); |
文字削除 | delchar(text); |
段落削除 | delpara(text); |
段落末まで削除 | delparaend(text); |
検索 | search(text,"文字列",0); |
文字取得 | int ch = getcurchar(text); |
- insert,inserchar,insertlf APIは、カーソルを移動しません。
- add,addchar,addlf APIは、挿入文字列のサイズでカーソルを移動します。
- 上記以外のAPIは、[マクロ]メニューの[Text-Cリファレンス]をご参照ください。
カーソルの移動
テキストのカーソルを移動するには、ジャンプ APIを使用します。
テキストの先頭から末尾までの任意の箇所に、ジャンプできます。
先頭へ | jumptop(text); |
末尾へ | jumpend(text); |
次の段落先頭へ | jumpnextpara(text); |
前の段落先頭へ | jumpprevpara(text); |
1文字左へ | leftchar(text); |
1文字右へ | rightchar(text); |
1単語左へ | leftword(text); |
1単語右へ | rightword(text); |
位置の取得 | IFILE adr = getadr(text); |
位置へ移動 | jumpadr(text,adr); |
- 上記以外のAPIは、[マクロ]メニューの[Text-Cリファレンス]をご参照ください。
テキストのカーソル位置と表示のカーソル位置は、独立しています。
表示のカーソル位置をテキストのカーソル位置にセットするには、下記のプログラムを記述します。
text.v.getcur();
テキストの走査
Text-Cでは、テキストを文字単位で走査した文字列の読み取りに対応しています。
テキストを文字単位で走査するには、テキストバッファ APIを使用します。
テキストの内容を保持するテキストバッファのポインタを返すため、直接のアクセスが可能です。
カーソル位置から段落末まで文字単位で走査するには、下記のプログラムを記述します。
mchar* p = getcurbuff(text);
mchar* pe = getparaendbuff(text,p);
for (;p < pe;p += buffgetcharsize(p)) {
int ch = buffgetchar(p);
}
文字単位の走査は、段落を越えることはできません。(テキストは段落で分断されている場合があります)
段落にまたがる走査をするには、段落毎に文字走査をおこないます。
カーソル位置からEOFまで段落単位で走査するには、下記のプログラムを記述します。
mchar* p = getcurbuff(text);
for (;!iseofbuff(text,p);p = getnextparabuff(p)) {
...
}
カーソル位置からEOFまで文字単位で走査するには、下記のプログラムを記述します。
mchar* p = getcurbuff(text);
for (;!iseofbuff(text,p);p = getnextparabuff(p)) {
mchar* pe = getparaendbuff(text,p);
for (;p < pe;p += buffgetcharsize(p)) {
int ch = buffgetchar(p);
}
}
- テキストを編集すると、テキストバッファのポインタは無効となります。
編集後に走査をするには、改めてテキストバッファ APIを使用してポインタを取得します。
プログラム実行結果の表示
Text-Cでプログラムの実行結果や経過を表示するには、printf APIを使用します。
操作対象のテキストとは独立して、結果を出力できます。
printfの結果は、ステータスウィンドウへ出力されます。
ステータスウィンドウを表示するには、[ウィンドウ]メニューの[ツールビューへ]を実行します。
文字列の表示 | printf("文字列=%s\n","文字列の内容"); |
文字の表示 | printf("文字=%c\n",'字'); |
数値の表示 | int val = 10; printf("数値=%d\n",val); |
テキストの段落内容の表示 | printf("段落=%s\n",text); |
カーソル位置のカラムの表示 | printf("CLM=%cs\n",text); カラム(CLM)は、段落内のタブ区切りの各文字列です。 |
- printfの代わりにiprintfを使用すると、ステータスウィンドウを強制的に表示します。
- printf(...)をaddf(text,...)に置き換えると、結果をtextに出力します。
メッセージボックスと問い合わせ
Text-Cプログラムからメッセージボックスを表示するには、printfをinformationに置き換えます。
int val = 10;
information("計算結果 = %d",val);
問い合わせボックスを表示するには、question APIを使用します。
「はい」はIDYES、「いいえ」はIDNO、「キャンセル」はIDCANCELを返します。
int val = 10;
int r = question("計算結果 = %d\n保存しますか?",val);
if (r==IDYES) {...}
テキストへの出力と表示
Text-Cではプログラムの実行結果を、新規作成したテキストへ出力して表示できます。
テキストを新規作成するにはnew API、テキストを表示するには、dlgtext APIを使用します。
HTEXT out = new();
int i;
for (i = 0x8140;i <= 0x81FF;i++) {
if ((i&0x0F) == 0) {
addlfmodal(out);
addf(out,"%04X:\t",i);
}
addf(out,"%c\t",i);
}
jumptop(out);
dlgtext(out);
サンプルプログラムを実行すると、下記の文字コード表を表示します。
(タブの表示OFF、文中タブの桁揃えON)
ダイアログボックスの入力と設定の保存
Text-Cでは、プログラムの設定データの保存と設定ダイアログの作成が、数行のプログラムで記述できます。
ダイアログを表示して入力や設定をするには、プロパティ APIを使用します。
HTEXT cfg = cfgnew(ID_MYDATA);
HTEXT arg = new();
arg.clmtitle = "タイトル";
if (dialogsheet(cfg,arg,\\"
str FIND 検索文字列(&S)
int JUMP ジャンプ先(&J) 段落
")) {
information("文字列:%cs ジャンプ先:%d",cfg.clmfind,cfg.jump);
}
- 「str」「FIND」「検索文字列(&S)」は、タブ1個で区切ります。
- 「int」「JUMP」「ジャンプ先(&J)」「段落」は、タブ1個で区切ります。
プロパティの作成
プロパティを作成するには、cfgnew APIを使用します。
cfgnew(ID_MYDATA)は、プロパティの内容をファイルからロードしてテキストハンドルを返します。
プロパティは、WZ設定フォルダ\textc\mine\idmydata.cfgファイルに保存されます。
ID_MYDATAは、任意の6文字までの英数字の名前に変更できます。(例) ID_CONFIG,ID_DATA
プロパティには、「名前」と「内容」の組を複数記憶できます。
名前 | 任意の6文字までの英数字の文字列 (例) FIND (例) JUMP 名前の大文字/小文字は同一視されます |
内容 | 数値または文字列 文字列にはタブと改行を含めることはできません |
プロパティに記憶した名前と内容は、自動的にファイルに保存されます。
次回のcfgnew API実行時に、前回の内容がファイルから読み込まれます。
マクロプログラムの設定やデータを、プロパティを利用して保存できます。
ダイアログの表示
ダイアログを表示するには、dialogsheet APIを使用します。
第1引数にプロパティ、第2引数にオプション、第3引数にシートの表示項目を指定します。
プロパティの設定内容をシートに表示して、ユーザの設定変更をプロパティに反映します。
ユーザがOKを押すとTRUE、キャンセルするとFALSEを返します。
第3引数のシートの指定は、1項目を1行のタブ区切りで記述します。
str FIND 検索文字列(&S)
int JUMP ジャンプ先(&J) 段落
それぞれのカラムは下記を指定します。
第1カラム | 項目の型を指定 文字列はstr、整数はint、チェックボックスはcheck、選択はchoice |
第2カラム | プロパティから項目の設定内容を取得する名前を指定 プロパティの指定した名前から、項目の内容を取得・反映します |
第3カラム | シートに表示するキャプション(説明) |
第4カラム | 入力枠の右側に表示するキャプション、選択項目などのオプション |
プロパティのアクセス
Text-Cでプロパティから設定内容を取得するには、下記のプログラムを記述します。
整数値 | プロパティ.名前 cfg.jump 名前は小文字で記述します |
文字列 | プロパティ.clm名前 cfg.clmfind 文字列はカラム(CLM)で返されます プロパティの設定内容を変更すると無効となります |
プロパティの設定内容を変更するには、下記のプログラムを記述します。
整数値 | プロパティ.名前 = 数値; cfg.jump = 10; |
文字列 | プロパティ.clm名前 = "文字列"; cfg.clmfind = "string"; |
プロパティに設定した数値や文字列は、自動的にファイルに保存されます。
次回のマクロプログラムの実行時に、前回の設定をプロパティから取得できます。