マクロ集 / 小物マクロ


マクロ集

選択範囲(の一行目)の文字列をテキスト全体から削除

(2007-07-07 19:34:51 (土))

//## 範囲選択部分をretにセットする。
// 範囲選択されていなければFALSEを返す。
// 複数行選択されていた場合最初の一行目のみをretにセットする。
static BOOL txGetSelectLine(TX *text, txstr ret)
{
	if(!getselectlen) return FALSE;
	setundispex;
	ret = "";
	walkstart;
	while(iswalking)
	{
		int c = readchar;
		if(txchIsReturn(c))
			break;
		ret += chartostr(c);
	}
	walkend;
	setdispex;
	return TRUE;
}

main
{
	txstr s;
	if(!getselectline(s))
	{
		information("範囲選択が必要です");
		return;
	}
	
	if(question("テキスト全体から\"%s\"を削除します", s) != IDYES) return;
	
	replaceex(s, "", SEARCH_ALL);
}

カーソル位置の単語を選択

(2007-06-08 21:43:07 (金))

選択後はコピーしたり削除したり入力文字で上書きしたりできる。

//## カーソル位置の単語を選択
SelectCurrentWord
{
	setundisp;
	if(!iscurreturn) right; leftword;
	for(;;)
	{
		mchar c = getchar;
		if(isalnum(c) || c=='_')
		{
			idmExec(IDM_SELECTRIGHT);
			continue;
		}
		break;
	}
	setdisp;
}

括弧,"", ''を閉じ行末にセミコロンをつける

(2007-06-05 10:31:00 (火))

//## 括弧,"", ''を閉じ行末にセミコロンをつけるマクロ
// foo("bar| -> foo("bar|");
static BOOL Replace(txstr buf, mchar *searchstr, mchar *replacestr)
{
	mchar *p = strstr(buf, searchstr);
 	if(p)
 	{
 		int n = strlen(searchstr), m = strlen(replacestr);
		memmove(p+m, p+n, strlen(buf)-n+sizeof('\0'));
		memcpy(p, replacestr, m);
		return TRUE;
	}
	else
		return FALSE;
}

mchar GetCloseBrace(mchar *s)
{
	txstr buf = s;

	mchar *p= (mchar*)buf, *q = p;
	for(; *q; q++)
		switch(*q)
		{
			case '{': case '}':
			case '(': case ')':
			case '[':case ']':
// 			case '<': case '>':
			case '"': 
			case '\'':
				*p++ = *q;
				break;
		}
	*p = (mchar)0;

	while(
		Replace(buf, "{}", "") || 
		Replace(buf, "()", "") || 
		Replace(buf, "[]", "") || 
//		Replace(buf, "<>", "") || 
		Replace(buf, "\"\"", "") || 
		Replace(buf, "''", ""))
			;
		
	size_t len = strlen(buf);
	if(len==0) return 0;
	switch(buf[len-1])
	{
		case '{': return '}';
		case '(': return ')';
		case '[': return ']';
//		case '<': return '>';
		case '"': return '"';
		case '\'': return '\'';
		case 0: return 0;
	}
	return '?'; // err
}

//## 閉じ括弧を入力
CloseBrace
{
	setundispex;
	for(int i=0; i<10; i++)
	{
		txstr para; getpara(para);
		mchar c = GetCloseBrace(para);
		if(c == 0)	break;
		jumpparaend;
		insertf("%c", c);
	}
	setdispex;
}

//## なければ行末にセミコロンを追加
AppendSemicolonToParaEnd
{
	setundispex;
	jumpparaend;
	(getprevchar == ';') ? deleteprev : insert(";");
	nextpara;
	setdispex;
}

CloseBraceAndAppendSemicolon
{
	CloseBrace(text);
	AppendSemicolonToParaEnd(text);
}

大文字小文字変換の拡張

(2007-06-03 13:06:54 (日))

//## 大文字小文字変換の拡張。カーソル位置にある単語全体を対象とする。
// case|wordex -> CASE|WORDEX 
// CaseWordEx| -> casewordex|
// foo(bar); | -> foo(BAR); |
casewordex
{
	setundispex;
	if(!iscurreturn) right;
	leftword;
	idmexec(IDM_CASEWORD);
	setdispex;
}

検索


カーソル位置の単語を即検索

(2007-06-07 08:03:13 (木))

SearchCurrentWord = ^@{PageDown}
SearchCurrentWordPrev = ^@[PageUp}
//## カーソル位置の単語を即検索
main
{
	setundispex;
	if(!iscurreturn) right;
	leftword;
	getword(sz);
	setdispex;
	if(!searchex(sz, SEARCH_SELECT|SEARCH_WORD))
		statusbarprintf("%sは見つかりませんでした", sz);
}


//## カーソル位置の単語を前方方向へ即検索
main
{
	setundisp;
	if(!iscurreturn) right;
	leftword;
	getword(sz);
	setdisp;
	if(!searchex(sz, SEARCH_PREV|SEARCH_SELECT|SEARCH_WORD))
		statusbarprintf("%sは見つかりませんでした", sz);
}

Bookshelf2でカーソル位置の単語を検索

(2007-06-01 20:24:46 (金))

SearchBookshelf2

#include <windows.h>

permanent txstr BookShelf2 = 
	\"E:\Program Files\Microsoft Reference\Bookshelf Basic 2.0\bs98jl.exe";

main
{
	setundispex;
	txstr word; right; leftword; getword(word);
	setdispex;
	if(word[0] <= ' ' && !inputstr("検索ワード", word)) return;
	WinExec(BookShelf2 + " /H /D \"" + word + "\"", SW_SHOW);
}