現在の秀丸の内容をDLLに渡す方法No.05903
緒方聡 さん 08/09/30 20:37
 
05899 でクリップボードの質問をさせてもらいましたが、
ちょっと関連した質問をさせていただきます。

やりたいことは:
1. たとえば現在開いている秀丸の 10 万行のテキストを DLL に渡したい
2. できるだけ高速に
3. 副作用のない形で
です。

具体的には「grep 結果置換」をしたいのですが、現在の方法は
dllfunc を使って、1 行ずつ渡しています。
これは非常に遅いです。

クリップボード経由で渡すとかなり高速ですが、秀丸 7.09 では
ちょっとした副作用(詳細は 05899)が出てしまうのと、
他のクリップボードを監視しているかもしれないアプリにも
影響があるので、できれば避けたい方法です。

テンポラリファイルに保存して、ファイル経由で渡すというのも
ひとつの手ですが、ファイル保存という大きな副作用が
残ってしまうので、やはり避けたい方法です。

じゃあ、dllfunc で可能な限りまとめて渡して、dllfunc を
呼び出す回数を減らすというのが考え付く最後の方法です。
ですが、10 万行もあると、分オーダーで時間がかかると思われ
一瞬で済むクリップボードやファイルに比べると速度面で
かなりの遅れをとってしまいます。

前置きが長くなりましたが、こんなやり方できないでしょうか?

1. マクロから DLL に秀丸のハンドルを渡す
2. DLL は受け取ったハンドルから HM32CLIENT をまさぐる
3. DLL から HM32CLIENT にメッセージを送るなどしてテキストを取得する

上記はさすがにそんな機能はないとは思いますが、どうにかして高速に
かつ副作用がなく DLL にテキストを渡せないものでしょうか?

※ 実際には 10 万行を扱える必要はないですが、
  2000 行ぐらいはよくあるケースだと思います
※ 今のところクリップボード経由で開発しています

[ ]
RE:05903 現在の秀丸の内容をDLLに渡す方No.05904
h-tom さん 08/09/30 21:05
 

h-tom です。

>05899 でクリップボードの質問をさせてもらいましたが、
>ちょっと関連した質問をさせていただきます。
>
>やりたいことは:
>1. たとえば現在開いている秀丸の 10 万行のテキストを DLL に渡したい
>2. できるだけ高速に
>3. 副作用のない形で
>です。
変換モジュールのインターフェースを使うとか?

[ ]
RE:05904 現在の秀丸の内容をDLLに渡す方No.05905
緒方聡 さん 08/09/30 23:36
 
こんばんは

>>やりたいことは:
>>1. たとえば現在開いている秀丸の 10 万行のテキストを DLL に渡したい
>>2. できるだけ高速に
>>3. 副作用のない形で
>>です。
>変換モジュールのインターフェースを使うとか?

盲点でした。なるほど。
そういえば調べたこともなかったです。

[ ]
RE:05905 現在の秀丸の内容をDLLに渡す方No.05906
秀丸担当 さん 08/10/01 10:48
 

h-tomさんも言われる通り、変換モジュールが目的に合うものだと思います。
もし変換モジュールの作り方について分からないことがあったらまたお問い合わ
せください。

[ ]
RE:05906 現在の秀丸の内容をDLLに渡す方No.05907
緒方聡 さん 08/10/01 12:47
 
>h-tomさんも言われる通り、変換モジュールが目的に合うものだと思います。
>もし変換モジュールの作り方について分からないことがあったらまたお問い合わ
>せください。

昨夜、その後調べてみたのですが、どうやって作ればよいのか
情報が見当たりませんでした。

ポインタだけ教えてもらえれば、後は自分で調べられると思います。

[ ]
RE:05907 現在の秀丸の内容をDLLに渡す方No.05908
秀丸担当 さん 08/10/01 14:46
 

以下のページ

 秀まるおのホームページ(サイトー企画) > ソフトウェア > 秀丸エディタ
 http://hide.maruo.co.jp/software/hidemaru.html

このページのダウンロードのところに
「変換モジュール開発キットおよびサンプル変換モジュールはこちら」
があります。
ここに、サンプルなどが含まれています。

[ ]
RE:05908 現在の秀丸の内容をDLLに渡す方No.05909
緒方聡 さん 08/10/01 16:49
 
ありがとうございました。
秀丸のインストールフォルダばかり見ていました。

[ ]
RE:05908 現在の秀丸の内容をDLLに渡す方No.05916
緒方聡 さん 08/10/04 11:07
 
>ここに、サンプルなどが含まれています。

サンプルを見て、動作の仕組みが大体理解できました。
いくつか質問させてください。

Q1. 変換モジュールのメニューのニーモニック指定をしたくない
ライブラリにあるマクロもいくつか設定してみて、
メニューのニーモニックが省略されているものがあることに
気がついたのですが(例えば「ソート...」や
「TAB -> 空白(クオート無視)」など)、サンプルの説明によると
HIDEMARUFILTERINFO に指定するメンバがあって、指定しない
設定の方法がわかりませんでした。

作成した変換モジュールは、任意の引数が必要なので、
メニューからはまともに動作しないため、ニーモニックは
つけたくないのです。

本当は、メニューにも出しておきたくないのですが、
これはもうしょうがないんですよね。

Q2. 登録されているかどうかの確認
変換モジュールには、ひとつだけフィルタ関数が公開されている場合、
以下の判定方法で間違ってないと思いますが、どうでしょうか。
登録されているかどうかと同時に、どこにあるかも探しています。

openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env\\Filter";
#c = getregnum("c");
while (#c != 0) {
    $key = "filter" + rightstr("0" + str(#c), 2);
    $path = getregstr($key);
    if (strstr($path, "FooBar.hmf") != -1) {
        if (ascii(rightstr($path, 1)) != '1') {
            #c = 0;
        } else {
            $path = leftstr($path, strlen($path) - 2);
        }
        break;
    }
    #c = #c - 1;
}
closereg;
if (#c == 0) {
    message "変換モジュールに登録されていません。";
    endmacro;
}
filter $path, "Baz", "...";

Q3. 変換モジュールは、標準のものも含めて 100 個まででしょうか?
Q4. どっちから呼ばれたの?
フィルタ関数が、filter 文から呼ばれたのか filter 関数から
呼ばれたのか判断する方法はあるでしょうか?

[ ]
RE:05916 現在の秀丸の内容をDLLに渡す方No.05917
h-tom さん 08/10/05 21:50
 

h-tom です。

>作成した変換モジュールは、任意の引数が必要なので、
>メニューからはまともに動作しないため、ニーモニックは
>つけたくないのです。
>
>本当は、メニューにも出しておきたくないのですが、
>これはもうしょうがないんですよね。

マクロからfilter文で、使用するなら、登録しなくても使えますよ。
>2005/10/12 Ver5.05
>・改善など
> filter文は動作環境で変換モジュールを追加していなくてもできるようにする。

[ ]
RE:05917 現在の秀丸の内容をDLLに渡す方No.05918
緒方聡 さん 08/10/06 01:25
 
こんばんは。

>マクロからfilter文で、使用するなら、登録しなくても使えますよ。
>>2005/10/12 Ver5.05
>>・改善など
>> filter文は動作環境で変換モジュールを追加していなくてもできるようにする。

そうでしたか。
動作確認をしていて、
・登録されてないと使えなかった
・登録されていても、フィルタにチェックされていないと使えなかった
という具合に動作したように思えたのですが、勘違いだったかも
知れません。

もう一度確認してみます。

[ ]
RE:05918 現在の秀丸の内容をDLLに渡す方No.05919
秀丸担当 さん 08/10/06 10:24
 

>Q1. 変換モジュールのメニューのニーモニック指定をしたくない

調べてみたら、ニーモニックを指定しないようにすることはできませんでした。
重複するものがあると、先に登録されたほうが優先され、後に登録されたほうは
表示されません。

>本当は、メニューにも出しておきたくないのですが、
>これはもうしょうがないんですよね。

h-tomさんも書かれている通り、登録せずにマクロからだけ使うことはできるは
ずです。
もしできないことがあるとしたら不具合なので、調べる必要がありそうです。

>Q3. 変換モジュールは、標準のものも含めて 100 個まででしょうか?

32個まででした。

>Q4. どっちから呼ばれたの?
>フィルタ関数が、filter 文から呼ばれたのか filter 関数から
>呼ばれたのか判断する方法はあるでしょうか?

これを判断する方法はありません。

[ ]
RE:05919 現在の秀丸の内容をDLLに渡す方No.05922
緒方聡 さん 08/10/06 23:16
 
>>Q1. 変換モジュールのメニューのニーモニック指定をしたくない
>
>調べてみたら、ニーモニックを指定しないようにすることはできませんでした。
>重複するものがあると、先に登録されたほうが優先され、後に登録されたほうは
>表示されません。

ご調査ありがとうございました。
ニーモニックを本当に使用したい場合は、少なくとも標準のフィルタ
とはかぶらないようにしたほうがよいわけですね。


>>本当は、メニューにも出しておきたくないのですが、
>>これはもうしょうがないんですよね。
>
>h-tomさんも書かれている通り、登録せずにマクロからだけ使うことはできるは
>ずです。
>もしできないことがあるとしたら不具合なので、調べる必要がありそうです。

できました。
登録されていた場合、レジストリから登録場所を取得する、という
実装がある状態で登録を解除したため、空文字でフィルタを
呼び出していたのが原因でした。


>>Q3. 変換モジュールは、標準のものも含めて 100 個まででしょうか?
>
>32個まででした。

こちらもありがとうございます。
ちなみに、ひとつのモジュールに登録できるフィルタは
13 個までですか?
サンプルでそんな感じに見えました。


>>Q4. どっちから呼ばれたの?
>>フィルタ関数が、filter 文から呼ばれたのか filter 関数から
>>呼ばれたのか判断する方法はあるでしょうか?
>
>これを判断する方法はありません。

了解しました。

[ ]
RE:05922 現在の秀丸の内容をDLLに渡す方No.05924
秀丸担当 さん 08/10/07 10:12
 

>>>Q3. 変換モジュールは、標準のものも含めて 100 個まででしょうか?
>>
>>32個まででした。
>
>こちらもありがとうございます。
>ちなみに、ひとつのモジュールに登録できるフィルタは
>13 個までですか?
>サンプルでそんな感じに見えました。

間違えてました。すみません。
変換モジュールは、標準のものも含めて100個まででした。
変換モジュール内の関数が32個まででした。

[ ]