2016年4月18日

自動起動マクロでをいろいろ試し中…….今の手元はこんな感じ.ダイレクトに補完マクロを起動すると遅いので,補完用辞書を読ませて秀丸の単語補完を起動,単語補完の終了にあわせて祝鳥の補完マクロを起動することに.単語補完の設定で,先頭文字に\を入れておかないと駄目だと思う.それと開き括弧に対しては対応する閉じ括弧を自動挿入するようにしてみている.

\sectionとするとマクロが起動するのはうざい.候補がないときは終了させるとかの方がよいのかも.それと補完マクロ自身も書き直そうか悩み中.今のは酷いコードだけど,とりあえず動いてはいるし,面倒なんだよなぁ.

//////////////////////////////////////////
//
//祝鳥(自動起動マクロ:編集後タイマー)
//0msで動かすこと.
//Abe Noriyuki
//
//////////////////////////////////////////

//if(event != 5)endmacro; // 編集後タイマー
//if(geteventparam(3) != 0)endmacro; // 遅延時間=0ms
if(geteventparam(0) != 0)endmacro; // 通常の編集(やり直しではない)
if(geteventparam(5) != 0)endmacro; // 削除以外の編集

if(geteventparam(2) != 0){
   // 単語補完の決定後
  if(getstaticvariable("ABENORI_COMPLETE",0) == "1"){
    setstaticvariable "ABENORI_COMPLETE","",0;
    execmacro currentmacrodirectory + "\\..\\htex.mac","nonew";
  }
  endmacro;
}

if((colorcode[1] & 0x1F) == 3)endmacro; // コメント内

if(filetype != ".tex")endmacro;

if(geteventparam(1) != 0){// 改行
//  undo;
//  execmacro currentmacrodirectory + "\\..\\alte.mac";
  endmacro;
}

#c = geteventparam(4);
if(#c == '$'){
  undo;
  insertfix "$$";
  right;
}else if(#c == '['){
  call InsKakko "[","]";
}else if(#c == ']'){
  call SkipKakko ']';
}else if(#c == '('){
  undo;
  insertfix "()";
  right;
}else if(#c == ')'){
  call SkipKakko ')';
}else if(#c == '{'){
  call InsKakko "{","}";
}else if(#c == '}'){
  call SkipKakko '}';
}else if(('a' <= #c && #c <= 'z') || ('A' <= #c && #c <= 'Z')){
  // コントロールシークエンスだけ補完……
  $$str = gettext2(0,lineno,column - 1,lineno,1);
  if(midstr($$str,strlen($$str) - 1,1) == "\\"){
    execmacro currentmacrodirectory + "\\..\\funcs.mac","getuserdir","ini";
    $$ini = getresultex(-1) + "htex.ini";
    $$d = getinistr($$ini,"\\","$1");
    ##p = -1;
    while(true){
      ##q = ##p;
      ##p = strstr($$d,",",##q + 1);
      if(##p == -1)$$s = midstr($$d,##q + 1);
      else $$s = midstr($$d,##q + 1,##p);
      if(leftstr($$s,1) != "$" && leftstr($$s,1) != "@"){
        $$dic = $$s;
        break;
      }
      if(##p == -1)endmacro;
    }
    setstaticvariable "ABENORI_COMPLETE","1",0;
    execmacro currentmacrodirectory + "\\..\\funcs.mac","getuserdir","dic";
    autocomplete 0,0x1 | 0x2 | 0x4,0x3 | 0x20,getresultex(-1) + $$dic;
  }
}
endmacro;

InsKakko:
  loaddll hidemarudir + "\\HMJRE.DLL";
  undo;
  begingroupundo;
  ##cursor = 0;
  if(dllfunc("FindRegular","(^|[^\\\\])\\\\(\\\\\\\\)*$",gettext2(0,lineno,column,lineno,1)) >= 0){
    execmacro currentmacrodirectory + "\\..\\funcs.mac","getuserdir","ini";
    $$f = getinistr(getresultex(-1) + "htex.ini","\\" + $$1,"format");
    if($$f != ""){
      call FormatToString $$f;
      $$ins = dllfuncstr("ReplaceRegular","\\$[1-9]",$$return,0,"",2);
      $$ins = dllfuncstr("ReplaceRegular","\\$0\\*",$$return,0,"",2);
      ##cursor = strstr($$ins,"$0");
      if(##cursor == -1)##cursor = 0;
      $$ins = $$1 + dllfuncstr("ReplaceRegular","\\$0",$$return,0,"",2);
    }else $$ins = $$1 + "\\" + $$2;
  }else $$ins = $$1 + $$2;
  insertfix $$ins;
  right ##cursor + strlen($$1);
  endgroupundo;
  return;

FormatToString:
  $$s = dllfuncstr("ReplaceRegular","(?<=([^.]|^)(\\\\\\\\)*)\\\\n",$$1, 0, "\n", 2);
  $$s = dllfuncstr("ReplaceRegular","\\\\\\\\",$$s, 0, "\\", 2);
  return $$s;

SkipKakko:
  if(code == ##1){
    undo;
    right;
  }
  return;

2 件のコメント:

  1. 自動起動マクロは使っていませんでしたが、試してみました。
    元のマクロは\beginと入力しようとすると、\bの後にeを打つまでにタイムラグがあり使いにくいですね。
    一方このマクロでは入力はスムーズですが補完候補は編集中ファイルのみのようですね。
    うまくストレス無く入力できればうれしいですね。

    返信削除
  2. 元のやつは自力で単語を回収していたのですが,それだとスピードが足りないみたいです.今回のは単純に辞書からと,秀丸自身が開いたファイルから回収したものにしてあります.(つまり秀丸自身の単語補完で辞書を指定した場合にかなり近い.)もっと賢くしたいならば,裏でプログラム実行ということになりそうですが,そこまでは……という感じです.まぁ辞書ファイルだけでもそれなりに有用なんじゃないかなぁと思ってはいます.

    返信削除

コメントの追加にはサードパーティーCookieの許可が必要です