クリップボード履歴とenvchangedの仕様にNo.05899
緒方聡 さん 08/09/28 14:03
 
お世話になってます。
クリップボード履歴とenvchangedの動作と仕様について質問します。

行いたいことは、
・マクロ内でクリップボードを使用する
・ただし、クリップボード履歴にごみを残したくない
です。

いろいろ試してみていくつかハードルがあるのですが、最初につまづいているのは以
下の動作です。

1. クリップボード履歴を取る設定を見る
2. 取る設定になってたら一時的に取らないようにする
3. マクロからクリップボードを使う
4. 設定を元に戻す

このマクロで期待する動作は、3 のクリップボードの内容がクリップボード履歴に残
らないことなのですが、4 で設定を元に戻すとクリップボードに履歴が残ってしまい
ます。

そこで質問です。

Q1. クリップボード履歴を使用する設定にすると、そのタイミングでクリップボード
の中を見て履歴に加えるような動作になっているような感じですが、この動作は仕様
通りでしょうか?

Q2. マクロで使用したクリップボードの内容をクリップボード履歴に残さないように
したいのですが、どのようにすればよいでしょうか?

以下は再現マクロです。
よろしくお願いいたします。

----
// 1. クリップボード履歴を取る設定を見る
openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
#ClipHistFlag = getregnum("ClipHistFlag");
closereg;

// 2. 取る設定になってたら一時的に取らないようにする
if (#ClipHistFlag & 0x01) {
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "ClipHistFlag", #ClipHistFlag ^ 0x01;
    closereg;
    envchanged;
}

/. 3. マクロからクリップボードを使う
selectall;
copy;

// 4. 設定を元に戻す
if (#ClipHistFlag & 0x01) {
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "ClipHistFlag", #ClipHistFlag;
    closereg;
    envchanged;
}

[ ]
RE:05899 クリップボード履歴とenvchangedNo.05900
秀丸担当 さん 08/09/29 10:06
 

>Q1. クリップボード履歴を使用する設定にすると、そのタイミングでクリップボード
>の中を見て履歴に加えるような動作になっているような感じですが、この動作は仕様
>通りでしょうか?

これは、仕様ということになります。

>Q2. マクロで使用したクリップボードの内容をクリップボード履歴に残さないように
>したいのですが、どのようにすればよいでしょうか?

考えてみましたが、クリップボード履歴には常に最新のクリップボード内容が先
頭に来るようになっているので、難しいようです。

サンプルのマクロでは、コピーした内容がマクロ終了後も残るようですが、もし
そういう意味ではなく、マクロ実行前の内容に戻したいということであれば、以
下のようにしてみてはどうでしょうか。

setclipboard "";

// 4. 設定を元に戻す
if (#ClipHistFlag & 0x01) {
    openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
    writeregnum "ClipHistFlag", #ClipHistFlag;
    closereg;
    envchanged;
    getcliphist 0;
}

クリップボード履歴がONの場合は、元に戻ると思います。
OFFの場合は、getclipboardを行数ぶんだけ呼んで複数行のクリップボード内容
をつなげてから setclipboard すると戻せるかもしれません。

次期バージョンでは、disablehistoty文というのを作って各ヒストリを無効化す
ることもできるようになる予定です。

[ ]
RE:05900 クリップボード履歴とenvchangedNo.05901
緒方聡 さん 08/09/29 19:43
 
>サンプルのマクロでは、コピーした内容がマクロ終了後も残るようですが、もし
>そういう意味ではなく、マクロ実行前の内容に戻したいということであれば、以
>下のようにしてみてはどうでしょうか。

そういうことです。
実は、もっと欲があって、テキスト以外のデータ(例えば画面のキャプチャ)がクリ
ップボードにあっても、元に戻したいんです。

そのために実際は DLL を使っています。

1. DLL を初期化
2. DLL で現在のクリップボードをバックアップ
3. マクロでクリップボードを使用する
4. DLL でバックアップしたクリップボードを元に戻す
5. DLL を開放

こうすることで、画面キャプチャがクリップボードにあっても、それが失われること
はありません。

ただ、どうしてもクリップボード履歴の設定を戻したときに、履歴に現在のクリップ
ボードの内容が入ってしまうのが「副作用」としてあったので質問させてもらいまし
た。

clearcliphist はクリップボード履歴画面の「全消去」ボタンに相当しますが、「消
去」ボタンに相当する機能があれば、、、よかったんですけど。


>次期バージョンでは、disablehistoty文というのを作って各ヒストリを無効化す
>ることもできるようになる予定です。

この文はどういう動作をするのでしょうか?

[ ]
RE:05901 クリップボード履歴とenvchangedNo.05902
秀丸担当 さん 08/09/30 10:54
 

>この文はどういう動作をするのでしょうか?

各ヒストリを記録しないようにする文の予定です。
例えばクリップボード履歴を記録しないようにします。
copy;すると、クリップボード履歴には残らないですが、クリップボードには作
業の残骸が残ることになってしまいます。

clearcliphistで「消去」に相当する方法も検討したいと思います。

[ ]