Perl等の文法チェックNo.03203
PRDX さん 02/06/24 20:58
 
はじめまして。

Perl言語では、コマンドプロンプト上で
perl xxx.pl
とすることでスクリプトの実行が出来ます。
また
perl -cw xxx.pl
とすることで文法のチェックができます。

これをいちいちコマンドプロンプトで呼び出すのは面倒だと
思って、マクロにはじめて触ろうとしたのですが、どうもわ
からなかったので質問を書いている次第です。

【やりたいこと】
1. エラーチェックした結果がダイアログで表示される。
2. Perlで実行した結果が新規秀丸で表示される。
ということです。

特に1マクロにまとめてしまう必要はありません。
どなたかご教授おねがいします。

[ ]
RE:03203 Perl等の文法チェックNo.03204
ひろ さん 02/06/24 23:33
 
 PRDX さん今日は、ひろです。
> perl -cw xxx.pl
> とすることで文法のチェックができます。
>
> これをいちいちコマンドプロンプトで呼び出すのは面倒
<中略>
> 2. Perlで実行した結果が新規秀丸で表示される。
この方法なら簡単です。開いているファイルに対して文法チェックするなら、
末尾のマクロで出来ます。
 あと出力結果をタグジャンプできる形式、
file name(line number): error content
というように整形するとより便利でしょうね。ただし Perl がどの様な形式で
エラー出力をするかはっきりと知りませんので、この点については割愛します。
//----------------------------------------------------------------------
run "perl -cw \"" + basename + "\" > con";

[ ]
RE:03204 Perl等の文法チェックNo.03233
PRDX さん 02/07/24 02:33
 
> PRDX さん今日は、ひろです。
ひろさんこんにちは。
返事がおくれてすいません。
できました♪ありがとうございます。

秀丸マクロってすごいですね。

それで自分でもっと便利にしようと
いろいろやってみようとしたのですけれども、
どうもうまくいきませんでした。

やろうとしたのは
・エラー行にマークする
・エラー行にタグジャンプ
というものだったのですけれども、

マークの仕方からわからなくて、初心者にマクロを作るのは難しいのですかね・・・・

ループ部分は
movetolineno 1,【引数:エラー行】;
setmark;
になるのかなぁ。

Perlのエラー文は
Unquoted string "run" may clash with future reserved word at perl.mac line 1.
String found where operator expected at perl.mac line 1, near "run "perl -cw
 \"""
(Do you need to predeclare run?)
Unquoted string "basename" may clash with future reserved word at perl.mac l
ine 1.
Unquoted string "movetolineno" may clash with future reserved word at perl.m
ac line 3.
Number found where operator expected at perl.mac line 3, near "movetolineno 1"
(Do you need to predeclare movetolineno?)
Unquoted string "setmark" may clash with future reserved word at perl.mac li
ne 4.
Bareword found where operator expected at perl.mac line 9, near "//file"
(Missing operator before file?)
syntax error at perl.mac line 1, near "run "perl -cw \"""
syntax error at perl.mac line 9, near "//file name"
perl.mac had compilation errors.
のようなものになります。

これはPerl用に書かれていないものをPerlで文法チェックしました。

正常な場合は、
jcode.pl syntax OK
のように表示されます。

マクロでやる作業というのは
新規秀丸で開かれた文章を取得して"line \d+"となる部分を抜き出して
それぞれの行について、マーク作業とタグジャンプを実行すればいいのですかねぇ?
新規秀丸で開かれた文章の取得からわからなくてお先真っ暗です。
初心者過ぎて場違いなのはわかっているのですが、どなたか教えてくださいませ。<
(_ _)>

[ ]
RE:03233 Perl等の文法チェックNo.03234
KaToH-J さん 02/07/24 08:54
 
 Masayuki KaToHです。

置換で
検索欄 .+ \fat \f.+\f line \f[0-9]+\f.+\f
置換欄 \2(\4):\0\1\2\3\4\5\6
これで、整形してタグジャンプするというのはどうでしょう。動くかどうかは試
してませんが、PRDXさんの書いていただいたエラーログはそれなりに整形できま
した。

>マクロでやる作業というのは
>新規秀丸で開かれた文章を取得して"line \d+"となる部分を抜き出して
>それぞれの行について、マーク作業とタグジャンプを実行すればいいのですかねぇ?
>新規秀丸で開かれた文章の取得からわからなくてお先真っ暗です。
>初心者過ぎて場違いなのはわかっているのですが、どなたか教えてくださいませ。<
>(_ _)>

[ ]
RE:03234 Perl等の文法チェックNo.03235
PRDX さん 02/07/24 12:53
 
> Masayuki KaToHです。
はじめまして、PRDXです。よろしくお願いします。

>置換で
>検索欄 .+ \fat \f.+\f line \f[0-9]+\f.+\f
>置換欄 \2(\4):\0\1\2\3\4\5\6
>これで、整形してタグジャンプするというのはどうでしょう。動くかどうかは試
>してませんが、PRDXさんの書いていただいたエラーログはそれなりに整形できま
>した。

ありがとうございます。

そうなると、マクロのイメージですけど、こんなかんじになるのでしょうか?
初心者なので、なにぶんおかしな書き方をしているかもしれませんが、勘弁してくだ
さいませ。

#i = 0;
// エラー行を抽出
while(【.+ \fat \f.+\f line \f[0-9]+\f.+\f】の頭から置換処理1個){

// 配列への追加処理をしたいのですけど、書き方がこれくらいしかわからないので
す(-.-;)
  #i++;
  #ERROR_LINE[$i++] = 【検索でHITした行数=\4】;
}

// 取得したエラー行について繰り返し
// これも書きたがおかしいかもしれません。



#j = 0;
// #i にはヒットした数-1が入っているつもり
// #j がそれになるまで繰り返し
while(#j == #i){
  movetolineno 1,【引数:エラー行】;
  setmark;

  //タグジャンプに必要な作業ってなんだろう・・・?

  #j++;
}
//終わり

>>マクロでやる作業というのは
>>新規秀丸で開かれた文章を取得して"line \d+"となる部分を抜き出して
>>それぞれの行について、マーク作業とタグジャンプを実行すればいいのですかねぇ?
>>新規秀丸で開かれた文章の取得からわからなくてお先真っ暗です。
>>初心者過ぎて場違いなのはわかっているのですが、どなたか教えてくださいませ。<
>>(_ _)>

[ ]
RE:03235 Perl等の文法チェックNo.03236
KaToH-J さん 02/07/24 13:27
 
 Masayuki KaToHです。

適当に作ったマクロで下記みたいのができました。速度的にも効率的にも
かなりとりあえずバージョンなので、かなりイマイチです(笑。

>秀丸担当さん
 なんか、内部的な値を表現するキーワードのmarkedが常にゼロなので
うまくこのマクロうまく動きません。(マークon/offが繰り返される)ためしに
#test = marked;message str(#test);
の一行マクロを実行させても常にゼロなんですが・・・何か使い方おかしい
ですかね?

というわけで↓ここからperlのエラーログを整形してエラー行にマークをつける
マクロです。上記問題で、すでにマークされている行もsetmarkしてしまうため
解除されてしまいます。
//タグジャンプできる形にエラーログを整形
replaceallfast ".+ \\fat \\f.+\\f line \\f[0-9]+\\f.+\\f","\\2(\\4):\\0\\1\\
2\\3\\4\\5\\6",regular;

//とりあえず、ファイル先頭に動く
gofiletop;
//無限ループスタート
while(1){
down;
// カーソル下移動に失敗したら(つまりこれ以上チェックする行が無ければ)終了
if (result == false)endmacro;
tagjump;
// タグジャンプに成功したときだけ、マークして戻ってくる
if (result == true){
if (marked == 0){ //マークされてないときだけマーク
setmark;
}
backtagjump;
}
}

[ ]
RE:03235 Perl等の文法チェックNo.03238
ひろ さん 02/07/24 14:34
 
 PRDX さん今日は、ひろです。
> そうなると、マクロのイメージですけど、こんなかんじになるのでしょうか?
 何が書きたいか解らない(^^;。
 ##Perl も秀丸のマクロも C に文法が似ているので、Perl のならどう書く
かを書いた方が解りやすいかも。

 PRDX さんの遣りたいことを一度に処理するなら、末尾のマクロです。
 ただし http://www.maruo.co.jp/hidesoft/4/m020724.html#3236 にて
KaToH-J さんも仰っている問題で、上手く動作しません。
//----------------------------------------------------------------------
$name = basename;
openfile "/h";
#main = hidemaruhandle( 0 );
selectall;
run "perl -cw \"" + $name + "\" > con";
replaceallfast ".+ \\fat \\f.+\\f line \\f[0-9]+\\f.+\\f",
  "\\2(\\4):\\0\\1\\2\\3\\4\\5\\6",regular;
clearupdated;
showwindow 1;
gofiletop;
//現状ではここまでを切り取って使用した方が良い
##i = 2;
while( 1 ){
  tagjump;
  if( result ){
    if( !marked )setmark;
  }
  setactivehidemaru #main;
  movetolineno 1, ##i;
  if( code == eof )break;
  ##i = ##i + 1;
}

[ ]
RE:03235 Perlの環境No.03239
PRDX さん 02/07/24 14:39
 
Perlの動作ができる環境にはActivePerlをいれるのがいいのはわかっているのですが、
perl.exeだけでも文法チェックはできる気がするので

http://www.web.hmcbest.com/perl/perl.exe

からDLしてください。

サンプルプログラムとして

http://www.web.hmcbest.com/perl/show.txt

を置いておきます。
これはカレンダを表示するプログラムです。

だめなら

print "OK";

とだけ書いたプログラムをサンプルに使ってくださいませ。



動作させる場合は
perl show.txt
文法チェックは
perl -cw show.txt

エラーを表示させたいときは
C用のソースをPerlで文法チェックすればばっちりですw



[ ]
RE:03238 Perlだと・・・No.03240
PRDX さん 02/07/24 15:29
 
> PRDX さん今日は、ひろです。
こんにちは。
>> そうなると、マクロのイメージですけど、こんなかんじになるのでしょうか?
> 何が書きたいか解らない(^^;。
ごめんなさい。
> ##Perl も秀丸のマクロも C に文法が似ているので、Perl のならどう書く
>かを書いた方が解りやすいかも。

Perlで書いてみました。
エラー行のマーク処理がPerlにはないので、
代わりにprintするだけになっています。
データのチェックをしたファイルのマークをする作業のかわりです。

#/usr/bin/perl

#エラー文の補足
# 本当はperl -cw をつかって文法チェックをすべきですが、ここではエラーを捕捉
したことにします。
#
# open(PROC,"perl -cw $target 2>&1 |");
#  @ERRORS=<PROC>;
# close(PROC);
 
$ERRORS = <<END_ERROR;
Unquoted string "run" may clash with future reserved word at perl.mac line 1.
String found where operator expected at perl.mac line 1, near "run "perl -cw
 \"""
(Do you need to predeclare run?)
Unquoted string "basename" may clash with future reserved word at perl.mac l
ine 1.
Unquoted string "movetolineno" may clash with future reserved word at perl.m
ac line 3.
Number found where operator expected at perl.mac line 3, near "movetolineno 1"
(Do you need to predeclare movetolineno?)
Unquoted string "setmark" may clash with future reserved word at perl.mac li
ne 4.
Bareword found where operator expected at perl.mac line 9, near "//file"
(Missing operator before file?)
syntax error at perl.mac line 1, near "run "perl -cw \"""
syntax error at perl.mac line 9, near "//file name"
perl.mac had compilation errors.
END_ERROR
@ERRORS = split(/\n/,$ERRORS);
#ここまで捕捉作業と同等のことをしようとした


foreach $line (@ERRORS){
 エラー行を探し出します+エラー行を抽出します。
$line =~ s/^(.*?)(at )(.*?)( line )(\d+)(.*)$/$3\($5\):$1$2$3$4$5$6/g;
#マーク作業がPerlにはないので、printすることにします
#同じ行がHITしますので、かぶるものを除去する必要があるんですけど、してま
せん。
print "$5\n";

#置換後のメッセージを出すために配列にいったん入れます。
push (@ERROR,$line);
}

#配列に入れた文字を出力します。
foreach(@ERROR){
print "$_\n";
}

exit;


[ ]
RE:03238 Perl等の文法チェックNo.03241
PRDX さん 02/07/24 15:39
 
> PRDX さんの遣りたいことを一度に処理するなら、末尾のマクロです。
> ただし http://www.maruo.co.jp/hidesoft/4/m020724.html#3236 にて
>KaToH-J さんも仰っている問題で、上手く動作しません。
>//----------------------------------------------------------------------

マクロ使ってみました。これは新規秀丸でひらくんですね。
まくろファイルを文法チェックかけたら無限ループで秀丸が開いてびっくりしました。


マークに関してなのですけれども、僕の表現が下手なせいで、うまく伝わっていなか
ったみたいです。
すいません。

マークしたいのは、チェックしたソースのエラーがあった行で、
文法チェック時の窓ではないんです。


イメージを書くのですけど、

ソース編集をしている。
文法チェックマクロを立ち上げる
新規秀丸が立ち上がって、エラーメッセージが表示される。
ソース編集をしている秀丸をみると、エラーが見つかった行に
マークがされている

というようなものにしたかったのです。

誤解をまねく表現ですいません。

[ ]
RE:03241 Perl等の文法チェックNo.03242
KaToH-J さん 02/07/24 18:45
 
 Masayuki KaToHです。
 
 ひろさんのマクロ
run "perl -cw \"" + basename + "\" > con";
 で出てきた、ウィンドウに対して僕のマクロを実行すれば
>ソース編集をしている。
>文法チェックマクロを立ち上げる
>新規秀丸が立ち上がって、エラーメッセージが表示される。
>ソース編集をしている秀丸をみると、エラーが見つかった行に
>マークがされている
 ができていると思いますがだめでしょうか?
 あ、もしかして、「動作環境→排他制御→同じファイルを開く処理」を
同じファイルを2つ開くことを禁止するにしてないとだめかも。
 (タグジャンプだから関係ないと思うんだけど)

[ ]
RE:03242 Perl等の文法チェックNo.03243
PRDX さん 02/07/25 00:27
 
> Masayuki KaToHです。
> 
> ひろさんのマクロ
>run "perl -cw \"" + basename + "\" > con";
> で出てきた、ウィンドウに対して僕のマクロを実行すれば
>>ソース編集をしている。
>>文法チェックマクロを立ち上げる
>>新規秀丸が立ち上がって、エラーメッセージが表示される。
>>ソース編集をしている秀丸をみると、エラーが見つかった行に
>>マークがされている
> ができていると思いますがだめでしょうか?

こういう風に使うのですね!できました。

新規秀丸でマクロを実行させることを
ソース側のマクロで制御することは可能なんですか?

[ ]
RE:03243 Perl等の文法チェックNo.03244
PRDX さん 02/07/25 00:46
 
こんばんわ。
>新規秀丸でマクロを実行させることを
>ソース側のマクロで制御することは可能なんですか?
できました。ヘルプも見ないですいません。
僕のやりたかったことは、こんなことです。
ただ、ソースじゃないほうにマークされることがあるみたいです。
Unquoted string "run" may clash with future reserved word at perl.mac line 1.
String found where operator expected at perl.mac line 1, near "run "perl -cw
 \"""
(Do you need to predeclare run?)
Unquoted string "basename" may clash with future reserved word at perl.mac l
ine 1.
String found where operator expected at perl.mac line 2, near "runsync2 "per
l -cw \"""
(Do you need to predeclare runsync2?)
Unquoted string "basename" may clash with future reserved word at perl.mac l
ine 2.
syntax error at perl.mac line 1, near "run "perl -cw \"""
Unrecognized character \x82 at perl.mac line 6.
エラー文はこれです。

なぜ、2行目があるかというと、結果をまたないと
置換処理ができないからです。
syncだと、秀丸ではなくてコマンドプロンプトが立ち上がるんですね。
wait とか sleep とかないみたいでしたので、こんな処理に。
他によい処理ってありますか?



run "perl -cw \"" + basename + "\" > con";
runsync2 "perl -cw \"" + basename + "\" > con";


setactivehidemaru findhidemaru("perl.exe -cw");

//とりあえず、ファイル先頭に動く
gofiletop;

//タグジャンプできる形にエラーログを整形
replaceallfast ".+ \\fat \\f.+\\f line \\f[0-9]+\\f.+\\f","\\2(\\4):\\0\\1\\
2\\3\\4\\5\\6",regular;
//とりあえず、ファイル先頭に動く
gofiletop;

//とりあえず、ファイル先頭に動く
gofiletop;

//無限ループスタート
while(1){
down;
// カーソル下移動に失敗したら(つまりこれ以上チェックする行が無ければ)終了
if (result == false)endmacro;
tagjump;
// タグジャンプに成功したときだけ、マークして戻ってくる
if (result == true){
if (marked == 0){ //マークされてないときだけマーク
setmark;
}
backtagjump;
}

}

[ ]
RE:03244 Perl等の文法チェックNo.03245
KaToH-J さん 02/07/25 01:25
 
 Masayuki KaToHです。

>ただ、ソースじゃないほうにマークされることがあるみたいです。

これは、setmarkの前にメッセージ表示させるなどをして自分でデバッグしてみ
てください。ごめんw。

>なぜ、2行目があるかというと、結果をまたないと
>置換処理ができないからです。

というのは

>run "perl -cw \"" + basename + "\" > con";
>runsync2 "perl -cw \"" + basename + "\" > con";

の2行目のことでしょうか?perlを実行することはあんまりないのでよくわかり
ませんが、どちらか1行でいいはずです。

後、秀丸ヘルプを見ていただくとわかりますが、マークは20個までしかできませ
ん。ですから、エラー行が20を超えると古い順から消えていくことになります。
お気をつけください。
#ありがとうENCODINGSHIFTJISさん。
#エラーログ整形法も過去にあなたに教えていただきました〜。

runsync2の出力をconではなく、perlerr.logといった適当なファイル名に出力さ
せた後に、そのファイルをopenして作業してはいかがでしょうか。そのファイル
に今問題修正中の行リストができあがってるわけですので、実際マークしている
のと同じように扱えると思うのですが。

[ ]
RE:03245 わからないことNo.03246
PRDX さん 02/07/25 02:18
 
> Masayuki KaToHです。
>
>>run "perl -cw \"" + basename + "\" > con";
>>runsync2 "perl -cw \"" + basename + "\" > con";
>
>の2行目のことでしょうか?perlを実行することはあんまりないのでよくわかり
>ませんが、どちらか1行でいいはずです。

新規ひでまるがエラーの文章を取得する前に置換作業に入ってしまうための措置とし
てやってみました。

新規ひでまるになるようにして、マクロを停止させておくことはできないのでしょう
かねぇ・・・

やりかたがわかったので、マクロを自分で書いてみているのですが、わからないこと
が出てきました。
やり方をご存知の方は教えてください。よろしくお願いします。

1.ファイルの削除。

2.正規表現で検索した文字列のメッセージ出力
  「line [0-9]+」となっている数字の部分のみを取り出してメッセージ出力がした
いのです。

自分でやってみたのは以下のものです。動作しませんでした。
while(1){
searchdown " line \f[0-9]+";
message getsearch;
if(!result){break;}
message \1;
}

[ ]
RE:03246 Macro for Perl version 0.90No.03247
PRDX さん 02/07/25 02:45
 
>やりかたがわかったので、マクロを自分で書いてみているのですが
未完成ながら、やりたかったことがわかってもらえるかも、と思って公開しました。
一応ライセンス付です(笑)。

// Macro for Perl v0.90
// (c)2002 Anyone.
//====================================================================
// Use and redistribution for ANY PURPOSE are granted as long as all
// copyright notices are retained.  Redistribution with modification
// is allowed provided that you make your modified version obviously
// distinguishable from the original one.  THIS SOFTWARE IS PROVIDED
// BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES ARE
// DISCLAIMED.
//====================================================================
// 変数の準備
$basename = basename;

//====================================================================
MENU:// メニュー画面の表示
menu
"【秀】プログラム実行",
" Perl文法チェック";

// 選択項目に応じた処理
if(result ==0 ){endmacro;} // ESC なら終了
else if(result ==1 ){call SubDoOnHide;}
else if(result ==2 ){call SubSyntaxCheck;}

SubDoOnHide://秀丸でプログラムを実行
saveas $basename +".tmp.hpl";
changename $basename;
run "perl \"" + $basename + ".tmp.hpl\" > con";
// ファイルの削除ってどうやるのだろう?
endmacro;

SubSyntaxCheck://プログラムの文法チェック
saveas $basename +".tmp.hpl";
changename $basename;

// 文法チェックを実行
run "perl -cw \"" + $basename + ".tmp.hpl\" > con";
runsync2 "perl -cw \"" + $basename + ".tmp.hpl\" > con"; // waitのかわり
runsync2 "perl -cw \"" + $basename + ".tmp.hpl\" > con"; // waitのかわり
runsync2 "perl -cw \"" + $basename + ".tmp.hpl\" > con"; // waitのかわり
runsync2 "perl -cw \"" + $basename + ".tmp.hpl\" > con"; // waitのかわり
setactivehidemaru findhidemaru("perl.exe");

// ファイルの頭に移動
gofiletop;

// エラー行を収集(未完成)
#i = 0;
while(1){
searchdown "line ([0-9]+)";
if(!result){break;}
#ERROR[ #i++ ] = $1;
}

// エラー行をマーク(未確認)
setactivehidemaru findhidemaru($basename);
#j = 0;
while(#i < #j){
moveto 1,#ERROR[#j++];
if(!marked){setmark;}
}
// ファイルの削除ってどうやるのだろう?
endmacro;

[ ]
RE:03247 Macro for Perl version 0.90No.03250
KaToH-J さん 02/07/25 11:55
 
 Masayuki KaToHです。
>run "perl -cw \"" + $basename + ".tmp.hpl\" > con";
>runsync2 "perl -cw \"" + $basename + ".tmp.hpl\" > con"; //
 runsync2は、リダイレクション機能が使えません。helpを参照してください。
リダイレクションについては、秀丸ウィンドウから「その他」→「プログラム実行」
で出てくるダイアログのヘルプを押してみるとわかると思います。ここを読めばファ
イルを消すマクロのヒントもありますよ。

 とりあえず、標準出力に吐き出すより、適当なファイル名をつけてそこに吐き出し
てそれを開けて整形して〜ってやってみてはどうでしょう。最下部にサンプルを付け
てみます。

>秀丸担当さん
 マクロよりtagjumpを行うと、改行コードもしくは[EOF]のみの行だとなぜか
「ファイル名がみつかりません」→「マクロを中断しますか?」とメッセージ
ボックスが出ます。これは不具合ではないでしょうか?通常どおり、resultの
値を変えるだけであって欲しいのですが。

//サンプルここから
//エラーチェックをファイル名.errlogに吐く
run "perl -cw \"" + basename + "\" > " +  basename +".errlog";
openfile basename + ".errlog";

//タグジャンプできる形にエラーログを整形
replaceallfast ".+ \\fat \\f.+\\f line \\f[0-9]+\\f.+\\f","\\2(\\4):\\0\\1\\
2\\3\\4\\5\\6",regular;

////とりあえず、ファイル先頭に動く
gofiletop;
//無限ループスタート
while(1){
down;
// カーソル下移動に失敗したら(つまりこれ以上チェックする行が無ければ)終了
if (result == false)endmacro;
tagjump;
// タグジャンプに成功したときだけ、マークして戻ってくる
if (result == true){
if (marked == 0){ //マークされてないときだけマーク
setmark;
}
backtagjump;
}
}

[ ]
RE:03250 Macro for Perl version 0.90No.03251
ひろ さん 02/07/25 12:51
 
 KaToH-J さん今日は、ひろです。
> 「ファイル名がみつかりません」→「マクロを中断しますか?」とメッセージ
> ボックスが出ます。これは不具合ではないでしょうか?通常どおり、resultの
> 値を変えるだけであって欲しいのですが。
 取り敢えず、http://www.maruo.co.jp/hidesoft/4/m020724.html#3238
記述したように、
>   if( code == eof )break;
とすれば済むと思います。

[ ]
RE:03251 Macro for Perl version 0.90No.03252
KaToH-J さん 02/07/25 13:15
 
 Masayuki KaToHです。
> KaToH-J さん今日は、ひろです。
 いつもお世話になってます。
>>   if( code == eof )break;
>とすれば済むと思います。
 なるほど。改行の場合も適当に加えるとして、とりあえず、改行のみ行
の場合でもこの現象が起こっちゃいますので、わざわざ処理行を書くのが
めんど・・・がってちゃいけないでしょうが、とりあえず不具合ではないか
どうかコメントを頂きたいです。

前のmarked定数も含めて、場所をかえたほうがいいかな。

[ ]
RE:03250 Macro for Perl version 0.90No.03253
PRDX さん 02/07/25 13:17
 
> Masayuki KaToHです。
>>run "perl -cw \"" + $basename + ".tmp.hpl\" > con";
>>runsync2 "perl -cw \"" + $basename + ".tmp.hpl\" > con"; //
> runsync2は、リダイレクション機能が使えません。helpを参照してください。
>リダイレクションについては、秀丸ウィンドウから「その他」→「プログラム実
>行」で出てくるダイアログのヘルプを押してみるとわかると思います。ここを読め
>ばファイルを消すマクロのヒントもありますよ。
ファイルの削除だと、コマンドプロンプトでdelでできるのは知っているのですが、
外部から呼び出すときはどうすればいいのでしょうね。
とりあえず、バッチファイルを作る形式にしました。
もしかして、run "del *"で消せたのかなぁ・・・・。

> とりあえず、標準出力に吐き出すより、適当なファイル名をつけてそこに吐き出し
>てそれを開けて整形して〜ってやってみてはどうでしょう。最下部にサンプルを付
>けてみます。
なるほど!この場合は、そうするべきなのですね。深い。

// ver.0.91
//====================================================================
// 変数の準備
$basename = basename;
$filename = filename;

//====================================================================
MENU:// メニュー画面の表示
menu
"【秀】プログラム実行",
" Perl文法チェック";

// 選択項目に応じた処理
if(result ==0 ){endmacro;} // ESC なら終了
else if(result ==1 ){call SubDoOnHide;}
else if(result ==2 ){call SubSyntaxCheck;}

SubDoOnHide://秀丸でプログラムを実行
saveas $basename +".tmp.hpl";
changename $basename;
run "perl \"" + $basename + ".tmp.hpl\" > con";
openfile "/h del.bat";
insert "del *.hpl\n";
insert "del del.bat\n";
saveas"del.bat";
run "del.bat";
exit;
endmacro;

SubSyntaxCheck://プログラムの文法チェック
saveas $basename +".tmp.hpl";
changename $basename;

// 文法チェックを実行
run "perl -cw \"" + $basename + ".tmp.hpl\" > " +  $basename + ".syntax.hpl\"";
openfile $filename + ".syntax.hpl";

// ファイルの頭に移動
gofiletop;

// エラー行を収集(未完成)
#i = 0;
while(1){
searchdown "line ([0-9]+)";
if(!result){break;}
#ERROR[ #i++ ] = $1;
}

// エラー行をマーク(未確認)
setactivehidemaru findhidemaru($basename);
#j = 0;
while(#i < #j){
moveto 1,#ERROR[#j++];
if(!marked){setmark;}
}
openfile "/h del.bat";
insert "del *.hpl\n";
insert "del del.bat\n";
saveas"del.bat";
run "del.bat";
exit;
endmacro;

[ ]
RE:03253 Macro for Perl version 0.90No.03254
KaToH-J さん 02/07/25 13:41
 
 Masayuki KaToHです。

>ファイルの削除だと、コマンドプロンプトでdelでできるのは知っているのですが、
>外部から呼び出すときはどうすればいいのでしょうね。
>とりあえず、バッチファイルを作る形式にしました。
>もしかして、run "del *"で消せたのかなぁ・・・・。
helpの「リダイレクトの応用」ページの最下部を参照してみてください。

とりあえず、自分もactive-perl v5.6.1をダウンロード&インストールして、
適当なマクロファイルを開いた後に、そのウィンドウで、先述の僕のマクロ
を動かしてみましたが、それなりに動いていたように思えます。

[ ]
RE:03250 Macro for Perl version 0.90No.03255
ひろ さん 02/07/25 18:17
 
 KaToH-J さん今日は、ひろです。
> //エラーチェックをファイル名.errlogに吐く
> run "perl -cw \"" + basename + "\" > " +  basename +".errlog";
> openfile basename + ".errlog";
>
> //タグジャンプできる形にエラーログを整形
> replaceallfast ".+ \\fat \\f.+\\f line \\f[0-9]+\\f.+\\f","\\2(\\4):\\0\\1\\
> 2\\3\\4\\5\\6",regular;
 一々ファイルに書き出す必要は有りません。
http://www.maruo.co.jp/hidesoft/4/m020724.html#3238
に書きましたが、ここまでの処理は、
$name = basename;
openfile "/h";
#main = hidemaruhandle( 0 );
selectall;//これを書くと標準出力終了まで、置換処理を待ってくれる
run "perl -cw \"" + $name + "\" > con";
replaceallfast ".+ \\fat \\f.+\\f line \\f[0-9]+\\f.+\\f",
  "\\2(\\4):\\0\\1\\2\\3\\4\\5\\6",regular;
clearupdated;
showwindow 1;
gofiletop;
で済みます。またウィンドウ隠しているので、出力に時間がそれ程かかりま
せん。またこれならファイルに出力していないので、当然ファイル削除に悩
む必要も有りません。

[ ]