V9.18β4No.10896
秀丸担当 さん 22/08/04 15:10
 
V9.18β4を公開しました。

以下のページの「先行開発バージョンはこちら」からダウンロードできます。
https://hide.maruo.co.jp/software/hidemaru.html

32bit版:
https://hide.maruo.co.jp/software/bin3/hm918b4_signed.exe

64bit版:
https://hide.maruo.co.jp/software/bin3/hm918b4_x64_signed.exe

[ ]
RE:10896 V9.18β4No.10897
グズラ さん 22/08/05 13:20
 
グズラです。

> デスクトップヒストリから選択したとき、「デスクトップを開く」で記憶されてい
>る場所の更新や、システムメニューから現在のフォルダの移動などの修正。

対応ありがとうございます!
これでとても便利になりました。

[ ]
RE:10896 V9.18β4No.10898
こみやんま さん 22/08/06 13:55
 
■JavaScript版の wnidowhorz 関数は、 windowhorz の間違い

 (HidemacJSGlobal.js [ HidemacJS.dll ])の段階で間違っています)

[ ]
RE:10898 V9.18β4No.10899
秀丸担当 さん 22/08/08 08:58
 
その通りでした。発見していただいてありがとうございます。
修正しておきます。

[ ]
RE:10899 やはり 簡易版であってもrequireNo.10900
こみやんま さん 22/08/08 15:54
 
やはり require あったほうが良いように思えます。

ライブラリ相当と、利用相当で互いにvar衝突をさけるため、
変数に_衝突しなさそうな付けまくるようになるか、
息の長いものを提供しようとすると
ライブラリ自体をfunctionで囲むようになってしまうかと。

(今でもWebの方のJavaScriptではよく見られるやむをえないバッドプラクティス...)

それを考えると、簡易版であっても(名前空間がどうしても汚れやすいexecjsとは別に)
名前空間が汚れにくいrequireのような何かを提供した方が良いかと思います。

以前投稿した際は、JScriptにはビルトインのJSONが無いという前提でのお返事だっ
たかと思います
(JSONはevalでない方がいい、みたいな返答が来てたので)

JScript、Chakraも(JSONあるはず、無いならこれもバージョン指定不足なだけ)、Web
View2もJSONはあるので、
var lib = require(...)  といったことができる関数は作りやすいかと思います。

■JSON系。
require(json_filepath);

json_filepathの末尾が".json"(大文字小文字無視)な場合、
⇒ @currentmacrodirectory Aカレントフォルダ Bフルパス の順番で、該当ファ
イルを探して存在すれば、
```
var text = hidemaru.loadTextFile(json_filepath);
return JSON.parse(text);

■js系

require(filepath);

⇒ @currentmacrodirectory Aカレントフォルダ Bフルパス の順番で、該当ファ
イルを探して存在すれば、
 なければ、filepathに、".js"を末尾につけて再び
 @currentmacrodirectory Aフルパス の順番で、該当ファイルを探して存在すれば、
     var js_text = hidemaru.loadTextFile(filepath);

``` require用の捏造コード
     exports = {}; function() {${js_text}; return exports; }();
```;
  を実行する。

可能ならば、require用の捏造コードはネイティブで Evaluateして、
そのままネイティブでエラーを補足するのがよいです。
(js側のコードがカッコ等がぐだぐだでも他へと波及しないから安定しやすいから)

以下のような関数(をネイティブに落としたもの)を用意する
(方向性提示のみ、動作確認はしていません...)
function require(filepath) {
    var m_file_path = "";

 // 秀丸独自仕様として、カレントマクロディレクトリを考慮する
    var m_currentmacrodirectory = currentmacrodirectory();
    if (existfile(m_currentmacrodirectory + "\\" + path + ".js")) {
        m_file_path = m_currentmacrodirectory + "\\" + path + ".js";
    } else if (existfile(path + ".js")) {
        m_file_path = path + ".js";
    }
 // 実際には、「JSONの場合」とか、「filepath 自体に.jsが含まれている場合」も
入れる

    var module_code = hidemaru.loadlTextFile(m_file_path);

 // requireのコアは詰まるところ下記のexportsに過ぎない、
 // exportsを取り巻くその他の細かい仕様はあまり使われないから
 // module.exportsみたいなのはやりはじめるとキリがないからやめる。nodeそのも
のではないから。
    var eval_code = "(function(){ var exports = {};" + // エラー時の行数が実
態と変化しないように、迂闊に改行コード入れない
        module_code + ";" +
        "return exports; })()";
    var eval_ret = null;
    try {
        eval_ret = eval(eval_code)
    } catch(e) {
        filepathと一緒にeを出力す。
        throw(e); // 2重のエラー出力にしたくなければ再スローはしなくてもい
いかも。
    }
    return eval_ret;
}

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

[ ]
RE:10900 やはり 簡易版であってもrequireNo.10901
秀丸担当 さん 22/08/09 09:31
 
どこかにあるライブラリ的というかモジュール的な.jsを、書き換えずにそのまま使
えて、一般的な書き方と同じようにできるやり方があるとしたら、いいかもしれませ
ん。
importなんとかだとややこしそうですが、require()でオブジェクトを返すだけであ
れば、ご提案のrequire()入りのjsを用意しておいて最初に
execjs "require.js";
としておけば現状でできると思います。

もし他のマクロセット(?)と被る可能性がある場合、名前空間を固有にできたらいい
かもしれません。
実はjsmodeの文字列そのものが名前空間なのですが、スクリプトエンジンの判断は\
までにしてあります。
それで、jsmode "WebView2\\hoge";みたいに、\までがスクリプトエンジンとなり、\
以降のhogeの部分で被らない名前空間にできたりします。

将来もしWebView2でレンダリングもOKにしていくとしたら、WebView2上の仮想ホスト
を作る必要性が出てきたりして、ローカルで扱いにくいimportとかができるようにな
るのかもしれないです。(試していないですが)
でも自ら制約をつけたいということもあって、本当はできても禁止するかもしれない
ですが。

個人的にはどんどん話が膨れ上がっていくときりがないので、とりあえず秀丸マクロ
をシンプルにJavaScriptの文法で書けたらいいのではないかと思います。

関係ないですが「```」に似た、C#の「"""」というヒアドキュメントがあるらしく、
なんだか良さげなので、マクロの文字列としてこれができたらいいです。

[ ]
RE:10896 「機種依存文字」に対する不合理No.10902
mina さん 22/08/09 11:50
 
■ はじめに
以下,[ファイルタイプ別の設定(C)] や [動作環境(E)] や [キー割り当て(K)] 等々
がデフォルト設定と仮定して。
「秀丸エディタ」は,最新の Version 9.18β4 64bit edition です。
「機種依存文字」に対する表示や動作に関して,2 点ばかり問い合わせかたがた要望
です。
ここで言う「機種依存文字」とは,
『秀丸エディタヘルプ』[目次]-[コマンド]-[検索系コマンド]-[機種依存文字につい
て] にあるような
“一昔前”の「機種依存文字」の方ではなく,
『秀丸エディタヘルプ』[目次]-[コマンド]-[ファイル系コマンド]-[変換できない文
字の警告(保存時)] で
「変換できない文字」になり得る様な“今時”の「機種依存文字」の方の事です。
多分,Unicode は存在しても Shift-JIS, EUC, JIS の各文字コードは存在しない文
字の事になるのではないかと。

■ [マーク一覧(M)] 中の「機種依存文字」の文字化け
[検索(S)]-[マーク一覧(M)] で開く別ウィンドウ中のマーク行表示内容に「機種依存
文字」が含まれていると,
"?" で表示されてしまいわかりづらく感じます。
これは,意図された仕様なのか,意図しないバグなのか,どちらでしょうか。
[検索(S)]-[検索(F)] で開く別ウィンドウ中のドロップダウンリストの検索履歴や,
[編集(E)]-[クリップボード履歴(H)] で開く別ウィンドウ中のドロップダウンリスト
のクリップボード履歴では,
表示内容に「機種依存文字」が含まれていても正しく表示されているので,
[検索(S)]-[マーク一覧(M)] の方も,この様に改良して頂けませんか。

■ [CTRL]+[F] キー操作が「機種依存文字」を対象に機能しない
秀丸エディタの主たる編集画面中に於いて,[CTRL]+[F] キー操作で,
カーソル直後の 1 ワードが検索対象文字列として仮選択された状態で
[検索(S)]-[検索(F)] ウィンドウが開く機能を,便利に常用させて頂いています。
この時,[検索(S)]-[検索(F)] が「機種依存文字」の場合には,機能してくれていな
いように見受けられます。
例えば,カーソル直後が "S"(Unicode: U+2473) の場合は機能し,
カーソル直後が "㉑"(Unicode: U+3251) の場合は機能しません。
これは,意図された仕様なのか,意図しないバグなのか,どちらでしょうか。
出来れば,「機種依存文字」の場合でも機能するよう様に改良して頂けませんか。

■ おわりに
致命的なバグではありませんが,“仕様”として納得するには不合理・不統一に思わ
れるので,
改良の方向で前向きに御検討頂ければ幸いです。
勿論,開発計画の中で優先順位低めで構いません。
以上,長文で失礼致しました。宜しく御願い申し上げます。

[ ]
RE:10901 require / import / ヒアドキュNo.10903
こみやんま さん 22/08/09 12:12
 
■require / import
>もし他のマクロセット(?)と被る可能性がある場合、名前空間を固有にできたらいい
>かもしれません。
require で呼ばれた側は常に「無名関数内で書かれていることになる」ので、
requireで呼ばれた側は別の何かと「変数が被る可能性が0」になるんですよね。
("var"すら書かずに完全なるグローバルにしたもの以外は)

>importとかができるようになるのかもしれないです。(試していないですが)
今回requireを提案したのは、今のところJScript〜WebView2(V8の10.x)までで共通で
実装できるのはrequireだからということからでした。
WebView2限定みたいな形にはなると思いますが、import export へと少しずつは移っ
ていくとは思います。

■"""
>関係ないですが「```」に似た、C#の「"""」というヒアドキュメントがあるらしく、

pythonで比較的昔から採用されているヒアドキュメントのさらなる応用版です。
「現状のVS2022でも」
****.csproj に以下のように

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <LangVersion>Preview</LangVersion> // この行を足しこみ
    <Nullable>enable</Nullable>
  </PropertyGroup>
</Project>

といったようにLangVersionをPreviewにすると、
具体的に動作を確認することができます。

空白タブを考慮して、
「各行はどこが先頭なのか、先頭の空白文字やタブは無視するべきなのか」などを
先頭と末尾の"""の「左にある空白状況」から自動的に判断する機能が組み込まれて
います。

""" については提案しようかどうしようか、迷っていました。

ヒアドキュメントといえば、WebView2の方はテンプレート文字列があるからいいので
すが、
JScriptの方は、実はヒアドキュメントに近い機能が js自体には無いので
マクロのjs { }の中ではRや@は使えますが、外に出ると使えない)

現状だと、
function Raw(text){
    return text.toString().match(/\/\*([\s\S]*)\*\//)[1].toString();
}

EvalMacroRaw( func ) {
    var r = Raw(func);
    hidemaru.EvalMacro(r);
}

EvalMacroRaw( function() { /*
#a = 3;
$b = "あいうえお";
message(str(#a));
*/
} );

みたいになってしまうだろうな、とは思っています。
(\や\nなど付けて頑張る手もなくはないですが、思っているよりも目がチカチカして
シンドイ所業にはるはずw)

[ ]
RE:10902 「機種依存文字」に対する不合理No.10904
秀丸担当 さん 22/08/09 16:53
 
マークについては、ずっと初期の頃からある機能で、仕様というか引き継いでいて、
それを一応残しているような状態になっています。
マークの上限は当初20個からはじまって、バージョンが進むにつれ今では256個まで
なのですが、もっと大量にしたいというご要望もあります。

このテキストは、マークをしたその時点の行のテキストを拾って記憶するので、20個
の頃は今で言うブックマーク的な使い方でした。
今の256個では全体の把握がなんとかできますが、もっと際限なく増やすことを考え
ると、昨今の規準ではあまりよくないテキストの拾い方だと思っています。
例えば、検索で「すべて検索 - マーク」みたいのを新規に作るとしたら、テキスト
内容がたくさん記憶されてしまいます。
個数を増やすとしたら、いままで記憶はそのままにしても、新しく覚えるのは場所だ
けにして、自動でテキストを拾うのをできたら廃止する方向にもっていったほうがい
いのではないかと思います。

「ブックマークに追加...」で、表示名をこういう名前で登録するよ、と確認してOK
するのがあるべき形かと思います。
そういえばブックマークは行番号の指定ができなかったので、できてもよさそうでし
た。
先頭に「mac:」を書いてなんとかする方法もありますが、マクロファイルしか指定で
きないので、秀丸ファイラーClassicのように直接1行マクロが書けてもよさそうで
した。


Ctrl+Fでの検索文字列の取り込みは、確かにSと○21(U+3251)で違っていました。
当初は、Shift-JISの全角と、全角内のひながなカタカナ記号などを、独自判断の種
別に分けたりしていましたが、その後判断を追加したりして、直近ではV8.96でUnico
deのCJKの範囲など、幾つか独自判断に追加したりしています。
○21など、めぼしいものも判断に加えようと思います。
本当は「大文字/小文字の変換...」でやっているみたいな、ICUの判断にしたらいい
のかもしれませんが、そこまでは互換性が崩れそうで怖いのでやめておきます。

検索ダイアログ上で、もう一回Ctrl+Fを押すと、追加で取得して、さらに何回でもCt
rl+Fを押すことができます。
現状では、それで一応何とかなると思います。

[ ]
RE:10903 require / import / ヒアドキュNo.10905
秀丸担当 さん 22/08/10 10:11
 
require()は、JScriptでも使えるオブジェクトなどの値を返すだけのシンプルな方法
ができたら良いと思います。

中身が被るというより、require()自身の動作がまちまちというか、状況に応じて変
化しかねないのかなと思いました。
モジュール側を合うように書き換えたマクロ一式であったり、モジュール側はいじら
ずrequire側を合わせたマクロ一式があったりとなれば、全部自分で書くのとあまり
変わらないような気もします。

…と思ったのですが、やっぱりexports = だけじゃなくて、module.exports = も両
方押さえておけばそれで十分という気もしてきました。
あんまり具体的なことをしていないので、レンダリングもするとあれこれしたくなっ
てくるのだと思います。

ヒアドキュメントはもっと前から似た方法などがあるのですね。
C#の新しい方法は、使う文字が「"」の1つだけで、インデントできて「"」を4つ以
上で罫線っぽく書くこともできたりして、美しくて良さげなので、同じようなのをや
ってみようかと思います。

[ ]
RE:10896 V9.18β4No.10906
こみやんま さん 22/08/11 00:15
 
■マクロヘルプの setconfigstate文 の説明文 で多分ミスかな?

```
パラメータに1を指定(ビット1を1)すると一時的な設定になります。
```

は、おそらく(ビット0を1)と思われます。


[ ]
RE:10904 「機種依存文字」に対する不合理No.10907
mina さん 22/08/11 11:12
 
[検索(S)]-[マーク一覧(M)] に関しては,こちら側としては
単に文字化けしてほしくないという表面的な要望でした。
この点だけでも,何かの事情で改良不能なのでしょうか。
根本的な仕組みというか,設計思想的な事は,そちらにお任せします。

敢えて要望をするなら,マーク記録のタイミングをリアルタイムにして頂ければと。
どんなタイミングでどこに記録しているのか存じませんが,
現状の仕様だと,マーク後に更に編集作業を続け(∴ 被マーク行の行位置も連動し
て変動),
トラブルで秀丸エディタが落ちたり Windows がフリーズしたりして,正常終了出来
なかった場合,
再起動復帰後,記録されている行位置と実際の行位置がズレて困っているので…。


[CTRL]+[F] キー操作に関しては,――
> めぼしいものも判断に加えよう
――は,やって頂けないよりはやって頂けた方が勿論有り難いのですが,
そのやり方だと,「めぼしい」の判断基準が開発者側の主観で,
何をどこまでするべきなのか取り止めがない無い様な…。
例えば "♪"(Unicode: U+266A) は大丈夫で が "&#9835;"(Unicode: U+266B) が駄目
なのは何故だ等々,
ユーザーによって,なぜこの文字は考慮されていないんだと,不平不満が尽きないか
と。

> 検索ダイアログ上で、もう一回Ctrl+Fを押すと、追加で取得して、さらに何回でも
>Ctrl+Fを押すことができます。
――は,今迄知りませんでした。こちら側の不勉強でした。
『秀丸エディタヘルプ』[目次]-[コマンド]-[検索系コマンド]-[検索文字列の取得]
に,
ちゃんと載っていますね。
これで,操作性や作業効率が改善されそうです。有り難う御座います。

[ ]
RE:10907 ※ 誤字訂正No.10908
mina さん 22/08/11 11:19
 
↑ (誤)大丈夫で が → (正)大丈夫で

失礼致しました。

[ ]
RE:10906 V9.18β4No.10909
こみやんま さん 22/08/11 15:02
 
サイトー企画さんは只今夏季休暇中(ヒャッハー中)ですが、
メモってると忘れそうなので、
発見次第ちくちくとバグを投稿していこうかと思います。

■getclipboardinfo について
--------------------------------------------------------
getclipboardinfo はヘルプの記載、JavaScript定義ともに間違っている(機能しない)

●getclipboardinfo関数 の ヘルプの記載

返り値(文字列型)  ← 文字列型 ではなく 数値型
    パラメータ1が0の場合、クリップボードに

●JavaScript定義も返り値が文字列型になってしまっていて間違っている(このため
秀丸マクロへのevalでこけて機能していない)
hg.getclipboard = function(){ var m="getclipboard";eval(fs);return r;};if(f)
getclipboard=hg.getclipboard; //関数

eval(fs)ではなく、eval(fn)が正しい

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

■imeregisterword について
--------------------------------------------------------
・おそらくWin11のデフォルトのMS-IMEでは機能してないと思われる
・Win10ではデフォルトのMS-IMEでも機能してると思われる
  (手元にWin10は無いですが、Win Server 2019で機能してるため、
   類似のWin10は多分機能してそう)
・ATOK2019は機能しています。
・Google 日本語入力は多分 サイトー企画さん側が未対応なのかな?

(私自身はこの文は使ったことはないですが、定義ファイル作成の際機能していなか
ったので一応報告です)
--------------------------------------------------------


[ ]
RE:10909 JavaScriptのcreateobjectでも.NNo.10910
こみやんま さん 22/08/11 19:15
 
ちゃんとCOM風に書けば、とりあえず、WebView2時でも
.NET 4.xは使えることがわかりました。

秀丸マクロで動かす方法は、以前よりわかっている最低限の

■秀丸マクロや秀丸のjsmode "JScript"で必要な記述
========================================================
using System;
using System.Runtime.InteropServices;
namespace Test
{
    [Guid("3BDB20EF-09BE-4B53-B662-8A9B584976E1")]
    public class Foo
    {
        public String foo(int a)
        {
            return "Hello world!" + a.ToString() + a.ToString();
        }
    }
}
========================================================
Propertyなどどこかに以下みたいにあること
[assembly: ComVisible(true)]
[assembly: Guid("29ac370d-cfa4-455d-b99b-cf5f271700cd")]
========================================================

で動作します、秀丸のJScriptのcreateobjectでもこれでいけています。
(多分自動登録した後は、HidemacJS内でJScriptのnew ActiveXObject 呼び出してる
だけなんじゃないの〜? とは思っていますが)


■jsmode "WebView2" で必要な記述。 (.NET 4.xを利用)
========================================================
using System;
using System.Runtime.InteropServices;

namespace Test
{
    [Guid("D76AD0FB-3901-4A42-9E30-23BA2D2B5869")]
    public interface IFoo
    {
        String foo(int a);
    }

    [ClassInterface(ClassInterfaceType.None)]
    [Guid("3BDB20EF-09BE-4B53-B662-8A9B584976E1")]
    public class Foo : IFoo
    {
        public String foo(int a)
        {
            return "Hello world!" + a.ToString() + a.ToString();
        }
    }
}
========================================================


[ ]
RE:10910 JavaScriptのcreateobjectでも.NNo.10911
こみやんま さん 22/08/11 19:19
 
interfaceは必要ですが、interfaceの方のGUIDは不要みたいです。

[ ]
RE:10911 JavaScriptのcreateobjectでも.NNo.10914
こみやんま さん 22/08/12 16:00
 
■jsmodeのloaddllは、Hidemaru_GetDllFuncCalledType(-1) で得られる、該当のdll
自体を管理するための番号が渡ってこない。


これは渡ってくるのが理想的だと思います。
(渡ってこないと、dllは自己完結的に秀丸マクロ空間に対して相互に作用するのが困
難になってしまうので)

■dll側のコード(dll1.dll)
----------------------------
#include <windows.h>
#include <string>

using namespace std;

extern "C" __declspec(dllexport)
intptr_t _cdecl Func_for_dllfuncw(intptr_t n, wchar_t* pwsz) {

    HINSTANCE hinstExe = GetModuleHandle(NULL);

    using TpfnHidemaru_GetDllFuncCalledType =  int (WINAPI *)(int n);
    TpfnHidemaru_GetDllFuncCalledType pfnHidemaru_GetDllFuncCalledType = NULL;
    pfnHidemaru_GetDllFuncCalledType = (TpfnHidemaru_GetDllFuncCalledType)Ge
tProcAddress(hinstExe, "Hidemaru_GetDllFuncCalledType");


    if (pfnHidemaru_GetDllFuncCalledType != NULL) {

        //V8.66以降:正しく呼ばれているかチェック可能
        int dllNumber = pfnHidemaru_GetDllFuncCalledType(-1); //dllの管理番号
        wstring s0 = L"dllの番号" + to_wstring(dllNumber);
        ::MessageBoxW(NULL, s0.c_str(), L"", NULL);

        //V8.66以降:正しく呼ばれているかチェック可能
        int returnType = pfnHidemaru_GetDllFuncCalledType(0); //返り値
        wstring s1 = L"返り値" + to_wstring(returnType);
        ::MessageBoxW(NULL, s1.c_str(), L"", NULL);

        int paramType1 = pfnHidemaru_GetDllFuncCalledType(1); //第1パラメータ
        wstring s2 = L"第1引数" + to_wstring(paramType1);
        ::MessageBoxW(NULL, s2.c_str(), L"", NULL);

        int paramType2 = pfnHidemaru_GetDllFuncCalledType(2); //第2パラメータ
        wstring s3 = L"第2引数" + to_wstring(paramType2);
        ::MessageBoxW(NULL, s3.c_str(), L"", NULL);
    }
    else {
        //V8.66未満:間違って呼ばれているかどうかは判断できない
    }

    //ここからパラメータ等を想定通りに扱う
    intptr_t nReturn = n + 22222;
    OutputDebugStringW(pwsz);
    return nReturn;
}



■マクロ側のコード(a.mac)
--------------------------------------
// マクロ上
#dll = loaddll( currentmacrodirectory + @"\dll1");
#r = dllfuncw(#dll, "Func_for_dllfuncw", 33, "abc");
freedll(#dll);

js {
    var dllmng = loaddll( currentmacrodirectory() + "\\dll1");
    var r = dllmng.DllFuncW.Func_for_dllfuncw(33, "abc"); // dllの番号が-214
7483638 みたいな値が返ってきている
 // あくまでも loaddll は内部的には、「秀丸マクロのloaddll関数」を呼び出して
いて、
    // dllオブジェクトはその管理番号も握っているのが望ましい。
 //
    r = null; // rが明示的(あるいはdllmng変数スコープが終わるなどで自動的に)
解放されると、
    freedll(dllmng.dll番号)したことと同じことが起きるようにラップされている
といった形
}

[ ]
RE:10909 getsearch文 のヘルプの例題のNo.10915
こみやんま さん 22/08/12 17:57
 
ヘルプのgetsearch文の例が

beepgetsearch;

となってしまっています。

getsearch;

の間違い。

[ ]
RE:10907 「機種依存文字」に対する不合理No.10916
秀丸担当 さん 22/08/17 10:26
 
マークで文字が?にならないようにしたいだけということは承知しています。
余計なことを書いて申し訳ございません。
マークの機能は強化しても、テキストそのものの記憶については、強化する方向では
なく、縮小する方向に向かうべきなのではと考えているということでした。

実はUnicode対応のマークの設定は、V9.12以降で追加で対応しています。(読み取り
だけ)
Unicode対応でないものをUnicode対応にするには、互換性や形式的なことがあって、
本来それだけでも面倒なのですが、そういう面倒なはずだったことは既にクリアして
いて、すぐにでも対応可能です。

ですが、これは強化というより、数を増やしつつテキストは縮小していくことを見据
えたもので、今後それをどう扱うかは未定です。
例えば次のバージョンではできるようにしたはいいけど、その次とか将来では、そも
そもテキストを記憶しないようにしていくかもしれない、といった感じです。

マーク情報の記憶はパフォーマンスの都合もあり、編集して行番号が変わったものを
即時保存は難しいかもしれません。「現在行をマーク/マーク解除」を実行すると、
その時点の状態は記憶されます。

検索文字列の取得の、めぼしいものとは、ICUとかUnicodeの規格ではなく、適当な判
断にするつもりです。
規格による分類というより、従来のShift-JISにある文字との連続性になるかと思い
ます。
検索ダイアログを出したときの取得は、「検索文字列の取得」コマンドに相当してい
て、どこまでを区切りとするかという、単語左右移動などにも関わる判断とほぼ同じ
になっています。
@〜Sと丸付き21(U+3251)〜35、36〜50の間で境界ができるのは変なので、対応した
ほうがいいと思います。
黒塗り丸付き数字(U+278A)とか、括弧付き数字(U+2474)とか、その他もろもろのShif
t-JISの同種の連続性が無ものは、放置でいいんじゃないかと思います。

Shift-JISとの連続性が、規格としての判断基準があるのかどうかはわからないです
が、なんとなく無いような気がします。(知っていたら教えてほしい)
あったとしても、それがICUの判断に依存となると、OS依存でWindows 10の古いバー
ジョン以前とかでは動作が違ってしまいます。
文字コード一覧を見た感じでは、他には、ローマ数字11,12、カタカナ、ひらが
なの追加がありそうでした。
ご指摘の音符は盲点だったので助かりました。

[ ]
RE:10914 JavaScriptのcreateobjectでも.NNo.10917
秀丸担当 さん 22/08/17 12:51
 
ヘルプのご指摘いろいろありがとうございます。
いずれも直しておきます。

WebView2で.netのCOMができる方法があるのですね。
秀丸エディタのhidemaru.createObjectについては、.net4系統については、ユーザー
ごとの登録をした後は、普通にCoCreateInstance(たぶんnew ActiveX相当)してい
るだけで、IDispatchが取得できた後はどうなっているかわからないです。
C++,.net core系統については、CoCreateInstanceも呼ばずにDLLを直接呼んでいます。

hidemaru.loadDllは、本体のloaddllとは全く別の独立した存在になっています。
Hidemaru_GetDllFuncCalledTypeについては、別の存在でありながら成り立たせるた
めに、呼ばれ方情報だけは結びつけています。
0x80000001みたいな、32bitの最上位ビットが立ったIDにしていて、マクロ側loaddll
のIDと被らないようにしています。10進だとマイナス値でわかりにくいですね。

そういえば、本体と分離していることもあって、通常版でもFLOATMACROのDLLが呼び
出せました。
通常版にもHideMath.dllを添付してもいいかもしれません。というか古いHideMath.d
llが残っているとそれが使えてしまうので、上書きするたにも標準付属にしたほうが
よさそうです。
機能としてはMathオブジェクトがあるのでべつにいらないかもですが、エディション
差異が無くなるのは良いし、Format関数が使えるのも良いと思います。

解放については、一応オブジェクトが削除されるタイミングで、解放するはずになっ
ています。
とはいえ、obj = null;(ちなみに例ではdllmng = null;も必要)にするだけではobj
の即削除とはならないようで、タイミングはスクリプトエンジンの裁量(?)によるよ
うです。
JScriptでは書き換えた直後は放置で、次の実行の最初で削除されるようです。
WebView2だと全然削除されないようですが、let = obj;でスコープを与えると1発目
は数秒後に何でもないタイミングで解放されるようです。ちょっと興味深い動きです
が、2発目が時間差でも来ないようで、謎です。
いずれのケースでも、jsmode "";で明示的に消せばすぐ消えるようでした。

あとsetDllDetachFuncがWebView2で動いていませんでした。
またWebView2のIDispatchの独特な呼び方にはまっていました。動作するように修正
します。

[ ]
RE:10917 JavaScriptのcreateobjectでも.NNo.10919
こみやんま さん 22/08/17 14:57
 
>C++,.net core系統については、CoCreateInstanceも呼ばずにDLLを直接呼んでいます。

.net4は投稿のインターフェイス付ける方法(ちょっと丁寧な正統(?)な方法)で動作す
るようですが、
.net core / .net5 はWebView2では動作しないようです。

JavaScript層から見える形でインスタンス作成には成功しているようですが、(JSか
ら扱えるCOMオブジェクトには多分なってる)
メソッド呼び出しでコケるようです(Dispatchかキャストか不明ですが失敗してる)

//-----------------------------------------
using System;
using System.Runtime.InteropServices;

namespace NET7COMServer
{
    [ComVisible(true)]
    [Guid("F7C7F305-EDD9-4B7C-99AD-32009FAEBFBC")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface INET7COMSesrver
    {
        string str_add(string a, string b);

        int int_add(int a, int b);
    }


    [ComVisible(true)]
    [Guid("DFC9B129-9C6F-4CEB-AC74-A25EFE3A172F")]
    public class NET7COMServer : INET7COMSesrver
    {
        public string str_add(string a, string b)
        {
            return a + b;
        }

        public int int_add(int a, int b)
        {
            return a + b;
        }
    }
}
//---------------------------------------------
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <EnableComHosting>true</EnableComHosting>
    <EnableRegFreeCom>true</EnableRegFreeCom>
    <PlatformTarget>x86</PlatformTarget>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <PlatformTarget>x86</PlatformTarget>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <PlatformTarget>x86</PlatformTarget>
    <DebugType>none</DebugType>
    <DebugSymbols>false</DebugSymbols>
  </PropertyGroup>
</Project>
//---------------------------------------------

少々色々試しても秀丸のjsmodeのJScriptだと読めて(秀丸マクロ上でも)、jsmodeのW
ebView2だとCOMインスタンスは作成成功するが、メソッドは呼び出しに失敗する、と
いったことになるみたいです。


[ ]
RE:10914 JavaScriptのcreateobjectでも.NNo.10920
こみやんま さん 22/08/17 15:09
 
>■jsmodeのloaddllは、Hidemaru_GetDllFuncCalledType(-1) で得られる、該当のdl
>l自体を管理するための番号が渡ってこない。
>
>
>これは渡ってくるのが理想的だと思います。
>(渡ってこないと、dllは自己完結的に秀丸マクロ空間に対して相互に作用するのが
>困難になってしまうので)
>
>■dll側のコード(dll1.dll)
>----------------------------
>#include <windows.h>
>#include <string>
>
>using namespace std;
>
>extern "C" __declspec(dllexport)
>intptr_t _cdecl Func_for_dllfuncw(intptr_t n, wchar_t* pwsz) {
>
>    HINSTANCE hinstExe = GetModuleHandle(NULL);
>
>    using TpfnHidemaru_GetDllFuncCalledType =  int (WINAPI *)(int n);
>    TpfnHidemaru_GetDllFuncCalledType pfnHidemaru_GetDllFuncCalledType = NULL;
>    pfnHidemaru_GetDllFuncCalledType = (TpfnHidemaru_GetDllFuncCalledType)G
>etProcAddress(hinstExe, "Hidemaru_GetDllFuncCalledType");
>
>
>    if (pfnHidemaru_GetDllFuncCalledType != NULL) {
>
>        //V8.66以降:正しく呼ばれているかチェック可能
>        int dllNumber = pfnHidemaru_GetDllFuncCalledType(-1); //dllの管理番号
>        wstring s0 = L"dllの番号" + to_wstring(dllNumber);
>        ::MessageBoxW(NULL, s0.c_str(), L"", NULL);
>
>        //V8.66以降:正しく呼ばれているかチェック可能
>        int returnType = pfnHidemaru_GetDllFuncCalledType(0); //返り値
>        wstring s1 = L"返り値" + to_wstring(returnType);
>        ::MessageBoxW(NULL, s1.c_str(), L"", NULL);
>
>        int paramType1 = pfnHidemaru_GetDllFuncCalledType(1); //第1パラメータ
>        wstring s2 = L"第1引数" + to_wstring(paramType1);
>        ::MessageBoxW(NULL, s2.c_str(), L"", NULL);
>
>        int paramType2 = pfnHidemaru_GetDllFuncCalledType(2); //第2パラメータ
>        wstring s3 = L"第2引数" + to_wstring(paramType2);
>        ::MessageBoxW(NULL, s3.c_str(), L"", NULL);
>    }
>    else {
>        //V8.66未満:間違って呼ばれているかどうかは判断できない
>    }
>
>    //ここからパラメータ等を想定通りに扱う
>    intptr_t nReturn = n + 22222;
>    OutputDebugStringW(pwsz);
>    return nReturn;
>}
>



>hidemaru.loadDllは、本体のloaddllとは全く別の独立した存在になっています。
>Hidemaru_GetDllFuncCalledTypeについては、別の存在でありながら成り立たせるた
>めに、呼ばれ方情報だけは結びつけています。
>0x80000001みたいな、32bitの最上位ビットが立ったIDにしていて....(略)



このloaddllまわりは、
--------- HidemacGlobalJS_Extension.js ------------------
(function() {
 var f = 1;

 var gv = function(s){return hidemaru.getVar(s);};
 var evm = function(s){return hidemaru.evalMacro(s);};

 var hidemacJsGlobalStatements="var s=m+' ';for(var i=0;i<arguments.length;i
++){if(i>0)s+=',';var a=arguments[i];if(typeof(a)=='string'){s+='R\"\xFF('+a
+')\xFF\"';}else{s+=a;}}evm(s+';###=result;');var r=gv('###');";
 var hidemacJsGlobalFomulaNumber="var s='###='+m;"
   +"if(arguments.length>=1){s+='(';for(var i=0;i<arguments.length;i++){if(i
>0)s+=',';var a=arguments[i];if(typeof(a)=='string'){s+='R\"\xFF('+a+')\xFF\
"';}else{s+=a;}}s+=')';}" //パラメータあり=関数
   +"evm(s+';');var r=gv('###');"; //パラメータなし=キーワード
 var hidemacJsGlobalFomulaString="var s='$$$='+m;"
   +"if(arguments.length>=1){s+='(';for(var i=0;i<arguments.length;i++){if(i
>0)s+=',';var a=arguments[i];if(typeof(a)=='string'){s+='R\"\xFF('+a+')\xFF\
"';}else{s+=a;}}s+=')';}" //パラメータあり=関数
   +"evm(s+';');var r=gv('$$$');"; //パラメータなし=キーワード
 
 var st = hidemacJsGlobalStatements;
 var fn = hidemacJsGlobalFomulaNumber;
 var fs = hidemacJsGlobalFomulaString;
 
 var hg = hidemaruGlobal;
 if (hg && hg.version) {
  hg.loaddll2 = function(){var m="loaddll";eval(fn); return r;};if(f)loaddll
2=hg.loaddll2;
  hg.dllfunc = function(){var m="dllfunc";eval(fn);return r;};if(f)dllfunc=h
g.dllfunc;
  hg.dllfuncw = function(){var m="dllfuncw";eval(fn);return r;};if(f)dllfunc
w=hg.dllfuncw;
  hg.dllfuncstr = function(){var m="dllfuncstr";eval(fn);return r;};if(f)dll
funcstr=hg.dllfuncstr;
  hg.dllfuncstrw = function(){var m="dllfuncstrw";eval(fn);return r;};if(f)d
llfuncstrw=hg.dllfuncstrw;
        hg.setdlldetachfunc = function(){var m="setdlldetachfunc";eval(st);r
eturn r;};if(f)setdlldetachfunc=hg.setdlldetachfunc;
        hg.keepdll = function(){var m="keepdll";eval(st);return r;};if(f)kee
pdll=hg.keepdll;
 } else {
      message("No Global");
    }
})();


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

execjs currentmacrodirectory + "\\HidemacGlobalJS_Extension.js";

js {
try {
message(loaddll2);
var dll = loaddll2( currentmacrodirectory() + "\\dll1.dll");
var r = dllfuncw( dll, "Func_for_dllfuncw", 3, "あいうえお");

message(str(dll));
} catch(e) {
    message(e);
}
}

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

みたいに、ごく普通にJS関数として機能してるように思えるのですが、
JS層でDllマネージャーオブジェクトみたいなのを作って今の形にラップするにしても、
JS層で使えるDllマネージャメソッド ⇒ 上でいう loaddll2やdllfuncw へと形に内
部的に変換、

で普通に互換性が維持できるように思えるのですが、何かJSと秀丸マクロで思いっき
り分けなければならない理由があったんでしょうか。

[ ]
RE:10920 JavaScriptのcreateobjectでも.NNo.10921
こみやんま さん 22/08/17 15:10
 
hg.dllfuncstr = function(){var m="dllfuncstr";eval(fn);return r;};if(f)dllfu
ncstr=hg.dllfuncstr;
  hg.dllfuncstrw = function(){var m="dllfuncstrw";eval(fn);return r;};if(f)d
llfuncstrw=hg.dllfuncstrw;

あたりは fs の間違い

[ ]
RE:10920 JavaScriptのcreateobjectでも.NNo.10922
秀丸担当 さん 22/08/17 17:19
 
もともとは、自分の考えでは、秀丸メールのマクロを書こうとすると、やたらdllfun
cだらけになって、関数名を""の中に書くというあまり綺麗ではない書き方だったの
で、普通にドットシンタックスで書けたらいいというものでした。

もし公開するマクロのセットか何かがあったら、自前require()のように自前loaddll
2()のものを付属して同じ書き方にして使っても全然かまわないです。

あと、hidemaru.loadDllは、ラップではなくて、完全に別の存在になっています。
それで通常版でも浮動小数点数版のDLLが扱えました。
Hidemaru_GetDllFuncCalledTypeは、それを結び付けているだけになります。

[ ]
RE:10922 loadDll まわりの案No.10924
こみやんま さん 22/08/18 07:22
 
■普通にloaddllやkeepdllなど元々ある関数はhidemaruGlobalに普通にそのまま提供
したほうがよさげ

呼び出し時のdll番号や、keepdllなど、互換性が欠けるのであれば、
もともとあるdllがらみの関数や文は、そのままhidemaruGlobalに入れてしまった方
がいいように思えます。
(脳死で書けばほぼ間違いなく移植できるわけだから)

■その上で新しい書き方を提供する
「元の関数はちゃんとJavaScript上にもある」上で、
(やや非互換なところはあるものの)新しい記述方法を提供する、
という形の方がよいかと思います。
(秀丸マクロの仕組みに強く依存してなければこの新方式でも呼び出せますよっとする)

■1つのdllは原則、charかwchar どちらかで統一するのが普通の作り

各人が作成するdllはまともな作りであれば、
・原則的にはexportするインターフェイスは「charベースかwcharベース」か、どち
らかで統一するのが普通です。
 (おそらく事情がない限りwcharベースでしょう)

1つのdllでcharとwcharをexportの口でぐちゃぐちゃに混ぜるのはレア(それでは呼
び間違いしやすい)
以下みたいな形にしたほうがよいような気がします。



----------------------------------------------------
hidemaru.loadDll.charSet = {
    wchar:0, // デフォルトはwcharとする。
    char:1, // 実際には純粋なcharではなく、dll側からSTARTUNIMACROがexportsさ
れてれば、charではそのエンコードとデコードを裏で入れ込む。
    // 15年後には char_u8:2  みたいにutf8での関数exportが普通になり、そうい
った方法が強く求められるようになるかもしれない。
}
ともともと定義してある。

以下のような記述方法を想定する。

var dllmng = loadDll("***.dll");
dllmng.charSet = loadDll.charSet.wchar; // デフォルトと同じ=(wcharベース)な
ら、この代入自体しなくても良い

var sss = dllmng.asStr.bbb(3, "23");       // extern *** wchar_t* cdecl bbb
(intptr_t, wchar_t*);
// dllfuncwやdllfuncstrではないので、「dllの関数側にわたってくるHidemaru_Get
DllFuncCalledType情報の互換性はないかもね」というのが暗にわかる。

var iii = dllmng.asNum.ccc(3333, "33");    // extern *** intptr_t cdecl ccc
(intptr_t, wchar_t*);


dllmng.charSet = loadDll.charSet.char; // dllの中で例外的にcharSetが違う関数
が混じるなら、メソッド呼び出し前に途中で変えても良い
var ii2 = dllmng.asNum.fff(2222, "33");    // extern *** intptr_t cdecl fff
(intptr_t, char*);
var iii = dllmng.asNum.ccc(3333, "33");    // これは第2引数が不正な状態で渡
ってしまう。


// 他は同じ
dllmng.setDllDetachFunc( "DetachFunc" );

dllmng.dllFuncExist( "cCc" );



■使用例
---アウトプット枠の例-------------------------------------------------
var dllmng = loadDll("HmOutputPane.dll");
dllmng.charSet = loadDll.charSet.char; // このdllは現代では意識するべきchar
ベースですよっと。(実際にはSTARTUNICODE)(一部Wはあるものの...)
dllmng.asNum.Output(hidemaruhandle(0), "あいうえお\r\n");

// このcharベースで呼び出す必要がある秀丸付属のdllは、「秀丸マクロやJavaScri
ptに関数なり、メソッドなりを直接提供したほうがよいのではないか」と疑ったほう
が良いdll。
// そうすれば、charベースのインターフェイスを意識する機会そのものが減っていく。

---ファイルマネージャ枠の例-------------------------------------------------
var dllmng = loadDll("HmExplorerPane.dll");
dllmng.charSet = loadDll.charSet.char; // このdllは現代では意識するべきchar
ベースですよっと。(実際にはSTARTUNICODE)
var r = dllmng.asNum.LoadProject(hidemaruhandle(0),"C:\\folder\\test.hmbook");

var strcd = dllmng.asStr.GetCurrentDir(hidemaruhandle(0));
var strpj = dllmng.asStr.GetProject(hidemaruhandle(0));



[ ]
RE:10924 loadDll まわりの案No.10926
秀丸担当 さん 22/08/18 10:54
 
hidemaruGlobalに全部入れてしまうという方針も、なくはなかったとは思います。
その方針だと、createobjectに続くごり押しの文法も全部廃止したいけどそれも作っ
たり、DDEも無くしたいけど作ったりということになると思うので、やっぱりある程
度は変化したほうがいいのではないかと思います。

loaddllについては、通常版と浮動小数点数版の差異が無くせるところを逆戻りにな
ってしまうし、今思い出したこととして、[その他]→[動作環境]→[64bit版]の32bit
のloaddllを使用可能にするという救済措置ができなくなっていましたが、それもま
た続けてしまうことになってしまうと思います。
せっかくのタイミングなので、逆戻りしない方向にしたいところです。
execjs "スーパー互換.js";みたいのを装備するのは、任意で自由にしてもらえれば
いいと思います。

それで検討するとすれば、当初js{}に入ったときには書き換えられたグローバルは書
き換えられっぱなしだったのですが、今はオーバーヘッドになるとは思いつつ毎回復
活させています。
毎回復活させることが弊害になるとしたら、何か考えないといけないかもしれません。

ちなみにDllFuncManagerは無限のチェーンにできるので、DLLにとっての既定の呼び
出し方法を指定するときは、直接
obj=loadDll("my.dll").dllFuncW;
としてしまってもいいです。
objからさらにobj.dllFuncStrWとか、子や孫のプロパティがあります。


[ ]
RE:10926 loadDll まわりの案No.10928
こみやんま さん 22/08/18 16:16
 
>やっぱりある程度は変化したほうがいいのではないかと思います。...(略)
このjsmodeである程度整理したいという方針ですね、了解です。

>それで検討するとすれば、当初js{}に入ったときには書き換えられたグローバルは
>書き換えられっぱなしだったのですが、今はオーバーヘッドになるとは思いつつ毎
>回復活させています。



まぁ難しいところですねぇ。

WebView2上では、書き換え自体を防衛できますが、(windowに突っ込んだものは、win
dowなくても見えるというただのV8ではなくブラウザ借用エンジンならでわですがw)

jsmode "WebView2", 0;

js {
function ReadOnlyProperty(name, value) {
  Object.defineProperty(window, name, {
    value: value,
    writable: false
  });
}

ReadOnlyProperty("x", hidemaruGlobal.x);
ReadOnlyProperty("str", hidemaruGlobal.str);

}
// 実際にはここに距離がある

js {
    hidemaruGlobal.debuginfo(2)
 try {
        var x = 3; // 書き換えが通じない ⇒ エラーになる
        var str = "あいうえお";// 書き換えが通じない ⇒ エラーになる
  console.log(x);
 } catch(e) {
  console.log(e);
 }
}


こういったことをしてしまうと、逆に「スクリプト制作時の秀丸バージョンではエ
ラーにならなかったのに、
後日変数と同じ名前の関数が出来てエラーになるようになった」みたいなことにもな
るので...


結局は完全グローバル、あるいは大域のvarならば
「将来にわたってもかぶらなそうな変数や関数名」付けるか、
そういった回避が面倒なら、
require前提の作りへと切り替えてください。

ってなると思いますよ。



[ ]
RE:10928 loadDll まわりの案No.10930
秀丸担当 さん 22/08/19 11:25
 
windowオブジェクトをグローバルとして操作する方法もあるのですね。

以前から秀丸ファイラーClassicからでもやっていたJScriptは、HmFilerオブジェク
トがあってグローバルに展開するもので、今でもそうなのですが、ネイティブ実装さ
れていて、もともとこの方式だと書き換えできないものでした。
WebView2だとそれができないのと、暫定的な仕様に臨機応変に対応するためにも、グ
ローバル展開するjsを内部的実行し、両立させるためにもJScriptでもとりあえず同
じ方式にしています。
それでJScript側でも書き換えできるようになってしまっています。

JScriptではネイティブ、WebView2ではV8的制御とすれば、やり方はあることになる
と思います。
そのうち、表面的には気づかないようにネイティブ寄りにすり替えていったりできた
らいいと思っていました。

x,y,strの3つはついつい書いてしまいがちなので、これだけネイティブ&V8の両面
にすり替えてみようかと思います。
全部統一しなくても一部は上書き容認とかでもいいかもしれないです。

[ ]
RE:10930 loadDll まわりの案No.10932
こみやんま さん 22/08/19 16:23
 
>JScriptではネイティブ、WebView2ではV8的制御とすれば、やり方はあることになる
>と思います。
>そのうち、表面的には気づかないようにネイティブ寄りにすり替えていったりでき
>たらいいと思っていました。
他の類似機構だと、V8の方限定だと、freeze() とかもあるので、hidemaruGlobal.fr
eeze() とかやれば、hidemaruGlobalにユーザーが関数足したり、差し替えたりしな
いでくだしね、
ユーザー関数は自分の領域で定義してという意思表示はできますね。

一方で、hidemaruGlobal は自己責任で足してもいいよ、といった考え方もあります
し、方針しだいだと思います。


>
>x,y,strの3つはついつい書いてしまいがちなので、これだけネイティブ&V8の両面
>にすり替えてみようかと思います。
>全部統一しなくても一部は上書き容認とかでもいいかもしれないです。

あくまで自分の肌間隔ですが、hidemaruGlobal等にある関数全体をみるに、
・エディタ用のスクリプトであること
・関数の要求引数や返り値への受け渡しで付けそうな変数名

という視点で、危ないと思う変数名は以下です。

x
str
lineno
column
filename
y
result

[ ]