サンプル
Text-Cマクロプログラムは任意のフォルダに作成できます。
マクロプログラムは、WZ設定フォルダの「textc\mine」サブフォルダに作成することを推奨します。
フォルダを作成するには、下記の操作をおこないます。
- WZ7を起動。
- [ツール]メニューの[WZ Filer]を実行して、「WZ Filer」を起動。
- [ツール]-[パス入力]を実行し、「wzcfg://textc」を入力して[Enter]キーを押す。
- [ファイル]-[フォルダの新規作成]を実行して「mine」フォルダを作成。
- 一覧から「mine」を選択して、[Enter]キーを押す。
プログラムファイルを作成するには、下記の操作をおこないます。
- [ツール]メニューの[WZ Filer]を実行して「WZ Filer」を起動。
- [ツール]-[パス入力]を実行し「wzcfg://textc\mine」を入力して[Enter]キーを押す。
- [ファイル]-[新規作成]を実行してファイル名を入力してファイルを作成。
サンプルプログラムは、「sample.txc」を入力します。
- 一覧から作成したファイルを選択して[Enter]キーを押す。WZ7でファイルを開いて編集します。
プログラムファイルには、複数のマクロコマンドを作成することができます。
サンプルプログラムは、「sample.txc」ファイルにすべてのサンプルコマンドを入力します。
テキストの連番
「テキストの連番」のサンプルプログラムを入力するには、WZで「sample.txc」を開いて下記のプログラムを入力して上書き保存します。
下記の操作でマクロを実行します。
- sample.txcを開く。
- [マクロ]メニューの[実行]を実行。
- 「プログラムの実行」ダイアログで、「renban」と「テキスト全体の各行に連番を振ります」の表示を確認。
- OKを押し実行。
「sample.txc」のプログラムに連番を振ります。
他のテキストに連番を振るには、下記の操作をおこないます。
- テキストを開く。
- [マクロ]メニューの[履歴から実行]を実行。
- 一覧から「renban@C:\...\sample.txc」を選択。
- OKを押し実行。
一覧から「C:\...\sample.txc"」を選択してOKすると、「sample.txc」内のコマンドを選択実行できます。
renban {
title: テキスト全体の各行に連番を振ります
HTEXT text = getfocus(); // 対象のテキストを取得します。
int i = 1; // 番号の初期値を1とします。
walk(text) { // テキストの現在位置を、先頭から終わりまで1段落ずつ移動します。
addf(text,"%d: ",i); // 段落の先頭部分に番号を挿入します。
i++; // 番号を1つ増やします。
}
}
プログラム先頭の「renban」は、コマンドの名前です。
名前は半角の英数字と_(アンダーバー)を組み合わせを指定します。英字の大文字と小文字は区別されます。
「title: 説明」はコマンドの説明で、「プログラムの実行」ダイアログで表示されます。
- 「HTEXT text」は、テキスト型「HTEXT」の変数「text」を宣言します。
「getfocus()」は、Text-CのAPIです。キーボードフォーカスがあるテキストを返します。
「HTEXT text = getfocus();」は、textにgetfocus()の返り値を代入します。
- 「int i = 1;」は、整数型「int」の変数「i」を宣言し、初期値に1を代入しています。
- 「walk(text) {...}」は、textを先頭から終わりまで1段落ずつ移動しながら、{...}内を処理する記述です。
- 「addf(text,"%d: ",i)」は、textに整数「i」の文字列と「: 」を追加する記述です。
日付の挿入
WZで「sample.txc」を開いて renban プログラムの後に、下記のプログラムを入力して上書き保存します。
以降のサンプルも同様に、「sample.txc」に追加入力して上書き保存します。
このプログラムでは、WindowsAPIを使用します。「sample.txc」の先頭に下記のinclude文を記述します。記述をしないと、WindowsAPIを使用したプログラムはエラーになります。
#include <windows.h>
#include <text.h>
- 「GetLocalTime(&st)」は、変数stに今日の日付を取得します。
年をst.wYear、月をst.wMonth、日をst.wDayに取得します。
- 「addf」は、日付を文字列にしてテキストに追加します。
"%04d"は4桁で数値を文字列に変換します。4桁に満たない数値は、0を補って4桁にします。
- 「text.v.getcur();」は、日付の追加後の位置に、カーソル表示を移動する記述です。
この記述がないと、日付を挿入してもカーソル位置が変わりません。
insert_date {
title: カーソル位置に現在の日付を挿入します。
HTEXT text = getfocus();
SYSTEMTIME st;
GetLocalTime(&st); // 今の日付を取得するWindowsAPIを呼び出しています。
addf(text,"%04d/%02d/%02d",st.wYear,st.wMonth,st.wDay);
text.v.getcur();
}
ダイアログの表示(1)
「dlgtext」は、テキストをダイアログボックスで表示します。
ダイアログボックスでテキストを編集すると、元のテキストにも反映されます。
dialog1 {
title: テキストをダイアログで表示します。
HTEXT text = getfocus();
dlgtext(text);
}
ダイアログの表示(2)
テキストをリストボックスで表示するサンプルです。
- 「text.v」は、テキストのビューハンドルを取得します。
ビューハンドルは、テキストを表示するウィンドウです。HVIEW型の変数に代入します。
- 「dlgnew」は、ダイアログボックスを作成するAPIです。テキストハンドルを返します。
「vnewcmdbar」は、ダイアログにOKとキャンセルボタンを追加します。
- 「vnew」は、ダイアログにtextを表示するビューを作成します。
「TWS_LIST」で、リストボックス表示を指定しています。
この指定を「TWS_EDITOR」に変更すると、エディトボックスで表示できます。
- 「dlg.do」はダイアログを表示して、OKかキャンセルするまでループします。
キャンセルすると0、OKすると0以外の値を返します。
- 「v.getcur()」は、リストボックスで選択した位置にカーソルをセットします。
dialog2 {
title: テキストをリストボックスで表示します。
HTEXT text = getfocus();
HVIEW v = text.v;
HTEXT dlg = dlgnew("リストボックス");// ダイアログを作成
vnewcmdbar(dlg.w);// ダイアログにOKとキャンセルボタンを追加
vnew(text,dlg.w,WS_VISIBLE|WS_TABSTOP|WS_HSCROLL|WS_VSCROLL|TWS_BORDER|TWS_LIST,WID1,0);
// ダイアログにテキストをリストボックスで表示
if (dlg.do()) {// ダイアログを表示しOKかキャンセルされるまでループ。
v.getcur();// OKされたら現在位置を設定
}
}
辞書ファイルの検索
- 「getword(text)」は、textのカーソル位置から単語を取得します。
テキストを新規作成し単語を挿入して返します。
- 「load」は、テキストにファイルをロードします。
- 「search」は、テキストから語句を検索します。
- 「statprintf」は、ステータスウィンドウに、引数の文字列を表示します。
「"%s"」は、wordの現在段落を表示する指定です。
- 「dlgtext」は、引数のテキストをダイアログボックスで表示します。
find_dic {
title: カーソル位置の単語で辞書(text.h)を引きます
HTEXT text = getfocus();
HTEXT word = getword(text);// textの現在位置から単語を取得します。
if (word) {// 単語が取得できた
HTEXT dic = new();// 新しくテキストを作成します(dic)。
load(dic,"wz://text.h");// dicにWZフォルダのtext.hをロードします。
if (search(dic,word,SEARCH_ALL)) {// dicから取得した単語を検索します。
statprintf("%sを見つけました",word);
} else {
statprintf("%sは見つかりません",word);
}
dlgtext(dic);// dicをダイアログで表示します。
}
}
メニューの表示
メニューは、1段落に1つのコマンドを「コマンドID」「タブ」「説明」「改行」の書式で記述します。
コマンドIDには、6文字までの英数字の文字列の「識別値」を指定できます。
「識別値」は大文字と小文字は同一で扱われます。
- 「pretext{...} szmenu」は、{}内の文字列をテキストデータとして変数szmenuに代入します。
「HTEXT menu = dup(szmenu);」は、メニューのテキストを作成してmenuに代入します。
「selectmenu」は、メニューを表示します。選択されたメニューコマンドIDが返されます。
- 「switch」は、分岐処理します。コマンドIDは、「ID_」を付加した大文字で記述します。
- 「inputlinetext」は、1行の入力ダイアログを表示します。結果がlineテキストに入力されます。
「atoi(getdata(line))」は、lineに入力された行番号を整数値に変換します。
「getdata(line)」は、lineのテキストデータをCの文字列として返します。
pretext {
PARA<タブ>段落(&P)...
DIC<タブ>辞書を引く(&D)
TOP<タブ>先頭(&T)
END<タブ>末尾(&E)
} szmenu;
// <タブ>は、タブ文字(文字コード0x09)で置き換えて入力します。
menu_jump {
title: ジャンプメニューを表示します。
HTEXT text = getfocus();
HTEXT menu = dup(szmenu);
switch(selectmenu(menu)) {
case ID_PARA: {
HTEXT line = new();
if (inputlinetext("段落へジャンプ","行番号",line)) {
int npara = atoi(getdata(line));
jumppara(text,npara);text.v.getcur();
}
break;
}
case ID_TOP: jumptop(text);text.v.getcur();break;
case ID_END: jumpend(text);text.v.getcur();break;
case ID_DIC: find_dic();break;
}
}
メニューのフック
プラグインで、WZの標準のコマンドの動作を変更できます。
プラグインのプログラムには、作者名(author)とプログラムの名前(name)の指定が必要です。
「sample.txc」に下記のプログラムを追加して、[マクロ]メニューの[プログラムの登録]を実行すると、WZ7にプラグインとして追加登録されます。
- 「WZフォルダ\textc\author」フォルダに、「name」の名前でプログラムを追加します。
- プラグインの一覧に、「\\author\name」を登録します。
登録後、新しく開いたファイルタブから、プログラムが有効となります。
プラグインは1つのプログラムファイルに1つ作成できます。
複数のプラグインは、別のファイルに作成します。
- 「case ID_JUMP:」で、フック処理を記述しています。
case文を増やして、他のコマンドもフックできます。
author: mine
name: jumphook.txc
title: ジャンプメニューのフック
BOOL vhookproc(HWND w,UINT message,WPARAM wParam,LPARAM lParam,LPVOID arg)
{
switch(message) {
case TWM_COMMAND: {
HVIEW v = w.v;// 対象になるビュー
HTEXT text = v.text;// 対象になるテキスト
vcmdpre(v);
BOOL ret = FALSE;
switch(wParam) {
case ID_JUMP: {
menu_jump();
ret = TRUE;
break;
}
}
vcmdpost(v,ret?wParam:0);
return ret;
// 0(FALSE)以外を返すと標準のコマンド処理はスキップされます。
}
}
return FALSE;
}
int plugin_editor(HWND w)
{
// EDITORのVIEWが作成されたときに呼ばれます。
if (!wishook(w,vhookproc)) {
waddhook(w,vhookproc,0);
}
return 0;
}
大文字小文字変換
- 「ch = getcurchar(text);」は、カーソル位置の1文字を読み取って文字を整数値でchに代入します。
「if (isalpha(ch)) {...}}は、chが半角英字なら{}内を実行します。
- 「IFILE adr = getadr(text);」は、テキストの現在位置のアドレスをadrに代入します。
アドレスはテキストの先頭が0、末尾がテキストサイズです。テキストの現在位置を先頭からのバイト数で示します。原則として半角文字は1バイト、全角文字は2バイトです。
- 「BOOL fup = isupper(ch);」は、chが英大文字ならTRUE(0以外の値)、英大文字以外はFALSE(0)を「fup」に代入します。
- 「do {...} while(isalpha(ch));」は、{...}を一度実行します。
isalpha(ch)がTRUEなら再度{...}を実行します。
isalpha(ch)がFALSEなら、処理を終えて次行へ移動します。
- 「addchar(res,fup ? tolower(ch) : toupper(ch));」は、resにchを文字として追加します。
fupがTRUEならtolower(ch)でchを小文字に変換、FALSEならtoupper(ch)で大文字に変換します。
「rightchar(text)」は、カーソルを1文字進めます。
- 「jumpadr(text,adr);」は、カーソルを最初の場所に戻します。
「del(text,adr1-adr);」は、変換前の文字列を削除します。
「insert(text,res);」は、変換結果を挿入します。
upper_lower {
title: カーソル位置の英単語の大文字・小文字を切り替えます。
HTEXT text = getfocus();
int ch = getcurchar(text);
if (isalpha(ch)) {
IFILE adr = getadr(text);
BOOL fup = isupper(ch);
HTEXT res = new();
do {
addchar(res,fup ? tolower(ch) : toupper(ch));
rightchar(text);ch = getcurchar(text);
} while(isalpha(ch));
IFILE adr1 = getadr(text);
jumpadr(text,adr);del(text,adr1-adr);
insert(text,res);
}
}
半角全角変換
- 「kind = charkind(getcurchar(text));」は、テキストの現在位置の文字種をkindに代入します。
全角英数字はID_ZALNUM、半角英数字はID_ALNUMを代入します。
- 「insertarea(res,text,adr,adr1);」は、resにtextのテキストアドレスadrからadr1の範囲の文字列を挿入します。
- 「insert(text,zen_to_han(res));」は、textにresのテキストを半角に変更した文字列を挿入します。
- 「insert(text,han_to_zen(res));」は、textにresのテキストを全角に変更した文字列を挿入します。
zen_han {
title: カーソル位置の英単語や数字の全角・半角を切り替えます。
HTEXT text = getfocus();
int kind = charkind(getcurchar(text));
if (kind==ID_ZALNUM || kind==ID_ALNUM) {
IFILE adr = getadr(text);
BOOL fzen = (kind==ID_ZALNUM);
do {
rightchar(text);
kind = charkind(getcurchar(text));
} while(kind==ID_ZALNUM || kind==ID_ALNUM);
IFILE adr1 = getadr(text);
HTEXT res = new();
insertarea(res,text,adr,adr1);
jumpadr(text,adr);del(text,adr1-adr);
if (fzen) {
insert(text,zen_to_han(res));
} else {
insert(text,han_to_zen(res));
}
}
}
定形入力
プロパティを定義すると、定型入力ができます。1段落に1項目を定義します。
「項目ID」「タブ」「名称」「タブ」「種類(strなら文字列)」と「;」に続けてオプションを指定できます。
「;」に続き「str=文字列,文字列」を指定すると、ドロップダウンリストに表示する規定値を登録できます。項目IDは識別値(6文字までの英数字)で指定します。
- 「pretext{...}」では、プロパティを定義しています。
- テキスト「cfg」に、入力の初期値を定義しています。
「idsetf」は、cfgのID_DATE項目の初期値を、今日の日付にセットします。
- 「property」は、プロパティ入力を実行します。入力結果はcfgにセットされます。
- 「addf(text,"...%cs\n",cfg.clmdate);」は、"..."とcfgのID_DATE項目をtextに追加します。
cfgの文字列プロパティを追加するには、"%cs"を指定してcfg.clmに続けて項目IDを記述します。
cfgの整数値プロパティを追加するには、addf(text,"%d\n",cfg.int);と、cfg.項目IDを記述します。
pretext {
DATE<タブ>日付<タブ>str
TENKI<タブ>天気<タブ>str;str=晴れ,曇り,雨,雪
} prop_date;
// <タブ>はタブ文字(文字コード0x09)で置き換えて入力します。
template_date {
title: カーソル位置に今日の日付で見出しを作成し、天気を定形入力します。
HTEXT text = getfocus();
HTEXT cfg = new();
SYSTEMTIME st;GetLocalTime(&st);
idsetf(cfg,ID_DATE,"%04d/%02d/%02d",st.wYear,st.wMonth,st.wDay);
if (property(cfg,"日記",prop_date,0)) {
jumpparatop(text);
insertlf(text);
addf(text,"...%cs\n",cfg.clmdate);
addf(text,"天候: %cs\n",cfg.clmtenki);
insertlf(text);
text.v.getcur();
}
}
住所録
テキスト形式の住所録編集をおこないます。
1つの住所録データを1段落で表現し、「名前」「住所」「電話」「E-Mail」の各項目を、タブ区切りで順に並べる形式です。
住所録テキストを作成してプログラムを実行すると、段落の住所録データを読み取りダイアログで項目内容を変更して段落データを書き換えます。
住所録テキストは、WZの「タブ区切りテキスト」文書スタイルで、項目を桁揃えして見やすく表示します。
pretext {
NAME<タブ>名前<タブ>str
ADR<タブ>住所<タブ>str;str=東京都
TEL<タブ>電話<タブ>str
EMAIL<タブ>E-Mail<タブ>str
} prop_adrbook;
// <タブ>はタブ文字(文字コード0x09)で置き換えて入力します。
adrbook {
title: 住所録:カーソル位置のレコードデータを編集します。
HTEXT text = getfocus();
HTEXT cfg = new();
idsetclm(cfg,ID_NAME,iclmget(text,1));
idsetclm(cfg,ID_ADR,iclmget(text,2));
idsetclm(cfg,ID_TEL,iclmget(text,3));
idsetclm(cfg,ID_EMAIL,iclmget(text,4));
if (property(cfg,"住所録の編集",prop_adrbook,0)) {
iclmset(text,1,cfg.clmname);
iclmset(text,2,cfg.clmadr);
iclmset(text,3,cfg.clmtel);
iclmset(text,4,cfg.clmemail);
}
}