マクロ集 / 動的な置換


マクロ集

単語の動的な置換

動的な置換マクロ

使用方法

ごめんなさい[マクロ集/雛形]を誤って削除してしまいました
ご迷惑お掛けしますが復旧をお願いいたします
WZ4.0F用です
括弧を入力=直前の単語を置換し括弧を補完
改行=一行に含まれる全単語を置換
Alt+Enter=マクロの終了

入力支援

txjumpaddress(|  括弧をいれたら  txJumpAddress(text|)  のようになります
単語帳に載せなければ、for(;;),while(),if()なども補完します

VBの単語帳を使用すると

行頭に小文字で入力
publc function hoge(byval foo as long) as string|
改行すると 
Public Function hoge(ByVal foo As Long) As String
 ___|
End Function
このようになります

コード

Drep
このマクロはWZ4.0Fにおいて単語を動的に置換します
テキストファイル形式の単語帳を裏テキストとしてメモリ上に配置、
単語帳を開いたままで検索し続けます
TXC関数名を単語帳とすると小文字でタイプすることが出来ます
 '(' 開ブレースの入力で直前の関数等を検査置換、()を付加します
行末(空白もNG)で改行するとその表示行内の単語を検査置換(VBライク) 
VBの場合、行頭でプロシージャ宣言して改行するとEnd Subを挿入します
行末以外での改行は普通に改行されます
Shift+Enterで同様に検査置換しますが、改行は行われません
Alt+Enterでフック解除/マクロを終了します
※WZを再起動するまでこのマクロは使えません
参照する単語帳は、キーワードファイル様式(.tkw)でもかまいませんが、
スペースで区切られた改行無しの単語帳に作り直す方が高速のようです
コードの下方にTXCとVBの単語帳を載せました
使用方法や言語に合わせて書き換え、コンパイルしてください
なお、このマクロは漢字等の2Byte文字には対応しておりません
//単語帳ファイルを設定しています 
#define MY_File_Path \"C:\Program Files\WZ EDITOR\VBword.txt"
//括弧と実引数を設定しています TXCの場合は"(text)"とすると便利です
#define MY_ARG "()"
#define MACROS_VERSION "0.2"
#define MACROS_AUTHOR "Miki"
#define MACROS_NAME "登録済みの単語を動的置換"
#include <windows.h>
#include <_idm.h>
#include "_idmcmd.h"
static TX* ShadowText;		// 裏テキスト(単語帳)へのポインタ
int ReWordBrace(TX* text)         //直前の単語を置換し()を追加する
{
	int WordLen1;   // 表テキストの単語の長さByte
	int WordLen2;   // 裏テキストの単語の長さByte
	txstr szWord;   // 単語を格納する変数
	// 表示更新を停止(カーソル位置保存)
	txSetUndispEx(text);
	// カーソルを1つ手前へ
	txLeft(text);
	// 文字がアルファベットだったら
	if(isalpha(txGetChar(text))){
		// 表テキストから1単語取得(サイズも取得)
		WordLen1=txGetWordAfter(text,szWord);
		// 単語が1文字(1Byte)だったらスルー
		if(WordLen1<2){
			// 何もしない
		// 2文字以上の単語の処理
		}else{
			// 裏::取得した単語が単語帳に載っていたら(サイズ+1も取得)
			if(WordLen2=txSearchEx(ShadowText,szWord,SEARCH_WORD|
                                                               SEARCH_NOSENSECASE)){
				// 表::単語先頭へカーソル移動
				txJumpWordTop(text);
				 // 表::当該単語を削除
				txDeleteBytes(text,WordLen1);
				// 裏::単語帳の単語(綴り修正)に書き換える
				txGetWord(ShadowText,szWord);
				 // 裏::単語帳のカーソルをファイル先頭に戻す
				txJumpFileTop(ShadowText);
				// 表::書き換え後の単語を挿入
				 txInsert(text,szWord);
				// 画面更新を復帰(カーソル位置も復帰)
				txSetDispEx(text);
				 // ファイル冒頭で#defしたMy_ARGを追加で挿入
				txInsert(text,MY_ARG);
				 // カーソルを一つ戻す
				 txLeft(text);
				 // 呼び出し元に戻る
				 return 1;
			// 単語帳に載っていなかったら
			}else{
				// 画面更新を復帰(カーソル位置も復帰)
				txSetDispEx(text);
				// 直前の単語がforなら
				if(szWord=="for"){
					txInsert(text,"(;;)");
					// カーソルを括弧の中に入れる
					 txLeftBytes(text,3);
					return 2;
				// その他の単語はif,while,載ってない関数
				}else{
					txInsert((text),"()");
					// カーソルを括弧の中に入れる
					txLeft(text);
					// 呼び出し元に戻る
					return 3;
				}
			}
		}
	}
	// 最初のifではじかれたら
	// 画面更新を復帰(カーソル位置も復帰)
	txSetDispEx(text);
	// 通常動作
	txInsertChar(text,'(');
	return 0;
 }
 int ReWordLine(TX* text)            //表示行内の全単語を置換する
{
	DWORD adr0;    // 初期カーソル位置
	DWORD adr1;    // 現在カーソル位置
	int WordLen;   // 単語の長さByte
	int i;         // txSeachExの戻り値(len+1)を格納(使っていない)
	txstr szWord;   // 単語を格納する変数
	// 表示更新を停止
	txSetUndispEx(text);
	// 現在位置を保存
	adr0=txGetAddress(text);
	// ここが文の途中なら何もしない(CRLF,LF,EOFコードを検査)
	if(!txIsCurReturn(text)){
		txSetDispEx(text);
		return 0;
	}
	// 行頭へカーソルを移動
	txJumpLineTop(text);
	// 行頭が改行だったら何もしない(アドレスの比較でも可)
	if(txIsCurReturn(text)){
		txSetDispEx(text);
		return 0;
	}
	// 行頭からタブ/スペースを飛ばして最初の文字位置に移動
	while(txGetChar(text)=='\s' || txGetChar(text)=='\t'){
		txRight(text);
	}
	// 見つかった最初の文字が改行だったら何もしない(空白行)
	if(txIsCurReturn(text)){
		txSetDispEx(text);
		return 0;
	}
	// 行内の最初の単語を発見
	// カーソルが改行位置に来るまで(最初の保存位置は越えない)
	while(!txIsCurReturn(text) && adr1<=adr0){
		// 表テキストから1単語取得(サイズも取得)※Afterは記号を1単語としている
		WordLen=txGetWordAfter(text,szWord);
		// 単語が1文字(1Byte)だったらスルー、次の単語へ
		if(WordLen<2){
			txRightWord(text);
			// 現在のカーソル位置を取得
			adr1=txGetAddress(text);
		// 2文字以上の単語の処理
		}else{
			// 取得した単語が単語帳に載っていたら(iは未使用)
			if(i=txSearchEx(ShadowText,szWord,SEARCH_WORD|
                                                         SEARCH_NOSENSECASE)){
				// 表テキストから当該単語を削除(変数上に記憶済み)
				txDeleteBytes(text,WordLen);
				// 変数の値を単語帳の単語(綴り)に書き換える
				txGetWord(ShadowText,szWord);
				// 単語帳のカーソルをファイル先頭に戻す
				txJumpFileTop(ShadowText);
				// 表テキストのカーソル位置に単語を挿入
				txInsert(text,szWord);
			// 単語帳に載っていなかったら
			}else{
				// 何もしない
			}
			// 次の単語へ移動
			txRightWord(text);
			adr1=txGetAddress(text);
		}
	}
	// 画面更新を復帰(カーソル位置も復帰)
	txSetDispEx(text);
	return 1;
}
void AddProcEnd(TX* text,txstr sz)      //End句を書き込みカーソルを適当な位置に送る(VB用)
{
 	//printf("%s",sz);
	txSetUndisp(text);
	txWriteReturn(text);
	txWriteReturn(text);
	txInsert(text,sz);
	txUp(text);
	txJumpLineTop(text);
	txWriteTab(text);
	txSetDisp(text);
}
txstr SendProcEnd(TX* text)           //行の先頭と2番目の単語を読んで、End句を返す(VB用)
{
	txstr szWord1;
	txstr szWord2;
	// 先頭の単語と次の単語を読む
	txSetUndispEx(text);
	txJumpLineTop(text);
	txGetWord(text,szWord1);
	txRightWord(text);
	txGetWord(text,szWord2);
	txSetDispEx(text);
	// End句を送る条件
	if(szWord1=="Sub"){
		return "End Sub";
	}else if(szWord1=="Function"){
		return "End Function";
	}else if(szWord1=="Property"){
		return "End Property";
	}else if(szWord1=="Private" || szWord1=="Public"
		  || szWord1=="Friend"  || szWord1=="Static"){
		if(szWord2=="Sub"){
			return "End Sub";
		}else if(szWord2=="Function"){
			return "End Function";
		}else if(szWord2=="Property"){
			return "End Property";
		}
	}
	// 該当なしなら
	return "";
}
//メッセージフック-コールバック
HOOKRESULT CALLBACK wndtexthookFilerPreview(HWND hwnd,UINT message,
                                WPARAM wParam,LPARAM lParam)
{
	TX* text;      // 表テキストへのポインタ
	txstr sz;
	//開いたWZのウィンドウをGet
	text = hwndtextGetText(hwnd);
	// メッセージが
	switch(message) {
	// 文字入力の応答の場合で
	case WM_CHAR:
		// 半角の開ブレース'('が入力された通知があったら
		if(wParam=='('){
			// '('の直前の単語を置換する
			ReWordBrace(text);
			// 終了
			return HOOK_CAPTURE;
		}
	// テキストイベントの場合で
	case WM_TXEVENT:
		// そのカテゴリが
		switch(wParam) {
		// テキストイベント実行系で
		case TXEVENT_IDMEXEC:
			// その名前が
			switch ( lParam ) {
	// ※インデント位置変更(IParam)のcase
	// 改行挿入だったら
	case IDM_INSERTRETURN :
		// 行全体を置換して
		ReWordLine(text);
		// VBプロシージャ宣言か確認して
		sz=SendProcEnd(text);
		// VBプロシージャだったら
		if(sz != ""){
			// End句を挿入
			AddProcEnd(text,sz);
			// 終了
			return HOOK_CAPTURE;
		}
		// VBプロシージャでなかったら改行を挿入
		txWriteReturn(text);
		// 終了
		return HOOK_CAPTURE;
	// SHIFT+ENTERだったら
	case IDM_SHIFTENTER:
		// 行全体を置換する(※改行はしない)
		ReWordLine(text);
		// 終了
		return HOOK_CAPTURE;
	// Alt+Enterだったら
	case IDM_ALTENTER:
		// REWORD終了を通知して
		attention("Drepを終了します         ");
		// 開いている単語帳を閉じ
		textclose(ShadowText);
		// WZウィンドウのフックを開放する
		txReleaseHookWndproctext(text,wndtexthookFilerPreview);
		// マクロプログラムを終了します
		return 0;
	// WZウィンドウが閉じられる場合は
	case IDM_UICLOSE:
		// 開いている単語帳を閉じ
		textclose(ShadowText);
		// WZウィンドウのフックを開放する
		txReleaseHookWndproctext(text,wndtexthookFilerPreview);
		// マクロプログラムを終了します
		return 0;
  // ※インデント復帰 switch ( lParam ) {
			}
		break;		// switch(wParam) {
		}
	break;		// switch(message) {
	}
	// フックを続ける
	return HOOK_CONTINUE;
}
// WZマクロに登録
//main
void __on_txFrameNew(TX *text)
{
	// 裏テキストに単語帳を開く
	ShadowText=textopen(MY_File_Path);
	//メッセージフック手続き
	txSetHookWndproctextTxpcode(text,wndtexthookFilerPreview);
}
// WZマクロProperty登録
void __pluginGetProperty(mchar *prop, txstr res)
{
	if ( !stricmp(prop, "name") ) res =  MACROS_NAME;
	if ( !stricmp(prop, "author") ) res =  MACROS_AUTHOR;
	if ( !stricmp(prop, "version") ) res =  MACROS_VERSION;
}
単語帳(TXC)
BYTE WORD DWORD mchar txstr permanent wchar tchar TEXTCHAR textvar TX* txLeft txLeftBytes txRight txRightBytes txLeftWord  txLeftWordMi txRightWord txRightWordMi txJumpWordTop txJumpWordTopMi txJumpWordEnd txJumpWordEndMi txPrevPara txNextPara txJumpParaTop txJumpParaEnd txJumpParaIch txJumpNpara txHeadlineSearchPrev txHeadlineSearchNext txUp txUpN txDown txDownN txPrevRoll txPrevRollN txPrevPage txPrevHalfPage txNextRoll txNextRollN txNextPage txNextHalfPage txJumpLy txJumpLineTop txJumpLineEnd txJumpLineTail txJumpLx txJumpX txSetLy txSetLyCenter txJumpFileTop txJumpFileEnd txJumpBrace txJumpTagEx txJumpSelectTop txJumpSelectEnd txMarkNow txJumpMarkNow txEndMarkNow txMarkCur txJumpMarkCur txGetAddress txGetAddressCurscreen txGetAddressSelectTop txGetAddressSelectEnd txGetParaTop txGetParaEnd txGetParaTail txGetParaContentEnd txGetLineTop txGetLineTail txJumpAddress txJumpAddressAddLy txSetLyCurscreen txLeftFree txRightFree txJumpPara txJumpLine txJumpFileTopLine txJumpFileEndLine txMarkN txJumpMarkN txSearchEx txSetSearchContinue txSearchContinue txSearchContinuePrev txReplaceEx txSelectEx txSelectAll txSelectQuit txSelectGetMode txIsClipInPara txGetSelectLen txGetAddressSelectTop txGetAddressSelectEnd txWalkStart txIsWalking txWalkEnd txWalkStartPrev txIsWalkingPrev txSelectCopy txSelectCopyDelete txSelectCopyQuit txSelectDelete txPaste txClipboardAddCopy txClipboardAddCut txPrivatePush txPrivatePaste txPrivatePop txPrivatePopJump txPrivateClear txPrivateDeleteTop txJumpSelectTop txJumpSelectEnd txSelectJump txSelectToMemo txSelectToMemoEx txSelectToChar clipIsWz txSelect txSelectLine txSelectWord txSelectVz txSelectBox memClipCopy memClipPaste txInsert txInsertW txInsertf txInsertBuff txCurInsertBuff txOverWrite txOverWriteBuff txInsertChar txCurInsertChar txOverWriteChar txWriteChar txWriteTab txInsertSpaceFreeCursor txInsertNspace txInsertReturn txCurInsertReturn txWriteReturn txInsertPara txInsertText txInsertTextSelect txDeleteChar txDeleteBytes txDeleteWord txDeleteWordMi txDeletePrev txDeletePrevWord txDeletePara txDeleteParaTop txDeleteParaEnd txDeleteParaline txDeleteParalineTop txDeleteParalineEnd txDeleteText txJankToAnk txJkanaToKana txJkataToKana txKanaToJhira txKanaToJkata txAnkToJank txIndentIn txIndentDec txUndo txRedo txUndoPara txSort txSave txuiSave txuiSaveAs txSaveTo txSaveToW txuiSaveTo txInsertFile txInsertFileW txuiInsertFile txuiReopenInternal txQuit txuiClose textFrameOpen textFrameOpenEx txGetChar txGetPrevChar txReadChar txGetWord txGetWordWhole txGetWordAfter txGetPara txGetParaRear txGetLine txGetLineRear txGetParaEx txGetWordEx txGetParaRearEx txIsCurReturn txIsCurEof txIsCurLineEnd txIsCurLineTop txIsCurParaTop txCmpCur txCmpCurI txCmpCurLen txCmpCurLenI txCmpCurPrev txGetParaLen txGetParaContentLen txGetParaIch txIsLineReturn txIsLineEnd txGetLineContentLen txGetLxLineEnd txGetLxLineTail txGetEdit txGetTextSize txGetFreeCursor txIsCurFree txSetUndisp txSetDisp txSetUndispEx  txSetDispEx txSetDispExJump txSetUndispEdit txSetDispEdit txSetBusy txSetUnbusy txDispCursor txDispLocate txDispTextAll txDispAll txHeadlineChange txHeadlineMatch txHeadlineGetContent txKeySetWzcmd txKeyLoad txKeyLoadFrame txIdmExec txIdmExecDirect idmRegister txSwitchInsert txFlush txFlushUI txCmpFirst txCmp txHelpOpen txImeGetOpen txImeSetOpen txSetHigh txResetHigh txSetHookWndproctextTxpcode txSetHookWndprocbaseTxpcode txReleaseHookWndproctext txReleaseHookWndprocbase textopen textopenW textclose textnew
単語帳(VB)
Abs AddressOf Alias And Array As Asc AscB AscW Atn Boolean Beep ByRef Byte ByVal Call CallByName Case CBool CByte CChar CDate CDbl CDec Char Chr ChrB ChrW CInt CLng CObj Command Const Cos CreateObject CSng CStr CurDir CVar CVDate CVErr Date DateAdd DateDiff DatePart DateSerial DateValue Day DDB Decimal Declare  DeleteSetting Dim Dir Do DoEvents Double Each Else ElseIf Empty End Enum Environ EOF Erase Error Exit Exp Explicit False FileAttr FileCopy Filter Fix For Format  FormatCurrency FormatDateTime FormatNumber FormatPercent Friend Function FV Get GetAllSettings GetAttr GetObject GetSetting Global GoSub GoTo Hex Hour If IIf  IMEStatus Implements In Input InputB InputBox InputString InStr InStrB InStrRev Int Integer Is IPmt IRR IsArray IsDate IsDBNull IsEmpty IsError IsMissing IsNull IsObject Join LBound LCase Left LeftB Left$ Len LenB Let Lib Like LoadPicture Loc LOF Log Long Loop LTrim LTrim$ Main Mid MidB Mid$ Me Minute MIRR Month MonthName  MsgBox New Next Not Nothing Now NPer NPV Object Oct On Option Optional Or ParamArray Partition Pmt PPmt Private Property Public PV QBColor RaiseEvent Randomize ReDim REM Resume Return Right Right$ RTrim Rtrim$ Select Set Short Single Static Step Stop String Sub Then To Trim Trim$ True Type  Variant vbCrLf vbNull vbNullString Wend While With WithEvents Xor 

この記事は役に立ちましたか?

選択肢 投票
とても役に立った 0  
役に立った 0  
どちらともいえない 0  
あまり役に立たなかった 0  
役に立たなかった 1