VisualC++と一緒につかう時の良い方法を教No.05401
show-2 さん 00/03/19 17:19
 
はじめまして、show-2と申します。

VisualC++5.0を使っていて、標準のエディターがどうも使いにくく、
良いエディターがないかと探しています。

秀丸の3.04をダウンロードし、
おおむね使い勝手がよくて気に入っているんですが、
1つだけ、この機能があったら便利だなと思うものがあります。

それは、VisualC++の開発環境で、
F4キーでエラーの出た行にジャンプしてくれる機能です。

エラーの行番号が出ているんだから、秀丸でその行にジャンプすれば
良いじゃないかといわれたらそれまでなんですが、
C言語って、前の行のエラーが原因で次の行がエラーになってしまって
いる場合が多いので、当然若い行番号のエラーから修正していきますよね。
そうすると、その修正で行番号がずれてしまい、
修正箇所が探しにくくなってしまいます。
F4キーの機能は、行がずれてもちゃんとサーチしてくれたので、
便利だなと思ってました。

今は、
普段のソースを書くときは、秀丸を使用して、
エラー修正時は、標準のエディターを使用しているのですが、
使い勝手が違うので、そこで戸惑ってしまうこともしょちゅうあります。

これって、
マクロやタグファイルなどを駆使して、何とかできるものなのでしょうか?
それとも、行番号を見てエラー修正するしかないのでしょうか?

みなさんは、どのように対応しているのでしょうか?
良い方法があったら教えてください。

[ ]
RE:05401 VisualC++と一緒につかう時の良No.05409
ひろ さん 00/03/20 16:34
 
 show-2 さん今日は、ひろです。
> F4キーの機能は、行がずれてもちゃんとサーチしてくれたので、
> 便利だなと思ってました。
 私は VC なんて高級な tool を使っていないのでよく分からないんですが、
上記を読んだ限りでは、行番号のズレなどの情報は標準の editor と、標準
editor や compiler などを統合している tool との連携で行っていると思い
ますので、秀丸側でなんとかするのは無理ではないでしょうか?
 もし連携 tool 側で使用する editor を指定できるなら上手くいくのかも
しれませんが...。

 後修正を行う前に、error などの起きる行をすべで、秀丸の「現行行のマー
ク」機能を使って marking しておけば、少しは使いやすくなると思います。

> マクロやタグファイルなどを駆使して、何とかできるものなのでしょうか?
 もし error を text file の落とせるのならば、上記の marking 作業を自
動化するのは可能だと思います。

> みなさんは、どのように対応しているのでしょうか?
 私の場合それほど size の大きな source は書かないし、一つ目の error
が後の error を誘発している場合もあるので、一つの error を直す度に
recompile しています。

 ## BC free compiler が出ましたが、秀丸と連携する macro を製作・公開
する方いませんかね〜。

[ ]
RE:05409 VisualC++と一緒につかう時の良No.05410
かかし さん 00/03/20 17:41
 
かかしです。

#ちょっと横道にそれてしまうかもしれませんが・・・。

> 後修正を行う前に、error などの起きる行をすべで、秀丸の「現行行のマー
>ク」機能を使って marking しておけば、少しは使いやすくなると思います。

コンパイルエラー、grepの結果などで

03T221PutMux\PutMux.c(253):                     hex2bin(I_OutData[Offset + T
Scnt],bin);
03T221PutMux\PutMux.c(302):                         hex2bin(I_OutData[Offset
 + TScnt],bin);
03T221PutMux\PutMux.c(363):                         hex2bin(I_OutData[Offset
 + TScnt],bin);
03T221PutMux\PutMux.c(377):                         hex2bin(A_OutData[Offset
 + TScnt],bin);
00SetMask\00AllMaskChk\setmask.c(19):  *    Func Name: hex2bin
00SetMask\00AllMaskChk\setmask.c(28): void hex2bin(
00SetMask\00AllMaskChk\setmask.c(103):      hex2bin(MaskTable.AudioMask,bin);
00SetMask\00AllMaskChk\setmask.c(132):

とあったとき、先頭のファイルの行をすべてマークしたいとき、
それをマクロで実行させることはできますか?
マクロヘルプでは、「マーク一覧に追加する」コマンドが見つからなかったので。

---かかし

[ ]
RE:05401 VisualC++と一緒につかう時の良No.05411
安久津 さん 00/03/20 19:44
 

>F4キーの機能は、行がずれてもちゃんとサーチしてくれたので、
>便利だなと思ってました。
完璧なものはできません。

// はじまり、
  escape; disabledraw;
  ##cx = x; ##cy = y;
  $$sb = searchbuffer; ##so = searchoption;
  call moveToErrLine;
  if( ##return ){
    escape; golinetop2;
    setsearch $$sb, ##so;
    enabledraw y - (windowheight / 2);
    endmacro;
  }
  escape; moveto ##cx, ##cy;
  setsearch $$sb, ##so; beep;
endmacro;
// さぶ
moveToErrLine:
  golinetop2; ##lineno = lineno;
  beginsel;
  searchdown "\\([0-9]+\\): ", regular;
  if( (result==0) || (lineno!=##lineno) ) return 0;

  $$file = gettext( seltopx, seltopy, selendx, selendy );
    escape; moveto selendx, selendy;
    searchdown "[0-9]+", regular;
  $$errlineno = gettext( seltopx, seltopy, selendx, selendy );
    // $$line にタブ以外の文字を入れる。
    searchdown "\\<[^\\t\\n]+",regular;// 適当に変えて。
    if( (result==0) || (lineno!=##lineno) ) return 0;
  $$line = gettext( seltopx, seltopy, selendx, selendy );
    escape;

  ##errlineno = val($$errlineno);
  if( strstr($$file,":") != -1 ) $$current = filename2;
  else $$current = basename2;
  if( $$file != $$current ){
    ##f = findhidemaru( $$file );
    if( ##f != -1 ) setactivehidemaru hidemaruhandle(##f);
    else openfile "\"" + $$file + "\"";// /j 不可
    disabledraw;
  }
  if( ##errlineno < linecount2 ) movetolineno 1, ##errlineno + 1;
  else gofileend;
  // 何バイト有効か不明
  if( strlen($$line) > 80 ) $$line = leftstr($$line,80);
  searchup $$line, casesense;
  if( result ) return 1;
  finddown;
  if( ! result ){
    if( ##errlineno < linecount2 ) movetolineno 1, ##errlineno;
    // ファイル開いちゃったので ##return == 1
  }
return 1;
// おしまい。

あくまで、代替マクロです。
VC++のエディタ風にするなら、
 Shift + F4, Shift + Ctrl + F4
に割り当てて下さい。
または、秀丸標準キー割当て風なら、
 Shift + F10, Shift + Ctrl + F10
に割り当てて下さい。

ではでは。

[ ]
RE:05409 VisualC++と一緒につかう時の良No.05414
安久津 さん 00/03/20 22:29
 

こんにちは ひろさん、安久津です。

> 私の場合それほど size の大きな source は書かないし、一つ目の error
>が後の error を誘発している場合もあるので、一つの error を直す度に
>recompile しています。
私も同様です。でも、たまに関連性のない複数の部分のエラーが出たときに、
行番号がずれてしまうのが不便だと思っていました。

> 後修正を行う前に、error などの起きる行をすべで、秀丸の「現行行のマー
>ク」機能を使って marking しておけば、少しは使いやすくなると思います。
なるほど。つーか、スゴイことだ。

// はじまり、
  ##limit = 100; // マークの上限。

  escape; disabledraw;
  gofiletop;
  searchdown "\\([0-9]+\\): ", regular;
  if( ! result ){ beep; endmacro; }
  escape; beginsel; golinetop2;
  $$file = gettext( seltopx, seltopy, selendx, selendy );
  ##top = lineno;

  if( linecount2 < (##limit + 1) ) gofileend;
  else movetolineno 1, ##limit + 1;
  searchup $$file + "(",casesense;
  while( result ){
    if( seltopx == 0 ) break;
    findup;
  }
  escape;
  ##end = lineno;

  ##i = 0;
  movetolineno 1, ##top;
  searchdown "\\([0-9]+\\): ", regular;;
  while( result ){
    if( lineno > ##end ) break;
    searchdown "[0-9]+",regular;
    $$lineno = gettext( seltopx, seltopy, selendx, selendy );
    ##lineno[##i] = val($$lineno);
    ##i = ##i + 1;
    // if( ##i >= ##limit ) break; // 制御は ##end で。
    movetolineno 1, lineno + 1;
    searchdown "\\([0-9]+\\): ", regular;;
  }
  ##limit = ##i;
  gofiletop;

  if( strstr($$file,":") != -1 ) $$current = filename2;
  else $$current = basename2;
  if( $$file != $$current ){
    ##f = findhidemaru( $$file );
    if( ##f != -1 ) setactivehidemaru hidemaruhandle(##f);
    else openfile "\"" + $$file + "\"";
    disabledraw;
  }

  gofiletop;
  ##i = 0;
  while( ##i < ##limit ){
    movetolineno 1, ##lineno[##i];
    setmark;
    ##i = ##i + 1;
  }
  gofiletop; nextmark;
  beep;
endmacro;
// おわり。

動作環境あれこれ。
「ファイルを閉じるときにマーク一覧をクリアする」設定。
「マークした行の行番号」に特殊な色、スタイル割当て。

ではでは。
#いままで気づかなかった。
#「マーク」は、このために存在するような気がする。
#使っていなかったのは私だけ? バカじゃん。(^^;

[ ]
RE:05410 VisualC++と一緒につかう時の良No.05415
ひろ さん 00/03/21 10:59
 
 かかしさん今日は、ひろです。
> とあったとき、先頭のファイルの行をすべてマークしたいとき、
> それをマクロで実行させることはできますか?
 例えば grep の結果、hit した行を全て mark したい場合、grep の結果
windows を active にした状態で、
//-------------------------------------------------------------------
gofiletop;//念のため
while(1){
  tagjump;
  setmark;
  backtagjump;
  movetolineno 1,lineno+1;
  if(linelen2==0)break;
}
//--------------------------------------------------------------------
を実行します。ただ作っていて気付いたのですが、cursor のある行が mark
されているか調べる command や mark 一覧を clear する command が見つか
らなかったので、予め「マーク一覧」で「全てクリア」しておく必要があり
ます。
 P.S 上記の command を知っている方教えてください。

[ ]
RE:05415 VisualC++と一緒につかう時の良No.05416
ENCODINGSHIFTJIS さん 00/03/21 15:23
 

>を実行します。ただ作っていて気付いたのですが、cursor のある行が mark
>されているか調べる command
昔、探したがありませんでした。範囲で処理するときに便利なのだが。
(外字のマークを埋め込まなくとも)

>や mark 一覧を clear する command が見つか
>らなかったので、予め「マーク一覧」で「全てクリア」しておく必要があり
>ます。

外からキー入力、とりあえずの対応では。

// marklistclear.mac  ======================================
// marklist これではうまくなかった。先にActiveでは?
run "WScript Sendkeys.js %%SM %%A {ESC}"; // ALT+SM ALT+A ESC


// Sendkeys.js    アクティブ画面にキー入力  =================
//  使い方(キー指定の書き方は WSHのヘルプを参照)
// run "WScript Sendkey.js %%A %%{F4}"; // ALT+A   ALT+F4
//
var enu=new Enumerator( WScript.Arguments );
var  Sh=WScript.CreateObject("WScript.Shell");
for(; !enu.atEnd(); enu.moveNext()){
     Sh.Sendkeys(enu.item());
WScript.Sleep(666);                  // 微妙
 }

__E__

[ ]
RE:05416 VisualC++と一緒につかう時の良No.05417
ひろ さん 00/03/21 18:34
 
 ENCODINGSHIFTJIS さん今日は、ひろです。
> 昔、探したがありませんでした。範囲で処理するときに便利なのだが。
 やっぱり有りませんか(;_;)。

> //  使い方(キー指定の書き方は WSHのヘルプを参照)
 そういえば、最近話題になっている WSH を使う手がありますね。

[ ]
RE:05401 VisualC++と一緒につかう時の良No.05423
秀丸担当 さん 00/03/21 19:02
 
>それは、VisualC++の開発環境で、
>F4キーでエラーの出た行にジャンプしてくれる機能です。

これができれば便利ですね。
VCの出す出力を、どこかファイルに出力させて、それを秀丸で
開いてタグジャンプすれば、できますが、ファイルに出力させ
る方法がわからない。
とりあえず出力をCtrl+2(アウトプットに移動)、Ctrl+A(全て
選択)、Ctrl+C(コピー)して、秀丸に貼りつければ、簡単に
できます。

[ ]
RE:05415 VisualC++と一緒につかう時の良No.05424
秀丸担当 さん 00/03/21 19:02
 
>を実行します。ただ作っていて気付いたのですが、cursor のある行が mark
>されているか調べる command や mark 一覧を clear する command が見つか
>らなかったので、予め「マーク一覧」で「全てクリア」しておく必要があり
>ます。
> P.S 上記の command を知っている方教えてください。

全てクリアのコマンドはありません。
追加を検討しておきます。

[ ]
RE:05415 VisualC++と一緒につかう時の良No.05433
きいろいまふらあ さん 00/03/22 08:49
 
横から失礼します。
きいろいまふらあです。

>  tagjump;

>  backtagjump;

こないだ、これらがうまく動いてくれなくて苦労しました。(^^;
#いまは休養中。

安定稼動します?>ひろさん

[ ]
RE:05433 VisualC++と一緒につかう時の良No.05435
ENCODINGSHIFTJIS さん 00/03/22 10:59
 
>安定稼動します?>ひろさん

//
// 安定確率向上で tagjump しているみたいです。まとめてみました。
// ダメなら2回実行
// 画面の切替えとマクロ実行buff の切替えは謎です。

// cursor のある行が mark
// されているか調べる command や mark 一覧を clear する command が見つか
// らなかったので、予め「マーク一覧」で「全てクリア」しておく必要があります。

// Sleep は 66msec でも動いた。
//                  run の時は %%A // 説明ほしい
// grep面を閉じると grep元面が出てくる。

runsync "WScript Sendkeys.js %SM %A {ESC}"; // ALT+SM ALT+A ESC
//  grep 元面も開いておきます。

// 例えば grep の結果、hit した行を全て mark したい場合、grep の結果
// windows を active にした状態で、
//-------------------------------------------------------------------
gofiletop;//念のため
#hwnd=hidemaruhandle(0); // grep結果面
while(1){
  call TAGJUMP;
  setmark;
  call BACKTAGJUMP;
  movetolineno 1,lineno+1;
  if(linelen2==0)break;
}
//--------------------------------------------------------------------
endmacro

//  #hwnd=hidemaruhandle(0); // grep結果面
TAGJUMP:// いくぶん安定化 tagjump ------------------
      ##c=hidemarucount;
tagjump // 面は必ず開く
if(#hwnd==hidemaruhandle(0)){      // 飛んでない
while(##c==hidemarucount){      // カウント待ち
    setactivehidemaru -1;      // 強制移動刺激
runsync2 "command.com /c dir";// Sleep を入れる
 }
}
return;//------------------ TAGJUMP

BACKTAGJUMP:// --------------------------------------
while(#hwnd!=hidemaruhandle(0))setactivehidemaru #hwnd;
return;// ------------------ BACKTAGJUMP

// 先に面のハンドル値を収集しておき setactivehidemaru で切り替えたほうが
// (back)tagjump よりも軽負荷かもしれない。tagjumpは複数ファイルを対象に
// した時使いやすいが、固定の2面では setactivehidemaru と同じ。

__END__

[ ]
RE:05424 VisualC++と一緒につかう時の良No.05446
ひろ さん 00/03/22 15:51
 
 秀丸担当様今日は、ひろです。
> 全てクリアのコマンドはありません。
> 追加を検討しておきます。
 そういうつもりではなかったのですが(^^;、あると便利です。どうかよろ
しくお願いします。

[ ]
RE:05433 VisualC++と一緒につかう時の良No.05447
ひろ さん 00/03/22 15:51
 
 きいろいまふらあさん今日は、ひろです。
> こないだ、これらがうまく動いてくれなくて苦労しました。(^^;
 grep の前後の行の取得ですよね。読んでました。

> 安定稼動します?>ひろさん
 それほど多くの file を開いて作業を行わなければ大丈夫なようです。た
だ既に報告済みなのですが、「ウイルスバスター2000」と組み合わせている
と、memory 不足に陥ることが有るようで、それが原因で window の切り替え
が上手くいかなくなることが有るようです。

[ ]
RE:05447 VisualC++と一緒につかう時の良No.05453
ENCODINGSHIFTJIS さん 00/03/22 18:31
 
>それが原因で window の切り替えが上手くいかなくなることが有るようです。

私の場合は Office の Findfast の バックグラウンドの Index 更新に引っ掛かると
秀丸の openfile がもたつきます。カーネル:プロセスセッサ使用率が50%以上になり
かな漢字変換も遅くなります。普通5分以内で終了。
コントロールパネル参照(Office を入れている人は)
__E__

[ ]
RE:05401 VisualC++と一緒につかう時の良No.05481
show-2 さん 00/03/26 20:32
 
すいません、レスを付けるのが遅くなりました。

完全にとまでは行きませんが、行のマーク機能とマクロで近いことが
できるのはわかりました。
これで、安心して秀丸を使って行けます。
また、秀丸にコンパイルエラーログを取りこめば、タグジャンプ機能が
使えるのもわかったので、活用したいと思います。

ただ、
安久津さんの作成したマクロは、なぜか私の所では上手く動作しません
でした。(コンパイルエラーログを秀丸に取りこんで、
マクロを実行したのですが、使い方はあってますよね)
私は秀丸初心者なので、どこでコケているのかわからないのですが、
マクロを勉強しながら、このマクロを改造してみようかと思っています。

皆さん、レスありがとうございました。

[ ]
RE:05481 VisualC++と一緒につかう時の良No.05487
安久津 さん 00/03/27 21:54
 

>安久津さんの作成したマクロは、なぜか私の所では上手く動作しません
>でした。(コンパイルエラーログを秀丸に取りこんで、
05411,05414 のどっちのマクロか分かりませんが、どうでもいいです。(^^;
現在の私は、次のマクロで「エラー行のマーキング」を行っています。

// はじまり、
//  menu "<< Set Mark >>","&C] C or Hidemaru","&J] Java","&Q] Quit ( ESC )";
//  ##item = result - 1;
//  if( ##item <= 0 || ##item == 3 ) endmacro;
//  else if( ##item == 1 ) $$errlineno = "\\([0-9]+\\):";
//  else $$errlineno = ":[0-9]+:";

  $$errlineno = "\\([0-9]+\\):";
  ##limit = 20; // 秀丸のマーク上限が 20 でした。(^^;
  escape; disabledraw;
  gofiletop;
  searchdown $$errlineno, regular;
  if( ! result ){ beep; endmacro; }
  escape; ##valid = column;
  beginsel; golinetop2;
  $$file = gettext( seltopx, seltopy, selendx, selendy );

  gofiletop; ##i = 0;
  searchdown $$errlineno, regular;
  while( result ){
    if( column == ##valid ){
      searchdown "[0-9]+",regular;
      $$tmp = gettext( seltopx, seltopy, selendx, selendy );
      ##lineno[##i] = val($$tmp);
      ##i = ##i + 1;
      if( ##i == ##limit ) break;
    }
    searchdown $$errlineno, regular;
  }
  ##limit = ##i; gofiletop;
  if( strstr($$file,":") != -1 ){
    $$current = filename2;
  }else{
    $$dir = directory2;
    if( rightstr($$dir,1)!= "\\" ) $$dir = $$dir + "\\";
    $$current = $$dir + basename2;
    $$file = $$dir + $$file;
  }
  if( $$file != $$current ){
    ##f = findhidemaru( $$file );
    if( ##f == -1 ) openfile "\"" + $$file + "\"";
    else setactivehidemaru hidemaruhandle(##f);
    gofiletop; disabledraw;
  }

  ##i = 0;
  while( ##i < ##limit ){
    if( ##lineno[##i] > linecount2 ){ beep; endmacro; }
    movetolineno 1, ##lineno[##i];
    setmark;
    ##i = ##i + 1;
  }
  movetolineno 1, ##lineno[0];
  beep;
endmacro;
// おわり。

コンパイラーに合わせて、$$errlineno = "\\([0-9]+\\):"; を書き換えて下さい。
場合によっては、$$file, $$current の書き換えが必要かもしれません。
#少なくとも、秀丸グレップと Javaでは快適。(^^)
ではでは。

[ ]
RE:05487 VisualC++と一緒につかう時の良No.05553
ENCODINGSHIFTJIS さん 00/04/05 11:41
 
別解法

// TagJump99.mac
//  人の動作をシミュレート、不完全でも軽く処理
//   setmark は 読めない漢字を埋め込んでもよい、制限ナシ

//    grep行で起動する
// PutMux\PutMux.c(302):hex2bin(I_OutData[Offset + TScnt],bin);
// PutMux\PutMux.c(363):hex2bin(I_OutData[Offset + TScnt],bin);
//
// 照合する文字列を取る。行の形で様々
escape; golinetop searchdown ":";if(!result)endmacro
right;beginsel golineend
if((selendx-seltopx)>55)      ##ex=seltopx+55;// 検索最大長?
else                          ##ex=selendx;
$$tmp=gettext(seltopx,seltopy,##ex,selendy);
tagjump // するつもり
##y=y;
              up; searchdown $$tmp; // 行内容を照合確認
if(!result){down; findup }
if((##y-y)< -99 ||(##y-y)>99) beep

 

[ ]