マクロ集 / 連番作成支援


マクロ集

連番作成支援

succnumはカーソル付近の数値を1増やして下の行にコピー・ペーストするマクロです。連番の文字列やファイル名を作成することを支援します。

使用方法

簡単な使い方

succnumはカーソル行に含まれる数値を1増やして下にコピーします。カーソルは新たに挿入された行に移動します。マクロを連続して実行することにより連番を含む文字列を生成することができます。

例:

test88.txt
test89.txt
test90.txt

増やす数値を指定して実行

一つの行に複数の数値が含まれている場合、カーソル上の数値かカーソルよりから左側の数値を増やしてコピーします。

例:

http://localhost:8080:/folder01/page02.html
                              ↑カーソルをここに合わせて実行すると…

http://localhost:8080:/folder01/page02.html
http://localhost:8080:/folder02/page02.html 
                              ↑右から二番目の数値が増える

推奨キーアサイン

wz.key

succnum = +^A

コード

succnum.txc

/*
	History
	
	2003.12.18
		2バイトコードが混じるとカーソル位置がずれる現象を修正した。
	
	2003.12.16
		数字を含まない行はコピーしないように修正した。
	
*/
//#define TEST_ENABLED

/// 文字列sのn以下の最も右側の数値を1増やして返す。nに0を指定すると行末から検索する。
BOOL SuccNumber(txstr s, int n)
{
	int sl = strlen(s);

	// インクリメントする数値の末尾の位置にiをセットする
	int i = (n==0)?sl:n-1;
	if(i>sl) i=sl;
	for(; isdigit(s[i]); i++)
		if(i==sl || !isdigit(s[i+1]))
			break;
	
	for(; i>=0; i--)
	{
		// 右側から数字を検索
		if(!isdigit(s[i]))
			continue;
		
		// インクリメントする
		for(;(s[i] = "1234567890"[s[i]-'0']) == '0'; i--)
		{
			// 繰り上がり
			if(i > 0 && isdigit(s[i-1]))
				continue;
			
			// 桁を増やす "99"->"100"
			sprintf(s, "%s1%s", strleft(s, i), strmid(s, i, strlen(s)));
			return TRUE; 
		}
		return TRUE;
	}
	
	// インクリメントすべき数値がなかったら行末から再試行
	if(n>0 && sl>0 && sl>n)
		return SuccNumber(s, 0);
	
	return FALSE;
}

void succnum(TX *text)
{
	// カーソルのある行を取得
	getline(szline);
	
	// 数値をインクリメント
	if(SuccNumber(szline, text->lx+1) == FALSE)
		return;
	
	// ひとつ下の行に挿入
	markn(4);
	jumpparatop();
	if(!nextpara())
	{ // 下への移動に失敗した=その行末にEOFがある
		jumpparaend();
		insert("\n");
	}
	insert(szline);
	insert("\n");
	
	// カーソルを元の位置のひとつ下に戻す
	prevpara();
	jumpmarkn(4);
	down;
}

void main(TX *text)
{
	succnum(text);
}

#ifdef TEST_ENABLED

//## テストコード
#include "txcunit.h"

void testSuccNumber()
{
#define TEST_SUCCNUMBER(a,r) { txstr s=a; SuccNumber(s, 0); TEST_EQ_S(s,r); }
	TEST_SUCCNUMBER("test.txt", "test.txt");
	TEST_SUCCNUMBER("3", "4");
	TEST_SUCCNUMBER("99", "100");
	TEST_SUCCNUMBER("test10", "test11");
	TEST_SUCCNUMBER("file001.txt", "file002.txt");
	TEST_SUCCNUMBER("file999.txt", "file1000.txt");
#define TEST_SUCCNUMBER2(a,r,n) { txstr s=a; SuccNumber(s, n); TEST_EQ_S(s,r); }
	//                123456   123456
	TEST_SUCCNUMBER2("1/1/1", "1/1/2", 100);
	TEST_SUCCNUMBER2("1/1/1", "1/1/2", 5);
	TEST_SUCCNUMBER2("1/1/1", "1/2/1", 4);
	TEST_SUCCNUMBER2("1/1/1", "1/2/1", 3);
	TEST_SUCCNUMBER2("1/1/1", "2/1/1", 2);
	TEST_SUCCNUMBER2("1/1/1", "2/1/1", 1);
	TEST_SUCCNUMBER2("1/1/1", "1/1/2", 0);

	//                12345678912    12345678912
	TEST_SUCCNUMBER2("111/111/111", "112/111/111", 4);
	TEST_SUCCNUMBER2("111/111/111", "111/112/111", 5);
	TEST_SUCCNUMBER2("111/111/111", "111/112/111", 6);
	TEST_SUCCNUMBER2("111/111/111", "111/112/111", 7);
	TEST_SUCCNUMBER2("111/111/111", "111/112/111", 8);
	TEST_SUCCNUMBER2("111/111/111", "111/111/112", 9);
	
	TEST_COND(isdigit('9'));
	TEST_COND(!isdigit('A'));
}

test
{
	TEST_EXEC(SuccNumber);
}
#endif // TEST_ENABLED

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

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

  • 理論行でコピーになるともっと便利 -- krekre? 2004-02-14 (土) 10:25:23
  • ましな物をアップ出きるかも、、ですがどうしましょう? -- これより? 2007-05-31 22:08:19 (木)