マクロ runex で時間がかかるようになったNo.33082
kazu-ma さん 14/04/03 15:26
 
初めて投稿させて頂きます。
秀丸エディタを長い間使わせて頂いています。ありがとうございます。

さて、最新版(v8.35)で久しぶりに自作マクロを使用したところ、以前のバージョン
とは挙動が異なることに気付きました。
自作マクロではC++コード補完のためにClangを「runex」文を使って「同期」で呼び
出しているのですが、制御が返されずマクロが続行されません。以前(マクロを作っ
た頃)はこんなことはなかったはずだけど…と思って、同じ環境(PC/OS)で秀丸エディ
タのバージョンを変えて試してみたところ、v8.22より前のバージョンではそのよう
なことはないことが分かりました。

当方の環境と試したバージョンや結果は以下の通りです。

Windows 7 (日本語/64ビット版)
秀丸エディタ 日本語/64ビット版

v8.13 : 正常動作
v8.22 : 正常動作
v8.33 : 異常
v8.35 : 異常
v8.40b11 : 異常

秀丸エディタの動作設定はバージョン間で変更していません。また、マクロ実行時の
条件(編集ファイルや位置など)は同一となるようにしました。

自作マクロが外部ソフトやその環境などに影響されるため、その影響もあるかと思い
ますが、もしかしたらバージョンアップ時に必要な設定をしていない、などの見落と
しがあるかとも考えています。もし何か確認したほうがよい設定など思い当たる点が
ありましたらご指摘いただけないでしょうか。また設定以外にも確認が必要な点、あ
るいは必要な情報などありましたらご指摘いただければ幸いです。

以上、よろしくお願いします。

[ ]
RE:33082 マクロ runex で時間がかかるよNo.33084
秀丸担当 さん 14/04/03 16:25
 

バグ情報ありがとうございます。

関係ありそうな修正履歴が無いか調べてみたところでは、V8.30β12のときに標
準出力のバッファリングの改善があり、それが関係している可能性がありそうで
す。

以前にclangを試してみたことがあり、簡単なマクロを実行してみたところでは、
Windows7 64bit,秀丸エディタ V8.35 64bitで止まること無く動くようです。
以下の様なマクロを試しました。

message "開始";
runex "c:\\mingw\\bin\\clang.exe"
     + " -cc1 -fsyntax-only -code-completion-at="
     + basename + ":"+str(lineno)+":" +str(column+1) + " " + basename
    , 1 //sync
    , 0, "" //in
    , 4, "" //out
    , 0, "" //err
    , 1, "" //folder
    , 2, 1, 0;
message "終了";


ソースコードは以下のサンプルで試しました。

class {
 int member1;
 int member2;
} myclass;

int func( int ) {
   myclass.
}

これをtest.cppとして保存し、「myclass.」の直後にカーソルを置き、マクロを
実行しました。
実行結果は以下のものが得られました。


COMPLETION: member1 : [#int#]member1
COMPLETION: member2 : [#int#]member2
COMPLETION: operator= : [#<anonymous> &#]operator=(<#const <anonymous> &
#>)
COMPLETION: ~ : [#void#]~()


たぶん、runexの標準出力のパラメータ「, 4, "" //out」の部分が関係している
のではないかと思いますが、これを2でファイル名にしたり5で挿入したりしてみ
ましたが、こちらで試してみた限りでは応答はあるようです。
お手数ですが、このマクロとサンプルでどうなるか試してみてほしいです。

差し支えなければ、該当のrunexしている部分がどのような指定方法などかを教
えてもらえると助かります。

[ ]
RE:33084 マクロ runex で時間がかかるよNo.33088
kazu-ma さん 14/04/03 18:55
 
コメントありがとうございます。

まず最初にお詫びしなくてはなりません。原因の箇所は runex ではなく、その後で
実行されている文にあったようです。大変申し訳ありません。

改めて状況を書かせて頂きますが、まず最初に件の自作マクロはohtorii氏がサイト
で公開しておられるものを元にプリコンパイルヘッダを使用するようにする等の改造
を加えたものであることをお断りしておきます。従って以下に引用するマクロ記述も
氏のものと同一の部分があります。

最初の投降の後、件のマクロを実行したまましばらく放っておく状況があったのです
が、その際「変数用のメモリがいっぱいです」メッセージが表示され、該当箇所が表
示されました。これを参考に追いかけたところ、以下のwhile部分で無限ループに陥
っていました。

runex $g_clang_exe[##compiler] + " @\"" + $$cmdfile + "\"", 1
  , 0, ""
  , 5, ""
  , 0, ""
  , 1, ""
  , 2, 1, 0;
if(!result){
 message("runexの呼び出しで失敗");
 setactivehidemaru ##old_hidemaru;
 closehidemaruforced ##cur_hidemaru;
 return false;
}
//補完の候補を $$guess[] へ代入する。
gofiletop;
##guess_num = 0;
$$guess[0] = "";
$$guess_str = "";
searchdown2 "(?<=^COMPLETION:[ \\t]+)[^ ]+",casesense,regular,nohilight;
while(result){
 $$tmp = gettext2(seltopcolumn,seltoplineno,selendcolumn,selendlineno);
 if(strlen($$tmp)){
  $$topstr = leftstr($$tmp, 1);
  if($$topstr != "~"){ // デストラクタは除外
   $$guess_str = $$guess_str + $$tmp + "\n";
   $$guess[##guess_num] = $$tmp;
   ##guess_num = ##guess_num + 1;
  }
 }
 finddown2;
}

以前のバージョンでは serchdown2 → gettext2 → finddown2 の流れで次の補完候
補文字列へ移動していたようですが、v8.35では移動していませんでした。finddown2
 の前に「moveto2 0, selendlineno + 1;」を追加したところ正常に動作するように
なりました。

当方が改変履歴を見落としていたようです。お騒がして大変申し訳ありませんでした。

[ ]
RE:33088 マクロ runex で時間がかかるよNo.33092
秀丸担当 さん 14/04/04 10:41
 

>以前のバージョンでは serchdown2 → gettext2 → finddown2 の流れで次の補完候
>補文字列へ移動していたようですが、v8.35では移動していませんでした。finddown2
> の前に「moveto2 0, selendlineno + 1;」を追加したところ正常に動作するように
>なりました。

そうでしたか。
どのバージョンからそうなっているか調べてみたところ、V8.33β1で更新された
HmJre.dllのV4からそうなっていました。

前方一致に関する修正があり、HmJre.dll V4.00よりも前では、カーソル位置よ
りも前の前方一致は判断されていない問題があったところ、V4.00以降では正し
く判断されるようになりました。
例えば、以下のサンプルテキストがあるとします。

  前方一致-対象文字列1
  前方一致-対象文字列2

マクロは以下のようになっているとします。

  moveto 4,0;
  searchdown2 "(?<=前方一致)-対象文字列", regular;

カーソル位置は、「前方一致」の「前」の位置よりも右にあります。
ここから検索を開始すると、HmJre.dll V4.00よりも前では、「対象文字列1」
にはヒットせず、最初にヒットするが「対象文字列2」のほうでした。
HmJre.dll V4.00以降では、この点が修正され、「対象文字列1」のほうにヒッ
トするようになりました。

該当のマクロでは、
searchdown2 "(?<=^COMPLETION:[ \\t]+)[^ ]+",casesense,regular,nohilight;
の検索でその違いが表れていました。
現時点で考えられる対策としては、やはりカーソル位置を進めていただくのがい
いと思います。

[ ]
RE:33092 マクロ runex で時間がかかるよNo.33095
秀丸担当 さん 14/04/04 11:10
 

movetoする以外の別の対策として、finddown2の箇所はfinddownにしたほうがよ
さそうです。

searchdown2 "....",...;
while(result){
   :
  finddown;  //finddown2から変更
}

finddown2でいままでうまくいっていたのは、いままで前方一致がヒットしない
問題があったため、次に進めていたということになると思います。

通常の検索を使った場合は、finddown2を使うと過去のバージョンでも永久ルー
プしてしまうので、この部分はやはりfinddownにしておいたほうがいいと思いま
す。

[ ]
RE:33095 マクロ runex で時間がかかるよNo.33098
kazu-ma さん 14/04/04 13:15
 
お世話になります。

詳細をありがとうございます。
また対応策に関してもご指摘いただきましてありがとうございます。moveto に加え
て finddown も修正しておきたいと思います。

今回はお騒がして申し訳ありませんでした。
ありがとうございました。

[ ]