[要望] .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のような新
しい文か何かがあったほうがいいです。

ちなみにコンテキストメニューのようなファイラー関連の機能を使うときは、個人的
には秀丸エディタの「エクスプローラ」コマンドをよく使います。
キー割り当てや、メニューバー編集ではツールメニューにあります。
エクスプローラでファイルの選択まで行くので便利なのですが、今試してみたらWind
ows11のせいかもしれないですがファイル選択が画面外でした。
秀丸ファイラー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
 
自動起動マクロは、現在のバージョンであれば明示的にファイル名を指定してexecma
croします。
自動起動される側のマクロは、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\202307
14-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:\a
pparchives\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 が使用されていても re
sult か又は
getresultex() で捕捉可能にするべきではないでしょうか。

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




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

[ ]