クリップボード履歴を書き換えないでマクNo.41244
hajimet さん 11/08/17 19:28
 
古い話ですが
秀まるお2さまが、2009/10/20/Tueに
Subject: hidesoft.8:37143| RE 37141 選択した複数メール本文の文字列を取得す
にて曰く
> 秀丸エディタのV8.00から、マクロにdisablehistoryという命令が追加されて
>まして、それを使えばクリップボード履歴を書き換えないでマクロ動作させるこ
>とは可能になります。
とご発言頂いていた件について

マクロの先頭に、
disablehistory 0x0040;
と書いてみたのですが、どうしても履歴が
マクロでのクリップボード使用によって埋まってしまいます。
何か使い方を勘違いしていると思うのですが、
ご教示いただければ幸いです。



なお、以前、山紫水明さまに

openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
#cliphistflag = getregnum( "ClipHistFlag" );
if( #cliphistflag ) {  //クリップボードの履歴をとる
    writeregnum "ClipHistFlag", 0;
    envchanged;
}
・・・・・・・・・・・・・
if( #cliphistflag ) {
    writeregnum "ClipHistFlag", 1;
    envchanged;
}
closereg;

という対策をご教示いただいていたのですが、
なぜか今の環境では期待通りの動作をしません。

[ ]
RE:41244 クリップボード履歴を書き換えなNo.41247
秀まるお2 さん 11/08/18 08:56
 
 調べてみたら、秀丸メールではdisablehistory 0x0040;は全然効いてませんで
した。

 共有メモリが秀丸メールでは別空間になってることが原因でして、他にもダメ
なパターンがありそうな気もします。

 とりあえずそのdisablehistoryだけはうまく効くように修正させていただきま
す。

[ ]
RE:41247 クリップボード履歴を書き換えなNo.41248
hajimet さん 11/08/18 10:41
 
ご確認いただきありがとうございました
ところで
openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
#cliphistflag = getregnum( "ClipHistFlag" );
if( #cliphistflag ) {  //クリップボードの履歴をとる
    writeregnum "ClipHistFlag", 0;
    envchanged;
}
・・・・・・・・・・・・・
if( #cliphistflag ) {
    writeregnum "ClipHistFlag", 1;
    envchanged;
}
closereg;
が効かないのはなにか理由はあるでしょうか?
とりあえず、現状で対策する方途を捜しています。


[ ]
RE:41248 クリップボード履歴を書き換えなNo.41249
秀まるお2 さん 11/08/18 13:46
 
 こちらの件も調べてみたら、秀丸メールV5.50β19のタイミングで入れた修正
でレベルダウンがありました。大変失礼しました。

 秀丸メールを別々のメールデータ毎に複数起動出来るオプション追加をしてま
して、それの時に、envchangedを実行しても他プロセスの秀丸メールに影響を与
えないようにする修正があって、それの関係で秀丸にも影響を与えないようにな
ってしまってました。

 ということでそこは修正させていただきます。

 ただ、そのバグを直しても、クリップボード履歴を一時的に停止させても一番
最後に入れたクリップボードデータだけは履歴に出てきてしまうようです。

 それと…、バグ修正は一応出来て、disablehistoryでクリップボード履歴を抑
止出来るようにはなったんですが、秀丸エディタと秀丸メールの組み合わせが
32bit/64bit版で違ってたりするとダメです。共有メモリにアクセス出来ないの
で無理でした。

 両方ととも同じ32bit版なら32bit版、64bit版なら64bit版で統一すればうまく
動くようになります。(次のβ版から)

[ ]
RE:41249 クリップボード履歴を書き換えなNo.41319
hajimet さん 11/09/01 05:14
 
ClipHistFlagを直接変える方法は上手く動作するようになりました。
#動作確認しているときにミスしてヒストリを失いましたが。
一方、
disablehistory 0x0040;
は期待したとおりの動作をしません。素人判断ですが、
クリップボードへの書き込み自体を抑制しているような印象です。
ご確認いただけると幸いです。

[ ]
RE:41319 クリップボード履歴を書き換えなNo.41320
hajimet さん 11/09/01 05:36
 
ちなみに予期せず機能不全に陥っていると思われるコマンドは
setclipboard "";
addclipboard "";
appendcopy;
です。
一方、
poppaste;
は機能しているようで、マクロ作動前の履歴がペーストされます。

[ ]
RE:41320 クリップボード履歴を書き換えなNo.41337
秀まるお2 さん 11/09/01 17:53
 
 こちらで、秀丸エディタ64bit版+秀丸メール64bit版の両方とも最新βで
テストした限りは、うまくいってるような感じでした。

disablehistory 0x0040;
setclipboard "";
addclipboard "";
appendcopy;

 でやってもクリップボード履歴は書き換わらなかったのと、あと、

disablehistory 0x0040;
setclipboard "abc";

 とかやってみても、"abc"がクリップボードには入りませんでした。

 32bit版同士でも大丈夫でした。

 もしかして32bit版と64bit版の秀丸/秀丸メールを混在してるとダメですけど、
そういうことではないでしょうか。

 たしかに同じ32bit版同士/64bit版同士でダメでしたら、もっと詳しくテスト
してみます。

[ ]
RE:41337 クリップボード履歴を書き換えなNo.41344
秀まるお2 さん 11/09/01 22:32
 
> disablehistory 0x0040;
> setclipboard "abc";
>
>  とかやってみても、"abc"がクリップボードには入りませんでした。

 「クリップボード履歴には入りませんでした」の間違いでした。

[ ]
RE:41344 クリップボード履歴を書き換えなNo.41345
秀まるお2 さん 11/09/01 23:37
 
 っとテストしてたんですが、どうもタイミングによっては履歴に入ってしまう
ケースがありそうでした。

 setclipboard "abc";のような処理をしてすぐにマクロを終了すると、マクロ
を終了してからクリップボード履歴の通知が常駐秀丸に届く場合もあるようで、
そうすると履歴が残ってしまうようです。

 例えば、

    disablehistory 0x0040;
    setclipboard "abc";
    message "ウェイト";

 みたいなマクロでは履歴が残らないとしたら、そういう話ではないかと思いま
す。上記のように、setclipboardしてからマクロをすぐには終了させないような
例で一回試してみて、それで履歴が残るかどうか、すみませんが一回テストお願
いします。

 ただ、それで原因が特定出来たとしても、対策的には、「disablehistory
0x0040;」が実行された場合はマクロをすぐには終了させないようにわざと
ウェイトを入れるような対策しか無さそうな気はします。

[ ]
RE:41345 クリップボード履歴を書き換えなNo.41363
hajimet さん 11/09/02 18:16
 
いろいろとご検討頂きありがとうございました。
プログラミングは全くの素人なので
的外れな書き方をしていたかもしれませんが、
「履歴が残ってしまう」
ということではなくて、
「そもそもクリップボードが機能しなくなる
(クリップボードへの書き込み自体が抑制されてしまうようだ)」
ということなのです。

どこまで具体的に書けばいいのか分かりませんので、
大変冗長になるかもしれませんが、具体的に書きます。

以下が、件のレベルダウンにより機能しなくなったマクロです。
こちらは、機能するようになりました。
■■■■■■■■以下マクロ引用■■■■■■■■■■■■■■■■■
//以下クリップボード履歴対策
openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
#cliphistflag = getregnum( "ClipHistFlag" );
if( #cliphistflag ) {  //クリップボードの履歴をとる
    writeregnum "ClipHistFlag", #cliphistflag & 0xfff0;
    envchanged;
}
//以上クリップボード履歴対策 末尾にもあり

loaddll "TKInfo.dll";

#i = 0;//カウンタ
setclipboard "";//クリップボードを空にします
#n = dllfunc("LockSelection");
while( 1 ) {
    #n = dllfunc("EnumSelection", 1);//選択メールについて
    if( #n == 0 ) break;//メール選択されてないときは終わり
    #i = #i + 1;//カウンタを増やす
// 差出人情報取得
    $s = dllfuncstr("CurrentHeader", "From");
    $s = dllfuncstr( "FindBook2", $s);
    $s = dllfuncstr( "LeftStr", $s, 2);
//
    #n = dllfunc( "SelectPane", 2);//内容表示をアクティヴにし
    gofiletop;//ファイルの先頭から
    beginsel;//範囲選択を開始して
    searchdown2 "--"; //--までの文字列を
    if (result == 0) gofileend; //   --が無い場合は最終行までを
    addclipboard "\n■" + str(#i) + "■ 【" + $s + "】\n";
    appendcopy;//取得したメールの内容をクリップボードに追加
     #n = dllfunc( "SetMainWndTop" );
     #n = dllfunc( "SelectPane", 1);
}
#n = dllfunc("UnlockSelection", 0);
newfile;//新しいメールを開いて
#n = dllfunc("SwitchHeaderView", 0);
selectall;//本文を選択して
delete;//一旦削除して空にしてから

//以下クリップボード履歴対策
if( #cliphistflag ) {
    writeregnum "ClipHistFlag", #cliphistflag;
    envchanged;
}
closereg;
//以上クリップボード履歴対策

poppaste;//クリップボードに取得したデータを本文にペースト
replaceallfast "^>.*\\n", "", regular;//「>」で始まる行を削除
endmacro;
■■■■■■■■以上マクロ引用■■■■■■■■■■■■■■■■■
このマクロの欠点は、レジストリをいじることで、
ちょっと怖いです。そこで、
■■■■■■■■以下マクロ引用■■■■■■■■■■■■■■■■■
//以下クリップボード履歴対策
disablehistory 0x0040;
//以上クリップボード履歴対策 末尾にはなし

loaddll "TKInfo.dll";

#i = 0;//カウンタ
setclipboard "";//クリップボードを空にします
#n = dllfunc("LockSelection");
while( 1 ) {
    #n = dllfunc("EnumSelection", 1);//選択メールについて
    if( #n == 0 ) break;//メール選択されてないときは終わり
    #i = #i + 1;//カウンタを増やす
// 差出人情報取得
    $s = dllfuncstr("CurrentHeader", "From");
    $s = dllfuncstr( "FindBook2", $s);
    $s = dllfuncstr( "LeftStr", $s, 2);
//
    #n = dllfunc( "SelectPane", 2);//内容表示をアクティヴにし
    gofiletop;//ファイルの先頭から
    beginsel;//範囲選択を開始して
    searchdown2 "--"; //--までの文字列を
    if (result == 0) gofileend; //   --が無い場合は最終行までを
    addclipboard "\n■" + str(#i) + "■ 【" + $s + "】\n";
    appendcopy;//取得したメールの内容をクリップボードに追加
     #n = dllfunc( "SetMainWndTop" );
     #n = dllfunc( "SelectPane", 1);
}
#n = dllfunc("UnlockSelection", 0);
newfile;//新しいメールを開いて
#n = dllfunc("SwitchHeaderView", 0);
selectall;//本文を選択して
delete;//一旦削除して空にしてから

poppaste;//クリップボードに取得したデータを本文にペースト
replaceallfast "^>.*\\n", "", regular;//「>」で始まる行を削除
endmacro;
■■■■■■■■以上マクロ引用■■■■■■■■■■■■■■■■■
という風にしたら、上手くいくかと思ったのですが、
全く機能せず。
元々クリップボードに入っていたデータが
poppaste;
されるという始末です(なので、最後の履歴が消えてしまう)。

以上から、素人判断で
setclipboard "";
addclipboard "";
appendcopy;
の機能が停止しているようだ、と書かせて頂きました。

問題の箇所を特定するために、具体的に確認すべきやり方があれば、
ご指摘ください。よろしくご指導のほどお願いします。

[ ]
RE:41363 クリップボード履歴を書き換えなNo.41372
秀まるお2 さん 11/09/03 13:58
 
 マクロでやろうとしてることは、つまり、

   setclipboard "";
   addclipboard ...
   addclipboard ...

 のような処理をして何らかのデータをクリップボード上に作成して、それを最
終的に貼り付けしたいってことだと思います。だとしたら、単純に

   paste;

 で貼り付ければいいんじゃないでしょうか。

 poppasteというのは、「クリップボード履歴に残っている1つ前のデータを
クリップボードに入れて、それを貼りつける」のようなコマンドなので、せっか
くクリップボードにデータを作成しても、それは破棄されて履歴にある昔の
データが貼りつけられるのは当然の結果のような気がします。

 何か僕の方で勘違いしてたら申し訳ないですけども、たとえばサンプルマクロ
として、

disablehistory 0x0040;
setclipboard "";
addclipboard "abc";
addclipboard "xyz";
poppaste;
endmacro;

 ってのを作ってみました。それで、たとえば「12345」って文字列を書いて、
まずは「1」の1文字所を範囲選択してコピー、「2」を選択してコピー、・・・
とやっていて、クリップボード履歴を見た時に、

          5
          4
          3
          2
          1

 のようなデータが入った状態にしたとします。それでマクロを実行すると、
「5」が貼り付けられます。

 それはバグじゃなくて仕様になります。

 秀丸エディタでも秀丸メールでも同じ結果になります。

 ということで特にpoppasteの動作が間違ってることは無いと思います。

 今回の件は、つまり、マクロの中の「poppaste」としてる所を「paste」に書
き換えればそれでいいような気がします。

[ ]
RE:41372 クリップボード履歴を書き換えなNo.41373
秀まるお2 さん 11/09/03 14:11
 
 やっぱり僕の勘違いがありました。

 poppasteは、現在のクリップボード内容を貼りつけてから履歴を1つ前に戻る
はずなので、やはりsetclipboard/addclipboardで作成したデータが貼りつけら
れないとダメです。

 ですが、クリップボード履歴がOFFの状態だとそれが思ったようにいかないと
いうことで・・・

 ですが、これは一応、秀丸エディタも同じなので、そういうものみたいな気が
します。つまり、クリップボード履歴OFFの状態ではpoppasteはそもそもうまく
動かないもののような気がします。

 もうちょっと詳しくテストしてみます。

---------ちなみにテストしたマクロの例------

disablehistory 0x0040;
setclipboard "";
addclipboard "abc";
addclipboard "xyz";
poppaste;


 これを秀丸エディタで実行しても秀丸メールで実行しても、"abcxyz"は貼り付
けられないです。

[ ]
RE:41373 クリップボード履歴を書き換えなNo.41374
秀まるお2 さん 11/09/03 16:44
 
 ソースコードの見直しなどもしてみたんですが、どうもこれはこれで仕様のよ
うな気がします。

 poppasteというのは、やはり、「クリップボード履歴から1つ戻して貼り付
け」をするコマンドになってます。「今現在のクリップボード内容を貼りつけて
から履歴戻し」にはなってないです。

 クリップボード履歴の一番上には、普通は直前に「コピー」した内容がそのま
ま入っているはずなので、見かけ上は「現在のクリップボード内容を貼りつけて
から履歴戻し」のようになりますが、実際には履歴から戻す方が先になってます。

 なので、それを前提にマクロを作るとしたら、たとえば

disablehistory 0x0040;
setclipboard "";
addclipboard "abc";
disablehistory 0x0000;
addclipboard "xyz";
poppaste;


 のように、クリップボード履歴の禁止を一度解除してから最終的な
クリップボードの書き換え(上記例だとaddclipboard "xyz")を実行させて、そ
のあとpoppasteを実行する、という風にするしかないです。

 これはこれでそういう仕様だと思うんですが、念のため秀丸担当にもこういう
風になってるけどいいのか?ってことだけ聞いてみることにします。

[ ]
RE:41374 クリップボード履歴を書き換えなNo.41375
Iranoan さん 11/09/03 16:58
 
 秀まるおさん今日は、Iranoan です。
>  これはこれでそういう仕様だと思うんですが、念のため秀丸担当にもこういう
> 風になってるけどいいのか?ってことだけ聞いてみることにします。
 スレッドを読み直してみましたが、これで正しいはずです。
 貼り付けてから履歴を戻す機能の話は、過去
http://hidemaruo.dip.jp:81/hidesoft/hidesoft_2/x01442.html#1451
に有りましたので。

[ ]
RE:41375 クリップボード履歴を書き換えなNo.41377
hajimet さん 11/09/04 11:27
 
秀まるおさんIranoanさん
ありがとうございました

仕様の詳細や妥当性については私には分かりませんが、
とりあえず今回の問題は、
poppasteの動作手順を誤解していたことによる私の勘違いのようです

けがの功名(?)で、
disablehistory 0x0000;
という
disablehistoryをdisableする方法もご教示いただけましたので、
却って良かったように思っています
#もしかしたら、プログラミングの世界では、
 あまりに当然なのでヘルプ未記載なだけかも知れませんが

ということで、殆ど秀丸エディタのマクロの話になってしまいましたが、
いろいろとご検討いただきありがとうございました。

後日、マクロを整理し直して、何かあればまた、
書かせていただきます。

> 貼り付けてから履歴を戻す機能の話は、過去
>→http://hidemaruo.dip.jp:81/hidesoft/hidesoft_2/x01442.html#1451
>に有りましたので。

[ ]