home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2003 July / VPR0307.ISO / OLS / LINYO152 / linyo152.lzh / linyom.mac < prev    next >
Text File  |  2003-04-30  |  13KB  |  515 lines

  1. //
  2. // 秀丸&鶴亀 行頭引用符・コメント文字挿入・削除マクロ(メニュー版)
  3. // Ver 1.0    99/05/24    by SAS
  4. // Ver 1.1    99/05/26    by SAS
  5. //        ・置換モード時のメタキャラクタ対応
  6. // Ver 1.2    99/05/30    by SAS
  7. //        動作環境の引用記号設定を本マクロで変更できるようにした
  8. // Ver 1.3    2000/11/22    by SAS
  9. //        メニュー登録・削除
  10. //        置換モードで挿入・削除後、検索フラグの置換bitをクリアするようにした。
  11. // Ver 1.31    2001/02/04    by SAS
  12. //    ・マクロフォルダを設定していない時、設定ファイルを秀丸フォルダでは無く
  13. //    ルートから読み込もうとする不具合に対応。
  14. // Ver 1.4    2001/11/07    by SAS
  15. //        ・鶴亀メール対応
  16. //        ・鶴亀メール対応の都合上、マクロフォルダをレジストリでは無く、 macrodir から
  17. //        取得するよう変更及び、loaddll/dllfunc 関数を使用するようにした。
  18. //        これに伴い、本マクロは 秀丸Ver3.02 未満では利用できなくなった。
  19. // Ver 1.41    2001/11/09    by SAS
  20. //        ・置換モードOFF/削除モードで全角文字を含む削除が正常に行えていなかった
  21. //          不具合を修正した。
  22. // Ver 1.42 2003/02/07    by SAS
  23. //        ・macrodir でなく、currentmacrodirectoryを使用することにした。
  24. //        これに伴い、本マクロは 秀丸Ver3.09 未満では利用できなくなった。
  25. // Ver 1.5 2003/02/25    by SAS
  26. //        ・メニューを出さないモードに自由入力以外に、必ず秀丸(鶴亀)設定の
  27. //        引用符を必ず使う非入力モードを追加。
  28. //        また、非メニュー時、挿入・削除が選択できるモードも追加した。
  29. //        ・範囲非選択時の動作を選択できるようにした。
  30. //        ・一部コード見直し
  31. // Ver 1.51 2003/04/25    by SAS
  32. //        ・上書き禁止、閲覧モードをチェックするようにした。
  33. // Ver 1.52 2003/05/01    by SAS
  34. //        ・「現在の設定引用記号」がメニューの先頭以外にあっても「引用記号設定」
  35. //            実行後、メニュー先頭を書き替える不具合があったので修正
  36. //        ・一部コード見直し
  37. //
  38. $inifile = "linyom.ini";
  39. $envkey = "Software\\Hidemaruo\\Hidemaru\\Env";
  40. $turu_cfgkey = "Software\\Hidemaruo\\Turukame\\Config";
  41. #iniflg = 1;    // 何らかの理由でinifileを使用したくない場合は、この値を 0 にしてください
  42. $cfgmenustr = "(&0)登録記号追加・削除";
  43. $cfgaddstr = "(&A)登録記号追加";
  44. $cfgdelstr = "(&D)登録記号削除";
  45.  
  46. call ChkTrukame;
  47. #is_turukame = ##return;    // 0: 秀丸, 1: 鶴亀
  48.  
  49. if (readonly || browsemode) {
  50.     if (#is_turukame) {
  51.         message "編集が許可されていない為、実行できません";
  52.     } else {
  53.         message "『上書き禁止』及び『閲覧モード』では実行できません";
  54.     }
  55.     endmacro;
  56. }
  57.  
  58. if (#iniflg == 0) {
  59.     //-----------
  60.     // inifile 非使用時の初期設定処理
  61.     //-----------
  62.     $freestr = "自由入力";    // 自由入力メニュー文字列
  63.     $delstr = "現在削除モード";
  64.     $insstr = "現在挿入モード";
  65.     $reponstr = "現在置換モードON";
  66.     $repoffstr = "現在置換モードOFF";
  67.     $cfginyo = "(現在の設定引用記号)";
  68.     $setinyostr = "引用記号設定";
  69.     #repflg = 0;    // 処理を置換で行うかどうか 1:行う
  70.     #nomenu = 0;    // メニュー表示
  71.                     // 0:表示する
  72.                     // 1:表示しない(自由入力)
  73.                     // 2:表示しない(非入力)
  74.                     // 3:表示しない(自由入力+挿入削除選択)
  75.                     // 4:表示しない(非入力+挿入削除選択)
  76.     #delflg = 0;    // 0: 挿入モード、 1: 削除モード
  77.     #endmode = 0;    // 終了時のカーソル位置
  78.                     // 0:処理最終論理行末, 1:処理最終論理行頭, 2:処理先頭論理行頭
  79.     #selmode = 0;    // 範囲非選択時の動作 0: カーソル行のみ処理, 1:全ての行を処理
  80.     #turu_setinyo = 0;    // 鶴亀での引用記号設定    0:無効 1:強制的に有効(非サポート機能)
  81. } else {
  82.     $inifile = currentmacrodirectory + "\\" + $inifile;
  83.     $freestr = getinistr($inifile, "Config", "freestr");
  84.     $delstr = getinistr($inifile, "Config", "delstr");
  85.     $insstr = getinistr($inifile, "Config", "insstr");
  86.     $reponstr = getinistr($inifile, "Config", "reponstr");
  87.     $repoffstr = getinistr($inifile, "Config", "repoffstr");
  88.     $cfginyo = getinistr($inifile, "Config", "cfginyo");
  89.     $setinyostr = getinistr($inifile, "Config", "setinyostr");
  90.     #repflg = getininum($inifile, "Config", "replace");
  91.     #nomenu = getininum($inifile, "Config", "nomenu");
  92.     #delflg = getininum($inifile, "Config", "delmode");
  93.     #endmode = getininum($inifile, "Config", "endmode");
  94.     #selmode = getininum($inifile, "Config", "selmode");
  95.     #turu_setinyo = getininum($inifile, "Config", "turu_setinyo");
  96. }
  97. call MainProc;
  98. endmacro;
  99.  
  100. SetInyoMenu:
  101.     #tbl_cfginyo = -1;
  102.     if (#delflg == 1) {
  103.         $insdelstr = $delstr;
  104.     } else {
  105.         $insdelstr = $insstr;
  106.     }
  107.     if (#repflg == 1) {
  108.         $repstr = $reponstr;
  109.     } else {
  110.         $repstr = $repoffstr;
  111.     }
  112.     call CfgInyoStr $cfginyo;
  113.     $cfginyostr = $$return;
  114.  
  115.     ##i = 0;
  116.     if (#iniflg == 0) {
  117.         //-----------
  118.         // inifile 非使用時のメニュー設定処理
  119.         //-----------
  120.         // 順番入れ替えは自由
  121.         $inyotbl[##i] = $cfginyostr;
  122.         #tbl_cfginyo = ##i;
  123.         ##i = ##i + 1;
  124.         $inyotbl[##i] = "》";
  125.         ##i = ##i + 1;
  126.         $inyotbl[##i] = ">";
  127.         ##i = ##i + 1;
  128.         $inyotbl[##i] = ">>";
  129.         ##i = ##i + 1;
  130.         $inyotbl[##i] = "//";
  131.         ##i = ##i + 1;
  132.         $inyotbl[##i] = "#";
  133.         ##i = ##i + 1;
  134.         $inyotbl[##i] = ";";
  135.         ##i = ##i + 1;
  136.         $inyotbl[##i] = ">";
  137.         ##i = ##i + 1;
  138.         $inyotbl[##i] = "≫";
  139.         ##i = ##i + 1;
  140.         $inyotbl[##i] = $freestr;
  141.         ##i = ##i + 1;
  142.         $inyotbl[##i] = $setinyostr;
  143.         ##i = ##i + 1;
  144.         $inyotbl[##i] = $repstr;
  145.         ##i = ##i + 1;
  146.         $inyotbl[##i] = $insdelstr;
  147.         ##i = ##i + 1;
  148.     } else {
  149.         ##j = 1;
  150.         while (##j <= 35) {
  151.             $inyotbl[##i] = getinistr($inifile, "Menu", str(##j));
  152.             if ($inyotbl[##i] != "") {
  153.                 if ($inyotbl[##i] == "$freestr") {
  154.                     $inyotbl[##i] = $freestr;
  155.                 } else if ($inyotbl[##i] == "$modechg") {
  156.                     $inyotbl[##i] = $insdelstr;
  157.                 } else if ($inyotbl[##i] == "$repchg") {
  158.                     $inyotbl[##i] = $repstr;
  159.                 } else if ($inyotbl[##i] == "$cfginyo") {
  160.                     $inyotbl[##i] = $cfginyostr;
  161.                     #tbl_cfginyo = ##i;
  162.                 } else if ($inyotbl[##i] == "$setinyostr") {
  163.                     $inyotbl[##i] = $setinyostr;
  164.                 }
  165.                 #strnumtbl[##i] = ##j;
  166.                 ##i = ##i + 1;
  167.             }
  168.             ##j = ##j + 1;
  169.         }
  170.     }
  171.     return ##i;
  172.  
  173. MainProc:
  174. if (#nomenu == 3 || #nomenu == 4) {
  175.     call MenuInsDel;
  176.     if (##return == 0) {
  177.         return;
  178.     }
  179.     #nomenu = #nomenu - 2;
  180. }
  181. if (#nomenu == 1) {
  182.     $inyofu = $freestr;
  183. } else if (#nomenu == 2) {
  184.     call GetInyofu;
  185.     $inyofu = $$return;
  186. } else {
  187.     call SetInyoMenu;
  188.     ##icnt = ##return;
  189.     while (1) {
  190.         ##idx = 0;
  191.         while (##idx < ##icnt) {
  192.             call CnvMenuStr ##idx + 1, $inyotbl[##idx];
  193.             $menutbl[##idx] = $$return;
  194.             ##idx = ##idx + 1;
  195.         }
  196.         if (#iniflg == 0) {
  197.             menuarray $menutbl, ##icnt;
  198.         } else {
  199.             $menutbl[##icnt] = $cfgmenustr;
  200.             menuarray $menutbl, ##icnt+1;
  201.         }
  202.         ##m_result = result;
  203.         if (##m_result == 0) {
  204.             return;
  205.         } else if (##m_result == ##icnt + 1) {
  206.             menu $cfgaddstr, $cfgdelstr;
  207.             if (result == 1) {
  208.                 call AddInyoMenu;
  209.                 if (##return == true) {
  210.                     call SetInyoMenu;
  211.                     ##icnt = ##return;
  212.                 }
  213.             } else if (result == 2) {
  214.                 menuarray $menutbl, ##icnt;
  215.                 ##r = result;
  216.                 if (##r != 0) {
  217.                     writeinistr $inifile, "Menu", str(#strnumtbl[##r-1]), "";
  218.                     call SetInyoMenu;
  219.                     ##icnt = ##return;
  220.                 }
  221.             }
  222.             continue;
  223.         } else {
  224.             $inyofu = $inyotbl[##m_result - 1];
  225.             if ($inyofu == $insdelstr) {
  226.                 #delflg = #delflg ^ 1;
  227.                 if (#delflg == 1)
  228.                     $insdelstr = $delstr;
  229.                 else
  230.                     $insdelstr = $insstr;
  231.                 $inyotbl[##m_result - 1] = $insdelstr;
  232.             } else if ($inyofu == $repstr) {
  233.                 #repflg = #repflg ^ 1;
  234.                 if (#repflg == 1)
  235.                     $repstr = $reponstr;
  236.                 else
  237.                     $repstr = $repoffstr;
  238.                 $inyotbl[##m_result - 1] = $repstr;
  239.             } else if ($inyofu == $cfginyostr) {
  240.                 call GetInyofu;
  241.                 $inyofu = $$return;
  242.                 break;
  243.             } else if ($inyofu == $setinyostr) {
  244.                 call SetInyofu;
  245.                 if (#tbl_cfginyo != -1) {
  246.                     call CfgInyoStr $cfginyo;
  247.                     $cfginyostr = $$return;
  248.                     $inyotbl[#tbl_cfginyo] = $cfginyostr;
  249.                 }
  250.             } else {
  251.                 break;
  252.             }
  253.         }
  254.     }
  255. }
  256. if ($inyofu == $freestr) {
  257.     call GetInyofu;
  258.     $inyofu = input("文字列入力", $$return);
  259.     if (result == false) {
  260.         return;
  261.     }
  262. }
  263.  
  264. //-------------------
  265. // 挿入・削除処理
  266. //-------------------
  267. ##selecting = selecting;
  268. if (##selecting == 1) {
  269.     if (seltopy < 0 && selendy < 0) {
  270.         return;
  271.     }
  272.     #sel_topx = seltopx;
  273.     #sel_topy = seltopy;
  274.     #sel_endx = selendx;
  275.     #sel_endy = selendy;
  276.     if (#sel_topy < 0) {
  277.         #sel_topy = 0;
  278.     }
  279.     if (#sel_endy < 0) {
  280.         #sel_endy = 0;
  281.     }
  282. } else {
  283.     if (#selmode == 1) {
  284.         #sel_topx = 0;
  285.         #sel_topy = 0;
  286.         gofileend;;
  287.         #sel_endx = x;
  288.         #sel_endy = y;
  289.         ##selecting = 1;
  290.     } else {
  291.         if (y < 0) {
  292.             return;
  293.         }
  294.     }
  295. }
  296. if (#repflg == 0) {
  297.     if (##selecting == 1) {
  298.         escape;
  299.         moveto #sel_topx,#sel_topy;
  300.         #lno = lineno;
  301.         moveto #sel_endx,#sel_endy;
  302.         if (column == 0)        // 論理行頭なら1行前まで
  303.             #endlno = lineno - 1;
  304.         else
  305.             #endlno = lineno;
  306.     } else {
  307.         #lno = lineno;
  308.         #endlno = lineno;
  309.     }
  310.     #toplno = #lno;
  311.  
  312.     while (#lno <= #endlno) {
  313.         movetolineno 1,#lno;
  314.         if (#delflg == 1)
  315.             call DelStr $inyofu;
  316.         else
  317.             insert    $inyofu;
  318.         #lno = #lno + 1;
  319.     }
  320. } else {
  321.     if (##selecting == 1) {
  322.         call ChkMetaAll $inyofu;
  323.         $inyofu = $$return;
  324.         moveto #sel_topx, #sel_topy;
  325.         #toplno = lineno;
  326.         golinetop2;
  327.         escape;
  328.         beginsel;
  329.         moveto #sele_endx, #sel_endy;
  330.         if (#delflg == 1)
  331.             replaceallfast "^"+$inyofu+"\\f.?","\\1",regular,inselect;
  332.         else
  333.             replaceallfast "^",$inyofu,regular,inselect;
  334.         setsearch searchbuffer, searchoption & 0xfb;
  335.     } else {
  336.         #toplno = lineno;
  337.         golinetop2;
  338.         if (#delflg == 1)
  339.             call DelStr $inyofu;
  340.         else
  341.             insert    $inyofu;
  342.     }
  343. }
  344. if (#endmode == 1) {
  345.     golinetop2;
  346. } else if (#endmode == 2) {
  347.     movetolineno 1,#toplno;
  348. } else {
  349.     golineend2;
  350. }
  351. return;
  352.  
  353. // 設定されている引用符の取得
  354. GetInyofu:
  355.     if (#is_turukame) {
  356.         openreg "CURRENTUSER", $turu_cfgkey;
  357.         $$inyofu = getregstr("Quote");
  358.         closereg;
  359.     } else {
  360.         openreg "CURRENTUSER", $envkey;
  361.         $$refmark = getregstr("RefMark");
  362.         closereg;
  363.         // 前後の@を省く
  364.         $$inyofu = midstr($$refmark, 1, strlen($$refmark) - 2);
  365.     }
  366.     return $$inyofu;
  367.  
  368. SetInyofu:
  369.     if (#is_turukame && #turu_setinyo == 0) {
  370.         message "この機能は鶴亀メールでは利用できません";
  371.         return;
  372.     }
  373.     call GetInyofu;
  374.     $$inyofu = input("引用記号設定", $$return);
  375.     if (result == true) {
  376.         $$inyofu = leftstr($$inyofu, 4);
  377.         if (#is_turukame) {
  378.             openreg "CURRENTUSER", $turu_cfgkey;
  379.             writeregstr "Quote", $$inyofu;
  380.             closereg;
  381.         } else {
  382.             openreg "CURRENTUSER", $envkey;
  383.             writeregstr "RefMark", "@" + $$inyofu + "@";
  384.             closereg;
  385.             envchanged;
  386.         }
  387.     }
  388.     return;
  389.  
  390. // カーソル位置の文字が指定文字列なら削除する
  391. // $$1: 削除したい文字列
  392. DelStr:
  393.     ##len = strlen($$1);
  394.     $$strtmp = gettext(x, y, x + ##len, y);
  395.     if ($$strtmp == $$1) {;
  396.         while (##len > 0) {
  397.             if (code >= 0x0100) {    // 2byte ?
  398.                 delete;
  399.                 ##len = ##len - 2;
  400.             } else {
  401.                 delete;
  402.                 ##len = ##len - 1;
  403.             }
  404.         }
  405.     }
  406.     return;
  407.  
  408. // 設定引用符用文字列作成
  409. // $$1: 引用符の後ろにつける文字列
  410. CfgInyoStr:
  411.     call GetInyofu;
  412.     return $$return + "  " + $$1;
  413.  
  414. // メニュー用文字列の作成
  415. // ##1: 番号
  416. // $$2: 文字列
  417. CnvMenuStr:
  418.     if (##1 <= 9) {
  419.         $$acckey = str(##1);
  420.     } else {
  421.         $$acckey = char(0x41 + (##1 - 10));
  422.     }
  423.     $$menustr = "(&" + $$acckey + ") "    + $$2;
  424.     return $$menustr;
  425.  
  426. // 文字列中にメタキャラクタがあれば \ を付加する
  427. // $$1: 文字列
  428. ChkMetaAll:
  429.     $$meta = "[]()^$.*+?|";
  430.  
  431.     call ChkMeta $$1, "\\";
  432.     $$s = $$return;
  433.  
  434.     ##len = strlen($$meta);
  435.     ##i = 0;
  436.     while (##i < ##len) {
  437.         call ChkMeta $$s, midstr($$meta, ##i, 1);
  438.         $$s = $$return;
  439.         ##i = ##i + 1;
  440.     }
  441.     return $$s;
  442.  
  443. // 文字列中に指定のメタキャラクタがあれば \ を付加する
  444. // $$1: 文字列
  445. // $$2: メタキャラクタ
  446. ChkMeta:
  447.     $$tmpstr = $$1;
  448.     $$s = "";
  449.     while (1) {
  450.         ##point = strstr($$tmpstr, $$2);
  451.         if (##point == -1) {
  452.             $$s = $$s + $$tmpstr;
  453.             break;
  454.         }
  455.         if (##point == 0) {
  456.             $$s = $$s + "\\" + $$2;
  457.         } else {
  458.             $$s = $$s + leftstr($$tmpstr, ##point) + "\\" + $$2;
  459.         }
  460.         ##len = strlen($$tmpstr) - (##point + 1);
  461.         if (##len == 0)
  462.             break;
  463.         $$tmpstr = rightstr($$tmpstr, ##len);
  464.     }
  465.     return $$s;
  466.  
  467. AddInyoMenu:
  468.     $$toumoji = input("登録する記号を入力してください","");
  469.     if (result == false) {
  470.         ##rcode = false;
  471.     } else {
  472.         ##i = 1;
  473.         while (##i <= 35) {
  474.             $$strtmp = getinistr($inifile, "Menu", str(##i));
  475.             if ($$strtmp == "") {
  476.                 writeinistr $inifile, "Menu", str(##i), $$toumoji;
  477.                 break;
  478.             }
  479.             ##i = ##i + 1;
  480.         }
  481.         if (##i == 36) {
  482.             message "これ以上登録できません";
  483.             ##rcode = false;
  484.         } else {
  485.             ##rcode = true;
  486.         }
  487.     }
  488.     return ##rcode;
  489.  
  490. MenuInsDel:
  491.     if (#delflg == 1) {
  492.         menu
  493.             "削除モード(&D)",
  494.             "挿入モード(&I)";
  495.     } else {
  496.         menu
  497.             "挿入モード(&I)",
  498.             "削除モード(&D)";
  499.     }
  500.     if (result == 2) {
  501.         #delflg = #delflg ^ 1;
  502.     }
  503.     return result;
  504.  
  505. ChkTrukame:
  506.     loaddll "TKInfo.dll";
  507.     if (result) {
  508.         if (dllfunc("IsTuruKame")) {
  509.             // 鶴亀で実行中
  510.             return 1;
  511.         }
  512.         freedll;
  513.     }
  514.     return 0;
  515.