秀丸マクロのファイル機能強化についてNo.09090
ohtorii さん 19/10/10 21:18
 
お疲れ様です。

最近、秀丸マクロを作成していて、あったらいいなぁ~という機能が2点あります、
ご検討いただけますとうれしいです\(^O^)/


①ファイルとフォルダを列挙する関数。(※1)
②DLL側で秀丸エディタのファイル読み込み機能を使いたい。(※2)


以前に投稿させていただいた以下の件とあわせて、
https://www.maruo.co.jp/hidesoft/4/x09033_.html#9037
「秀丸マクロのファイル機能強化」という名目で用意していただけますと今後のマク
ロ作成がはかどります。
なお、①②ともに自前実装したので私は困っていません。



(※1)
今まではDengaku-DLLを利用してきましたが、shift-jis版なので絵文字(Unicode)を
含むファイル名が化けます。
Dengaku-DLLのUnicode版を自力でビルドし公開されている方がいますが、
マクロの利用者(初心者を想定)に「x68/x64 ・ sjis/unicode」の4通りのDLLをWE
B上から見付けて、
インストールしてもらうのは敷居が高いです。
秀丸マクロ側で実装していただけますと、依存DLLが減るためマクロ導入をより簡易
化できるメリットがあります。



(※2)
DLL側でファイルをWCHARへ読み込む時に秀丸エディタの高性能な機能を使いたいです。
文字コード判別のライブラリはいろいろありますが、長年利用している秀丸エディタ
の方が圧倒的に信用信頼できます。


-例1- ファイル全体を読み込む関数
*(FARPROC*)&pfnHidemaru_openfile = GetProcAddress( hinstExe, "Hidemaru_Openf
ile" );
//秀丸エディタが文字コードを判別してWCHARへ格納してくれる。
WCHAR*text=pfnHidemaru_openfile("c:\\project\\readme_ch.txt");
//使い終わったらメモリを解放する
GlobalFree(text);

-例2- ファイルの一部を読み込む関数
*(FARPROC*)&pfnHidemaru_openfilepart = GetProcAddress( hinstExe, "Hidemaru_O
penfilePart" );
WCHAR*text=pfnHidemaru_openfile("c:\\project\\readme_ch.txt", 読込み位置, サ
イズ);
GlobalFree(text);


よろしくお願いいたします。

[ ]
RE:09090 秀丸マクロのファイル機能強化にNo.09091
でるもんたいいじま さん 19/10/10 23:32
 
こんにちは。でるもんた・いいじまです。

> 最近、秀丸マクロを作成していて、あったらいいなぁ~という機能が2点あります、
> ご検討いただけますとうれしいです\(^O^)/
>
> ①ファイルとフォルダを列挙する関数。(※1)
> ②DLL側で秀丸エディタのファイル読み込み機能を使いたい。(※2)

前者はcreateobject関数で "Scripting.FileSystemObject" オブジェクトを
呼び出せば今でもできるはずです。

個人的な推測ですが、現状でこの機能が秀丸の組込関数になっていないのは
  ・技術的には既に可能。仮に自前で作っても「車輪の再発明」になる。
  ・エディタ上でそこまでやろうという人は、一応存在はするがごく少数。
という2点が理由だと思います。

後者は、文字コードの自動判別をどうするのかの処理が必要ですから、
まずは非表示状態の秀丸プロセスをひとつ生成して、それを読み込むとのが
現実的だと思います。読み込んだ後で自作のDLLからは、秀丸がエクスポート
している関数を呼ぶのがいいでしょう。マクロヘルプ→DLL呼び出し機能→
DLL側から秀丸エディタの関数呼び出し、に一通りの説明があります。

☆ ☆ ☆

以下余談。

> -例2- ファイルの一部を読み込む関数
> *(FARPROC*)&pfnHidemaru_openfilepart = GetProcAddress( hinstExe, "Hidemaru
>_OpenfilePart" );
> WCHAR*text=pfnHidemaru_openfile("c:\\project\\readme_ch.txt", 読込み位置,
>サイズ);
> GlobalFree(text);

この関数の場合、「読み込み位置」「サイズ」の数え方が問題になりますかね。
バイト数なのか、UTF-16でのワード数なのか、それとも文字数なのか。
結合文字や合字の類は全体で1つとするのか、コードポイントごとに1つとするのか。
また、文字コードの自動判別をさせる場合には、どのコードを前提に位置やサイズを
指定するのか。

あと、関数のパラメータの型は今の時代、(const WCHAR[], int64_t, uint64_t) が
順当ですね。特に第一パラメータを const char[] にしちゃうと、ファイル名の中に
CP932の範囲外の文字が入っていた場合に no such file or directory になります。

#さらに余談になりますが、秀丸本体はいまだにWindows98でも動きます。
#これはつまり、コンパイラのビルド設定ではANSIアプリだということです。
#なので本来なら、WinMain()のlpszCmdLine()ではUnicodeの文字は受け取れない
#はずなのです。にもかかわらず、秀丸はUnicodeのファイル名を平然と扱います。
#きちんと GetCommandLineW() を使って丁寧に処理しているのでしょうね。

[ ]
RE:09091 秀丸マクロのファイル機能強化にNo.09092
ohtorii さん 19/10/15 11:29
 
お疲れさまです。

> ①ファイルとフォルダを列挙する関数。(※1)

createobject関数を使用し絵文字を含むファイル名を取得できました。
秀丸マクロはVBSを呼び出せるんでしたね完全に失念しておりました。

「目次-関数」「目次-ファイル系文」あたりを探し回ったり検索タブから「ファイ
ル検索・再帰」などをキーワードとして検索していました。


この件は、「秀丸マクロヘルプ→COMの呼び出し」への導線を太く張り巡らせること
で解消できると思いました。
具体的には、
・「目次-関数」から「ファイル操作はVBSを使えます」といった文とリンクを張る。
・「目次-秀丸マクロの概要」へ説明の追記
・「ファイル検索・再帰、、、」などのキーワードで「目次- COMの呼び出し」のサ
ンプルを挙げる。

次のステップとして「目次- COMの呼び出し 」の拡充を少しずつ行う、
頻出するVBSプログラム(ファイル検索とか)はあらかじめ秀丸マクロへ間違いなく
翻訳してコピペで使える状態にする。
サンプル拡充は同時に翻訳の良いお手本になります。

上記を実施していただけると今回のような問い合わせは今後減ると思います。



> ②DLL側で秀丸エディタのファイル読み込み機能を使いたい。(※2)

「まずは非表示状態の秀丸プロセスをひとつ生成して・・・」ですが、
私は以下の処理順になると理解しました。

・DLL側
 ファイル読み込みが必要になったのでいったん秀丸エディタ側へ戻る

・秀丸エディタ側
 DLL側で指定されたファイルを非表示で読み込み、DLL側に戻る

・DLL側
 Hidemaru_GetTotalTextUnicode関数でテキストをメモリへ読み込む


文字コードを判別してファイルを読み込むには、一休さん並の頓智が必要なので、
できれば、秀丸エディタ側で機能を用意していただけると助かります。
(気長にお待ちしております)



> 以下余談。

作者様から具体的なお話があったときに改めてよろしくおねがいしますm(__)m


よろしくお願いいたします。

[ ]
RE:09092 秀丸マクロのファイル機能強化にNo.09093
秀丸担当 さん 19/10/15 14:04
 

FileSystemObjectは使うことがよくあるので、確かにヘルプに説明があるとより良い
と思います。
ヘルプで見つかりやすいようにしたり、サンプル追記などしておきます。

DLLからの本体のファイル読み込み相当の関数は、あったらいいと思いますが、完全
に同じにするとしたら、いったん本体に戻して読み込むようなことと同じようなこと
になってしまうと思います。
grepするときの自動認識も、標準の状態では本体と違うDLLで自動認識するようにな
っているのですが、自動認識は実は少し違っています。
完全に同じにするには、[動作環境]→[検索]→[grepの動作]→[文字数制限の設定]で
「制限なし」にするとできますが、これは、本体でopenfileするのと変わらないよう
なことになってかなり遅いです。

あと、ファイルの一部を読み込む場合は自動認識には向いていなくて、明示指定があ
ったほうがいいです。
自動認識が必要な場合は先頭から全部読み込まないと判断が付かないことがありえま
す。
あるいは、全く新しい機能として、エンコーディングの判別結果だけを返す関数があ
ったらいいかもしれないです。
サイズ指定は既にopenfilepartがバイト単位なのと、元のファイルがShift-JISとか
でも読み込むということだと思うので、バイト単位でいい気がします。
やるかどうかはわからないですが、そういうものがあったらいいということで、ご意
見参考にさせていただきます。

[ ]
RE:09093 秀丸マクロのファイル機能強化にNo.09094
ohtorii さん 19/10/15 19:12
 
お疲れ様です。
お返事ありがとうございます\(^O^)/


VBSを秀丸マクロへ翻訳したファイル(.mac)をアップしました、
ヘルプを拡充される際にご利用ください。

https://github.com/ohtorii/test/tree/master/vbs_example

(内容)
・ファイルの列挙
・プロセスの列挙

上記コードはご自由にお使いください。




もし、ファイル読み込みの関数を実装していただけるなら、
ステップを刻みながら提供するのもありだと思います、

(ステップ1)エンコーディングの結果を返す関数
(ステップ2)エンコーディングを自動判別して読み込む


最後に、
今回は秀丸マクロで記述していたアルゴリズムをDLL側へ逃がすことで処理速度の高
速化を行いました。
その過程でいろいろ困ったことがあり本件の質問につながりました。

「DLL側から秀丸エディタの関数呼び出し」は秀丸マクロより出来ることが少なく、
どう組み合わせればやりたいことを実現できるのか思案と実験する時間が長かったで
す。
(サンプルを拡充することで解消できるかもしれません)

推測ですが、作者様とマクロ作成者との視線が合っていないのかもしれません。(※)
もしそうなら、今後、秀丸エディタ本体に新機能を追加するときは秀丸マクロで実装
して、
秀丸エディタ本体に同梱するのも良いかもしれません。

その過程で秀丸マクロが強化されると、
作者様とマクロ作成者とユーザーの三者が幸せになると思いました。



(※)マクロ作成者が暴走している気もしますが・・・


長文失礼しました、
よろしくお願いいたします。

[ ]
RE:09094 秀丸マクロのファイル機能強化にNo.09097
秀丸担当 さん 19/10/21 09:28
 

>もし、ファイル読み込みの関数を実装していただけるなら、
>ステップを刻みながら提供するのもありだと思います、
>
>(ステップ1)エンコーディングの結果を返す関数
>(ステップ2)エンコーディングを自動判別して読み込む

こちらの件ですが、まず第一段階としてのエンコーディングの解析結果を返すような
関数を作ろうと思います。
内部的な話ですが、現状でgrepで[動作環境]→[エンコード1]→[優先順位に従う]で
動作させるためには、[動作環境]→[検索]→[grepの動作]→[文字数制限の設定]で
「制限なし」にしないといけないという、設定が難解な状態になっているので、それ
を解消するためにも使えそうです。

[ ]
RE:09097 秀丸マクロのファイル機能強化にNo.09098
ohtorii さん 19/10/23 13:06
 
お疲れさまです。

ありがとうございます!!!
ベータ版がリリースされましたら試させていただきます。

>こちらの件ですが、まず第一段階としてのエンコーディングの解析結果を返すよう
>な関数を作ろうと思います。
>内部的な話ですが、現状でgrepで[動作環境]→[エンコード1]→[優先順位に従う]で
>動作させるためには、[動作環境]→[検索]→[grepの動作]→[文字数制限の設定]で
>「制限なし」にしないといけないという、設定が難解な状態になっているので、そ
>れを解消するためにも使えそうです。


楽しみにしています、
よろしくお願いいたします。

[ ]