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
この記事は役に立ちましたか?