[ 新規に投稿する ]

[要望] .hmbookファイルの機能拡張についてNo.40721
fzok4234 さん 23/07/14 11:04 [ コメントを投稿する ]
  おはようございます。Fzok4234 です。


さて、.hmbook ファイルに書式を拡張して
 1. 項目ファイルの文字コード、改行コード、及び BOM の有無。
 2. 項目ファイルを読み取り専用で開くオプション ( /b 、/r 、/bb 、及び /rr ) 。
を明示的に指定できるようにする機能追加を行ってもらいたいのですが、可能でしょうか ?

上記 1. については、項目ファイルの拡張子が同じでも文字コード等が異なる場合等に
「ファイルタイプ別の設定」->「保存・読込」->「エンコードの種類の指定」の設定だけでは
対応しきれず、特にファイルの内容がほとんど ASCII 文字で SHIFT-JIS / BOM 無し UTF-8
/ 欧文 等の判別が困難になるケースでは各項目ファイルごとに明示的に文字コード等を
指定する必要性が存在します。また、2. については主に編集対象のソースコードからなる
プロジェクトの .hmbook ファイルに、参考資料として閲覧専用で開きたい別のソースコードの
項目を追加しておく必要があるためです。

詳しい経緯については
https://www.maruo.co.jp/hidesoft/4/x10179_.html
でのやり取りで述べられている通りですが、現状では上記のことを実現しようとすると、
各項目ファイルのパスに mac: で始まるマクロを挟まないといけません。しかし、これを行うと
 1. 各項目ファイルの右クリックメニューに「コンテキストメニュー(X)」の項目が出て
    こないので、項目ファイル固有のコマンドを呼び出せない。
 2. 各項目ファイルをマクロから openfile 文で開くため、「ファイルを開いた直後」や
    「新規作成直後」の自動起動マクロが実行されない。
という問題が発生してしまいます。

このため、マクロを挟まずに通常のパスの登録を行う必要があるのですが、現状では上記の
機能に対応していないため、.hmbook ファイルの書式自体の機能拡張をお願いした次第であります。
どうかよろしくお願い致します。


[ ]
RE:40721 [要望] .hmbookファイルの機能拡張についてNo.40722
秀丸担当 さん 23/07/14 14:53 [ コメントを投稿する ]
 
> 1. 項目ファイルの文字コード、改行コード、及び BOM の有無。
> 2. 項目ファイルを読み取り専用で開くオプション ( /b 、/r 、/bb 、及び /rr ) 。

このご要望だけに関して試してみたら、狙っていたわけではなかったですが、ファイル名の先頭にオプションを書くとできました。
openfile文の先頭にオプションを書くのと同じことになりました。

/r c:\folder\test.txt

元の話題はプロジェクトファイルからの相対ということですが、既に試されている通り、HmExplorerPane.dllのGetProjectを使う方法があります。
コンテキストメニューはできないですが、オプションに限らずマクロも使うことも考えると、総合的に考えてマクロ実行と共に自動起動マクロもできる方法があったらいいと思います。
/xなどのマクロ実行と共に自動起動マクロしたいという話もありました。

参考までの情報ですが、execmacroで自動起動マクロのON/OFF状態も併せて判断すると以下のような感じになります。
openreg "CURRENTUSER","Software\\Hidemaruo\\Hidemaru\\Env";
if(getregnum("EventMacroFlag")&0x01){//自動起動マクロON
  if((getregnum("EventMacroFlag")&0x04)==0){//ファイルを開いた直後ON
    execmacro macrodir + "\\" + getregstr("EventMacroOpened");//フルパス考慮無し
  }
}
closereg;

EventMacroFlagの値はファイルを開いた直後だけビットが反転していて、ちょっと変則的です。
eventキーワード等も与えられないので、やるとしたら、execeventmacroのような新しい文か何かがあったほうがいいです。

ちなみにコンテキストメニューのようなファイラー関連の機能を使うときは、個人的には秀丸エディタの「エクスプローラ」コマンドをよく使います。
キー割り当てや、メニューバー編集ではツールメニューにあります。
エクスプローラでファイルの選択まで行くので便利なのですが、今試してみたらWindows11のせいかもしれないですがファイル選択が画面外でした。
秀丸ファイラーClassicを既定のファイラーにしておくと見やすく選択されます。
[ ]
RE:40722 [要望] .hmbookファイルの機能拡張についてNo.40724
fzok4234 さん 23/07/14 17:14 [ コメントを投稿する ]
  >> 1. 項目ファイルの文字コード、改行コード、及び BOM の有無。
>> 2. 項目ファイルを読み取り専用で開くオプション ( /b 、/r 、/bb 、及び /rr ) 。
>
> このご要望だけに関して試してみたら、狙っていたわけではなかったですが、ファイル名の
> 先頭にオプションを書くとできました。
> openfile文の先頭にオプションを書くのと同じことになりました。
>
> /r c:\folder\test.txt

当方で実際の運用を想定したケースのプロジェクトのサンプル
https://github.com/Fzok4234/HidemaruBugReport/tree/master/20230714-Project/test
( Project.hmbook に U+0002 制御文字が含まれているため HidemaruBugReport リポジトリを
丸ごと git clone して取得してください。)
でテストを行いましたが、全ての項目が動作しませんでした。

いずれの項目も、指定したオプションスイッチをファイル名の一部として扱ってしまっている
ようで、正しくファイルを参照できませんでした。一番最後の行の VeryLongName の項目に至っては
ファイル名の文字数が 256 文字で MAX_PATH の 259 文字に達していないのにもかかわらず、
項目自体が表示されていません。

見た感じでは、オプションを含めたパスがたまたま解釈に成功したようであり、オプションの
解釈をしっかりと意図して実装したものとは到底思えません。やはり、オプションの解釈を
意図した明示的な再実装が必要なようです。


[ ]
RE:40724 [要望] .hmbookファイルの機能拡張についてNo.40725
秀丸担当 さん 23/07/14 17:46 [ コメントを投稿する ]
  すみません。
確かにプロパティでOKしたときのたまたまで、プロジェクトファイルを読み込みし直すときはパスを再構成してだめでした。
openfile同様に/から始まる場合はオプションとして解釈するようにしてみます。
[ ]
RE:40725 [要望] .hmbookファイルの機能拡張についてNo.40732
fzok4234 さん 23/07/21 04:34 [ コメントを投稿する ]
  > openfile同様に/から始まる場合はオプションとして解釈するようにしてみます。

9.25β4 にて、テストファイル
https://github.com/Fzok4234/HidemaruBugReport/tree/master/20230714-Project/test
で動作確認を行いました。

各項目のダブルクリックで確かに指定したオプションが有効な状態でファイルが開き、自動起動マクロも
実行されます。

しかし、右クリックメニューに「コンテキストメニュー(X)」の項目は出てこない状態でした。絶対パスの
"C:\a a a.txt" 及び "C:\a a a.cmd" は実在しないファイルのため出てこないのは当然なのですが、
確実に存在する相対パスの "Aaaa.txt" 及び "Bbbb.cmd" で出てこない症状がみられます。

また、パスをダブルクォーテーション ( "Project.hmbook" 内では U+0002 制御文字 ) で囲うと、項目の
アイコンが関連付けに基づく正しいアイコンになりません。
https://github.com/Fzok4234/HidemaruBugReport/blob/master/20230714-Project/Res-01.png
のように、ダブルクォーテーションで囲っていない拡張子が .cmd の項目は正しくバッチファイルの
アイコンですが、ダブルクォーテーションで囲った .txt の項目はテキストファイルのアイコンにならずに
デフォルトのアイコンになってしまっています。


[ ]
RE:40732 [要望] .hmbookファイルの機能拡張についてNo.40733
秀丸担当 さん 23/07/21 17:44 [ コメントを投稿する ]
  ご確認ありがとござます。
V9.25β4は、/から始まる場合をフルパスとして再構成しなくなっただけになっています。
その後の記述はファイル名だったり他のオプションだったりいろいろ考えられ、1つのファイルとして解釈はしていないです。
/から始まるのはやってみたらできただけということもありますが、プロジェクトファイルからの相対でもなく、当初の目的もできないので、マクロでやったほうがいいのではないかと思います。

拡張子の判断は実際のファイルの存在を見に行くと時間がかかるので、単純に文字列として最後のものを見ていました。
しいて合わせるとしたら、ファイル名だけの記述以外のすべては、一律に拡張子を見ないことで、本来は見ないほうがいいです。
でもせっかくなので残しておいてもいい気がします。
単純な文字列の判断を残しておくと、以下のようなものが拡張子アイコンで判断できたりしました。
/xtest.mac /a"Param1" /aParam2dummy.txt
mac:openfile "test.txt";//.txt
mac:"test.mac" Param1 Param2dummy.txt

秀丸ファイラーClassicのようにアイコンのプロパティを追加するというのも考えられますが、エクスプローラに倣う.icoのデザインはいまどきじゃないというか、ツールバーでNerdFontを使っているみたいに色付きの文字にできたらいいかもしれないと思っています。
とはいえ文字アイコンだけだとしても、全部置き換えできないので、簡単な記述で文字アイコンにを重ね合わせとかできたらいいです。
(例えばドキュメントアイコン風色付き文字の右下に小さくcsと重ね合わせるとか)

[ ]
RE:40733 [要望] .hmbookファイルの機能拡張についてNo.40735
fzok4234 さん 23/07/27 03:21 [ コメントを投稿する ]
  > V9.25β4は、/から始まる場合をフルパスとして再構成しなくなっただけになっています。
> その後の記述はファイル名だったり他のオプションだったりいろいろ考えられ、1つの
> ファイルとして解釈はしていないです。
> /から始まるのはやってみたらできただけということもありますが、プロジェクトファイルからの
> 相対でもなく、当初の目的もできないので、マクロでやったほうがいいのではないかと思います。

やはり、
https://github.com/Fzok4234/HidemaruMacro/blob/master/OpenProjectItem/src/OpenProjectItem.mac
のようなマクロを挟んだ方がよいとのことですが、この場合の
 1. 「ファイルを開いた直後」、「新規作成直後」及び「アクティブ切り替え後」に対応する
    自動起動マクロを、呼び出された側での event 及び geteventparam() の値が考慮されるように
    手動で起動させること。
 2. 項目の右クリックメニューを、任意のパスに対応するコンテキストメニューを追加するなどの
    カスタマイズを行うこと。
 3. 項目のアイコンを任意の拡張子に対応したものに差し替えること。
を実現させるために、OpenProjectItem.mac に追加する必要のあるマクロの実装方法が思いつかずに
困っている状態です。

具体的な実装のサンプルをご教示いただければ大変助かります。


> 拡張子の判断は実際のファイルの存在を見に行くと時間がかかるので、単純に文字列として最後の
> ものを見ていました。
> しいて合わせるとしたら、ファイル名だけの記述以外のすべては、一律に拡張子を見ないことで、
> 本来は見ないほうがいいです。
> でもせっかくなので残しておいてもいい気がします。
> 単純な文字列の判断を残しておくと、以下のようなものが拡張子アイコンで判断できたりしました。
> /xtest.mac /a"Param1" /aParam2dummy.txt
> mac:openfile "test.txt";//.txt
> mac:"test.mac" Param1 Param2dummy.txt

確かに、
mac:"aaa.mac" bbb.cmd
ではちゃんとバッチファイルのアイコンになりますが、
mac:"aaa.mac" "bbb ccc\ddd eee\fff ggg.cmd"
だと拡張子が認識されずにデフォルトアイコンになってしまいました。

パスがダブルクォーテーションで囲われたために末尾が
.cmd"
のようになっている場合でもちゃんと拡張子を抽出できるように改良した方がよいと思います。


どうかよろしくお願いします。


[ ]
RE:40735 [要望] .hmbookファイルの機能拡張についてNo.40738
秀丸担当 さん 23/07/27 17:36 [ コメントを投稿する ]
  自動起動マクロは、現在のバージョンであれば明示的にファイル名を指定してexecmacroします。
自動起動される側のマクロは、event値かgetargかで切り分けたりするといいです。
設定に合わせるのであれば、前のコメントのようにレジストリからgetregstrなどをして得るしかないです。

V9.25βでは、execeventmacroでやる方法を追加してみています。
設定のON/OFFやマクロファイル名も見て、event値も変わって実行します。

例:
$a=@"c:\folder\test.txt";
#f=findhidemaru($a);
if(#f>=0){
  setactivehidemaru #f;
  execeventmacro 8;//アクティブ切り替え後
} else if(filename!=tolower($a)){
  openfile "/m3 /rr "+$a;
  execeventmacro 1;//ファイルを開いた直後
}

geteventparam相当は、実はexeceventmacroで続けてパラメータ指定でできるようにしてみていますが、あまり意味が無いのと、自由に変えられてもおかしい気がするのでヘルプには書いていないです。
コンテキストメニュー対象の指定方法は無いです。
いまのところ指定できるようにすることは考えていないです。

ファイルマネージャ枠で試していたら、別のまずい問題が見つかってしまいました。
通常、マクロ登録したマクロなどは、マクロ実行中であるとエラーとして実行できないようにしていますが、ブックマークやプロジェクトのmac:で実行する場合、そのチェックが無くてまずいことになっていました。
実行中だとHidemac Memory Errorというエラーになったり、タイミングによってはクラッシュしてしまいました。
次のV9.25β版と、また中間のV9.24を出すと思うので、そこで修正いたします。

拡張子の指定は現状で裏技みたいなところを、さらに裏技の範囲を広げてそれを今後も仕様として維持していくのは無理があると思うので、やらないでおこうと思います。
やるとしたら、前のコメントのようにプロティとして追加できるようにしたほうがいいと思います。
ツールバーも含めて似た書き方にできたらいいですが、いまのところ手を付けていないです。
[ ]
RE:40738 [要望] .hmbookファイルの機能拡張についてNo.40762
fzok4234 さん 23/08/03 17:17 [ コメントを投稿する ]
  > V9.25βでは、execeventmacroでやる方法を追加してみています。
> 設定のON/OFFやマクロファイル名も見て、event値も変わって実行します。

> 例:
> $a=@"c:\folder\test.txt";
> #f=findhidemaru($a);
> if(#f>=0){
>   setactivehidemaru #f;
>   execeventmacro 8;//アクティブ切り替え後
> } else if(filename!=tolower($a)){
>   openfile "/m3 /rr "+$a;
>   execeventmacro 1;//ファイルを開いた直後
> }

9.25β6 にアップデートした上で、execeventmacro 文の動作確認を行いましたが、正しく
動作しませんでした。

まず、自動起動マクロ
https://github.com/Fzok4234/HidemaruBugReport/blob/master/20230714-Project/execeventmacro/Guest.mac
( ローカル上のパスは "I:\apparchives\share\document\text\Hidemaru\Bug\20230714-Project\execeventmacro\Guest.mac" )
を、
https://github.com/Fzok4234/HidemaruBugReport/blob/master/20230714-Project/execeventmacro/AutoRunSample.png
のように「ファイルを開いた直後」として登録してから、これを execeventmacro で
呼び出すためのホストマクロ
https://github.com/Fzok4234/HidemaruBugReport/blob/master/20230714-Project/execeventmacro/Host.mac
を実行いたしました。

すると
---------------------------
エラー
---------------------------
ファイルへのアクセスでエラーが起きました。
エラーコード = 123
ファイル名 = C:\Users\********\AppData\Roaming\Hidemaruo\Hidemaru\Macro\I:\apparchives\share\document\text\Hidemaru\Bug\20230714-Project\execeventmacro\Guest.mac
エラーコード 123 の意味:ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。



エラー箇所の内容(変換した内容):
 #event = #event + 1;

 }

 endmacro "";


---------------------------
OK   
---------------------------
というエラーが発生してしまいました。

一応、この状態で任意のファイルを開くとアウトプット枠に正しく
1
と出力されます。


[ ]
RE:40762 [要望] .hmbookファイルの機能拡張についてNo.40763
秀丸担当 さん 23/08/04 16:18 [ コメントを投稿する ]
  ご確認ありがとうございます。
自動起動マクロの登録をフルパスでしている場合、確かにうまくいきませんでした。
この場合もできるように修正します。
[ ]
RE:40763 [要望] .hmbookファイルの機能拡張についてNo.40796
fzok4234 さん 23/09/10 21:45 [ コメントを投稿する ]
  9.25β11 にて execeventmacro の動作確認を行いましたが、まだ動作がおかしいです。

テスト用の自動起動マクロ
https://github.com/Fzok4234/HidemaruBugReport/blob/master/20230714-Project/execeventmacro/Guest.mac
を、
https://github.com/Fzok4234/HidemaruBugReport/blob/master/20230714-Project/execeventmacro/AutoRun-Guest-0ms.png
のように全てのイベントに登録した上で、execeventmacro で全イベントをたたくマクロ
https://github.com/Fzok4234/HidemaruBugReport/blob/master/20230714-Project/execeventmacro/Host.mac
を実行したところ、出力は以下のようになりました。

Start event 0.
End event 0.
Start event 1.
1
End event 1.
Start event 2.

即ち、ループの途中で #event が 2 のときに
execeventmacro #event   ;
を呼び出した時点で Host.mac が勝手に終了してしまっています。

このテストの次の段階として、「編集後タイマー」、「カーソル移動後タイマー」及び
「アクティブ切り替え後」で設定した遅延タイマーが execeventmacro から呼び出した場合でもちゃんと
動作するかどうかのテストが控えているのですが、その前段階で躓いてしまっています。


[ ]
RE:40796 [要望] .hmbookファイルの機能拡張についてNo.40799
秀丸担当 さん 23/09/11 15:31 [ コメントを投稿する ]
  ご指摘ありがとうございます。
execeventmacroは、確かに連続実行するとうまくいきませんでした。
execeventmacro内でさらにexeceventmacroすると無限になってしまうような場合を避けるため一度だけにしていたのですが、ネストではなく平行の場合はできるようにしてみます。
[ ]
RE:40799 [要望] .hmbookファイルの機能拡張についてNo.40800
fzok4234 さん 23/09/11 18:39 [ コメントを投稿する ]
  > execeventmacro内でさらにexeceventmacroすると無限になってしまうような場合を避けるため
> 一度だけにしていたのですが、ネストではなく平行の場合はできるようにしてみます。


execeventmacro を連続で実行可能にする改良の検討ありがとうございます。


ただ、execeventmacro に限定して再帰呼び出しをできなくする処置はちょっとおかしい感じが
します。というのは、類似の execmacro や call、refcall は再帰呼び出し OK となっているからで
あり、なぜ execeventmacro だけが再帰 NG なのか理解しかねるところがあります。

基本的に、無限再帰呼び出しによるコールスタックの枯渇によるエラーを回避する事はあくまで
「マクロ記述者」の責務であり、execeventmacro 等の API 提供側が対策する義務は無いように
思えます。


もし、どうしても execeventmacro の再帰の禁止が必要であるならば、再帰実行の際に何のエラーも
出さずに正常終了扱いでマクロを中止してしまうのは大変まずい対応のように感じます。せめて、
ちゃんとエラーメッセージを出して、もし disableerrormsg が使用されていても result か又は
getresultex() で捕捉可能にするべきではないでしょうか。

合わせて、現在のマクロ実行が「execeventmacro で呼び出されたものであるため再帰的に
execeventmacro が使用不可であること」を知る手段も必要です。例えば、現在実行中のマクロから
execeventmacro で子マクロを呼び出し可能かどうかの真偽値を返す「canexeceventmacro キーワード」
なるものを新規に実装することとかです。



[ ]
RE:40800 [要望] .hmbookファイルの機能拡張についてNo.40803
秀丸担当 さん 23/09/12 09:28 [ コメントを投稿する ]
  何度も呼ばないようにしているのは内部的な都合もいろいろあるのですが、エラーを表示したりしようと思います。
[ ]

[ 新規に投稿する ]