要望 + バグ報告No.27733
PoL さん 10/03/03 03:57
 
Ver 7.11

要望1
 Ctrlを押すなどして範囲を選択し、文字を打った場合、
 全ての最前列に対して文字が入力されます。
 これを最後尾に対しても行えるようにしてくれると嬉しいです。

要望2
 Ctrlを押すなどして範囲を選択し、文字列の検索と置換を行った場合、
 範囲内での検索が適用されません。
 これを適用して頂けると大変助かります。

バグ報告
 秀丸を可能な限りEUCがデフォルトとなるよう設定します。
 開いているタブもEUCとなるようにします。
 なんでもよいのですが、タブから日本語文字を出力させます。
  タブ内容 → 例(perl): print "日本語の出力\n";
  秀丸のコマンドを打つ → perl -w <con >con
 結果、新規にタブが開き、正常にEUC日本語が出力される。

  print "日本語の出力\n";
 に対しマクロで、
  run "perl -w \"%f\" >con";
 を実行させる。
 結果、文字化けしたEUCが表示される。正しいデータには戻せません。
 (秀丸が入力したデータが暗黙に書き換えられている?)

 おそらくですが、秀丸自体の入出力の取り扱いに関して、何か致命的な誤作動があ
ると思われます。



[ ]
RE:27733 要望 + バグ報告No.27738
秀丸担当 さん 10/03/03 10:33
 

>要望1
> Ctrlを押すなどして範囲を選択し、文字を打った場合、
> 全ての最前列に対して文字が入力されます。
> これを最後尾に対しても行えるようにしてくれると嬉しいです。

現状では言われている通り最前列にしか入らないようになっていました。

もし行末に文字を入れるということだとしたら、正規表現で置換するといいかも
しれません。
正規表現をONにして、検索文字列「$」にして置換文字列に適当なものを入れると
できると思います。

行末ではなくてBOX選択の右側に挿入されたいということでしたら、BOX選択の左
になるように範囲選択をしなおしていただく必要があると思います。
以下のようなマクロを作っておくとBOX選択時に実行することで右側だった位置が
左側となるように補正できて便利かもしれないです。
if(rectselecting){
    #x=selendx;
    #y1=seltopy;
    #y2=selendy;
    escape;
    moveto #x,#y1;
    beginrect;
    moveto #x+1,#y2;
}


秀丸エディタの機能としてやるとしたら、具体的にどういう操作をしたらそうな
るのかを考えるとちょっと難しそうですが、そういうことができたらいいという
ことでネタとして参考とさせていただきます。


>要望2
> Ctrlを押すなどして範囲を選択し、文字列の検索と置換を行った場合、
> 範囲内での検索が適用されません。
> これを適用して頂けると大変助かります。

これも現状ではできませんでした。
現状でやるとしたら、いったんBOX選択をコピーしてから新規テキストに貼り付け
てから操作などをしていただく必要があると思います。
そういうことができたらいいということで参考にさせていただきます。

>バグ報告
> 秀丸を可能な限りEUCがデフォルトとなるよう設定します。
> 開いているタブもEUCとなるようにします。

こちらは、確かにそのような挙動になっていました。
<con >conとしたものはShift-JISに変換されるため、そのようになってしまいま
した。
%f >con の場合はファイルからの読込みは生のデータであるのに対して >con は
Shift-JISと解釈されるので文字化けとなってしまいました。

他の方からも最近ご意見をいただいたのですが、開いているファイルのエンコー
ドにならないのはおかしいということで、将来バージョンで検討しなくてはなら
ないと考えています。
sort <con >con や、cmd /c dir > con はShift-JISでないと文字化けてしまうた
め、通常はShift-JISという仕様は変えれないのですが、エンコード指定の選択肢
を増やすことは将来的にできると思います。
現在開発中のV8.00では、[その他]→[プログラム実行]またはrunex文で、エン
コードの指定はShift-JISかUnicodeかを指定できるようになりましたが、EUCなど
の他のエンコードには対応していないです。
V8.00は近いうちに正式版にすることからすぐにはできないかもしれません。
現状で回避するには、%f >output.txt というような感じで書いてファイルに直接
出力して、そのファイルを開くとできると思います。

[ ]
RE:27738 要望 + バグ報告No.27742
PoL さん 10/03/03 11:58
 
>具体的にどういう操作をしたらそうなるのかを考えるとちょっと難しそう

初め、BOX選択後に文字を入力したら最前列全てに文字が入力されると言うことを知
りませんでした。
そのため、気付くまではかなり手間のかかる編集をしてました。

私としては、BOX選択後は全ての行の最前列に対して、ピコピコする位置カーソルを
表示させれば分かりやすくて良いと思いました。
→と←を押すことにピコピコする位置カーソルが最前列と最後列を移動させると言う
のはどうでしょう?


>いったんBOX選択をコピーしてから新規テキストに貼り付けてから操作などをして
なるほど、わかりました。ありがとうございます。
ただ、ちょっとめんどうですね。


>ファイルに直接出力して、そのファイルを開くとできると思います。
なるほどありがとうございます。これもこれでめんどうですね。

ところで、ついでに教えて頂きたいのですが、

[1]:↓C言語風
編集中のタブにはデフォルトで保存するファイルが存在する ?
  同じ文字コードでファイルの上書き :
  同じ文字コードで、他のファイル名と重複なく新規ファイルの保存;

[2]: そのファイルに対して %f を使いコマンドを実行。

[3]: [2]で得られた実行の結果を、文字コード関係なく、他と重複がないようにファ
イルに新規保存。

[4]: [3]で生成されたファイルを新規タブに読み込み。(文字コードはこちらでその
つど指定)。

[5]: [1]の段階で新規にファイルが生成されていた場合、それを削除。

と言う一連のマクロを、すみませんが、もしよろしければでいいので教えて頂けない
でしょうか?
(これなら問題出ませんよね?)

[ ]
RE:27742 要望 + バグ報告No.27744
秀丸担当 さん 10/03/03 13:37
 

>私としては、BOX選択後は全ての行の最前列に対して、ピコピコする位置カーソルを
>表示させれば分かりやすくて良いと思いました。
>→と←を押すことにピコピコする位置カーソルが最前列と最後列を移動させると言う
>のはどうでしょう?

それは面白い動きですね。
従来の操作では←→キーで範囲選択解除になっているのと、マクロ的には実際の
カーソル位置(x, y)の保持があるので簡単ではないかもしれませんが、参考にさ
せていただきます。

>ところで、ついでに教えて頂きたいのですが、

手順通りにしてマクロにしてみました。
print "日本語の出力\n";でしかテストしていなくて、ちょっとうまくいくかどう
かわからないですが、もしうまくいかない場合また連絡ください。

-----------------

//[1]:↓C言語風
//編集中のタブにはデフォルトで保存するファイルが存在する ?
//  同じ文字コードでファイルの上書き :
//  同じ文字コードで、他のファイル名と重複なく新規ファイルの保存;
if( leftstr(filetype,1) == "." ) {
 $tempinput = "";
 save;
} else {
 call GetTempFile "tempinput";
 $tempinput = $$return;
 if($tempinput==""){
  message "テンポラリファイルが作成できません";
  endmacro;
 }
 saveas $tempinput;
}

//[2]: そのファイルに対して %f を使いコマンドを実行。
//[3]: [2]で得られた実行の結果を、文字コード関係なく、他と重複が
//ないようにファイルに新規保存。
call GetTempFile "tempoutput";
$tempoutput = $$return;
if($tempoutput==""){
 message "テンポラリファイルが作成できません";
 endmacro;
}
run "perl -w \"%f\" >" + $tempoutput;


//[4]: [3]で生成されたファイルを新規タブに読み込み。
//(文字コードはこちらでそのつど指定)。
openfile $tempoutput;

//[5]: [1]の段階で新規にファイルが生成されていた場合、それを削除。
if( $tempinput!=""){
 beginsel;run "cmd /c del " + $tempinput + " >con";clearupdated;
 //V8.00以降では
 // deletefile $tempinput;
 //としたほうがいい
}
endmacro;

//テンポラリファイル作成サブルーチン
GetTempFile:
#n=0;
while(#n<1000){
 if( !existfile( $$1+str(#n) ) ) return $$1+str(#n);
 #n = #n + 1;
}
return "";

--------------------

ファイルヒストリがテンポラリファイルだらけになってしまうので、V8.00以降で
あれば、ヒストリ残したくない場合は先頭に
disablehistory 0xff;
を加えておくといいかもしれません。

あと、ファイル削除にコマンドプロンプトを使っていて面倒なことをしているの
で、V8.00以降であればdeletefile文にしたほうがいいかもしれないです。

手順には出力ファイルの削除は無かったので削除してませんが、マクロ修正して
入力ファイルと同様に削除もできると思います。

[ ]
RE:27744 要望 + バグ報告No.27750
PoL さん 10/03/03 22:13
 
ありがとうございます。
秀丸のマクロはよく分からないのですが、

> message "テンポラリファイルが作成できません";

この行が二つほどあって、エラーを出していました。
(二箇所ともコメントアウトすると動きました)。



>手順には出力ファイルの削除は無かったので削除してませんが、
>マクロ修正して入力ファイルと同様に削除もできると思います。
書き忘れていました。

//[6]: [3]で生成されたものを削除
beginsel;run "cmd /c del " + $tempoutput + " >con";clearupdated;

これでいいでしょうか?
ただ、ECUが新タブに出力されても勝手にShift-JISと思われているようで、
秀丸自信もなぜか消えた文字コードの読み直しをしてくれない(?)のでうまくいき
ませんでした。
ファイルを読み直さないでメモリ内のコード解釈を変えたい場合はどうすればいいで
しょう?


[ ]
RE:27750 要望 + バグ報告No.27751
PoL さん 10/03/03 22:18
 
すみません、さらに問題ありました。

[1]の段階で新規にファイルを保存し、それを消していた場合、
次にもう一度マクロを実行した時、
デフォルトで保存するファイルが存在してしまい、消えてくれなくなってしまいまし
た。

[ ]
RE:27751 要望 + バグ報告No.27752
秀丸担当 さん 10/03/04 10:17
 

うまくいかない部分があったようで失礼しました。
とりあえず、ヒストリやタブ名の表示など、おそらくいいようになるだろうと思
われる部分も入れてみて修正してみました。
手順には無いことも入れてしまって余計なことでしたらすみません。

---------------------------
$cmdline = "perl -w";

//V8.00 disablehistory 0xff;
disabledraw;

#encode=encode;
selectall;
copy;
openfile "/n"; //newfile;
paste;
call GetTempFile "tempinput";
$tempinput = $$return;
if($tempinput=="")endmacro;
setencode #encode,1;
saveas $tempinput;

call GetTempFile "tempoutput";
$tempoutput = $$return;
if($tempoutput=="")endmacro;
run $cmdline + " \"%f\" >\"" + $tempoutput + "\"";
//または
//run $cmdline + " <\"" + $tempinput + "\" >\"" + $tempoutput + "\"";

#h=hidemaruhandle(0);
openfile "/n /f" + str(#encode) + " \"" + $tempoutput + "\"";
closehidemaru #h;
changename "";
clearupdated;

if($tempinput!=""){
 run "cmd /c del \"" + $tempinput + "\" >nul";
 //V8.00 deletefile $tempinput;
}
if($tempoutput!=""){
 run "cmd /c del \"" + $tempoutput + "\" >nul";
 //V8.00 deletefile $tempoutput;
}
endmacro;

//テンポラリファイル作成サブルーチン
GetTempFile:
$$tempdir = getenv("tmp");
if( leftstr( $$tempdir, 1 ) != "\\" ) {
 $$tempdir = $$tempdir + "\\";
}
##n=0;
while(##n<1000){
 $$tempfile = $$tempdir + $$1+str(##n);
 if( !existfile( $$tempfile ) ) return $$tempfile;
 ##n = ##n + 1;
}
message "テンポラリファイルが作成できません\n"
  + $$tempfile;
return "";
---------------------------

>> message "テンポラリファイルが作成できません";
>この行が二つほどあって、エラーを出していました。
>(二箇所ともコメントアウトすると動きました)。

これが出るのはなぜだかわからないです。
一応マクロでは最大1000個までになっていて1000個を超えるとできないですが、
そうでないとするとわからないです。
コメントアウトして通してしまうと危険なので、なぜできないのかを検証された
ほうが良いかと思われます。
前のマクロでは現在のフォルダに作っていましたが、上のマクロでは、ファイル
作成により安全なテンポラリファイルを環境変数tmpの場所に修正してみました。
(XPの場合 C:\Documents and Settings\(ユーザー名)\Local Settings\Temp
 Vistaの場合C:\Users\(ユーザー名)\AppData\Local\Temp)
さらに、作成できない場合はそのパス名を表示するようにしました。

もしまだ出てしまう場合、お手数ですが、途中で message (変数名); や
endmacro; を入れて変数の内容を表示させたりマクロを中断させたりして、調べ
ていただく必要があるかもしれません。

>//[6]: [3]で生成されたものを削除
>beginsel;run "cmd /c del " + $tempoutput + " >con";clearupdated;
>
>これでいいでしょうか?

マクロを参考にされた場合はそれでよかったです。
ただ自分の書いたマクロそのものが余計な手間でした。すみません。
run "cmd /c del \"" + $tempoutput + "\" >nul";
と書いたほうが簡潔でした。

>ただ、ECUが新タブに出力されても勝手にShift-JISと思われているようで、
>秀丸自信もなぜか消えた文字コードの読み直しをしてくれない(?)ので
>うまくいきませんでした。
>ファイルを読み直さないでメモリ内のコード解釈を変えたい場合はどうす
>ればいいでしょう?

前のマクロではただloadfileするだけで自動認識に頼っていました。
上のマクロでは元のエンコードで読み込むようにしました。

>[1]の段階で新規にファイルを保存し、それを消していた場合、
>次にもう一度マクロを実行した時、
>デフォルトで保存するファイルが存在してしまい、消えてくれなくなってしまいまし
>た。

ファイル名(タブ名)を保存したファイルにしているためだと思います。
実行後はファイル名を残さないようにしました。

あと、/nオプションでV7.11でもヒストリに残らないようにしました。
あと、手順[1]の既存ファイルを保存する処理を省いてしまいました。

ちなみにこのマクロは便利だと思うので、Shift-JISに変換されて困るという人の
ためにもヘルプにマクロを書いておくようにさせていただこうと思います。

[ ]
RE:27752 要望 + バグ報告No.27789
PoL さん 10/03/09 22:47
 
遅くなりましたがありがとうございます。
最初のエラーはこちらのミスでEUCとなっておりました。

現在は、ファイルの読み書き、プラグイン、出力結果の書き込み、その他、ファイル
に関係あることをするとき、
相対パスだとまとめておかしくなります。


[ ]
RE:27789 要望 + バグ報告No.27790
秀丸担当 さん 10/03/10 09:27
 

>遅くなりましたがありがとうございます。
>最初のエラーはこちらのミスでEUCとなっておりました。

そうでしたか。
マクロファイルはShift-JISで作成していただく必要がありました。
EUCでマクロを保存すると、文字列の内容によって「ブロックの対応が合いませ
ん」というエラーになったりしてしまうようです。

>現在は、ファイルの読み書き、プラグイン、出力結果の書き込み、その他、ファイル
>に関係あることをするとき、
>相対パスだとまとめておかしくなります。

後のマクロで、テンポラリファイルを保存する場所を環境変数TMPの場所
(XPの場合 C:\Documents and Settings\(ユーザー名)\Local Settings\Temp
 Vistaの場合C:\Users\(ユーザー名)\AppData\Local\Temp)
にしてしまったので、そのディレクトリがカレントディレクトリになってしまっ
ていました。

テンポラリファイルの作成はやっぱり問題無かったようなので、テンポラリファ
イル作成サブルーチンを元に戻して、最初のもの(以下)にするといいかもしれ
ないです。

//テンポラリファイル作成サブルーチン
GetTempFile:
#n=0;
while(#n<1000){
 if( !existfile( $$1+str(#n) ) ) return $$1+str(#n);
 #n = #n + 1;
}
return "";

[ ]