poppaste の動き、考察ですね ...No.01442
番頭++ さん 98/07/28 10:14
 
紛らわしい発言をしてきたのでまとめておきます。ただし poppaste に興味のな
い方はこの発言を読まない事をお勧めします、余計に「紛らわしく」なってきま
す。

ヘルプには、「貼り付け+履歴戻し」にこの様な説明があります。

> 貼り付けを実行してからクリップボード履歴をひとつ前に戻します。このコマ
>ンドは,「コピー」または「切り抜き」コマンドを連続して実行することとセッ
>トで利用することを想定しています。

> 例えば,あるファイルの中から必要とする各部分だけを別のファイルに移動さ
>せたい場合に,まず「切り抜き」コマンドを連続実行して最初に全部切り抜いて
>しまい,あとで「貼り付け+履歴戻し」コマンドを連続実行すればまとめて移動
>することができます。

なるほど便利な操作です。VZ の頃はスタック的な考えだった記憶があります。

これをマクロで可能にするのが、poppaste みたいです。マクロの考え(世界)で
はクリップボードの履歴は 0 から n-1 個あります。 0 からなんです、通常に
「クリップボードの履歴」を見ると 1 から n 個あります。

copy, cut, setclipboard 等はクリップボードにデータを入れると同時に、クリ
ップボードの履歴 0 にもデータを入れます。クリップボード履歴のプッシュ
(push) も行ないます。つまりこれらの処理では、クリップボードと履歴 0 は同
期が取れていることになります。

poppaste を実行すると、「貼り付けと履歴戻し」の操作が行われますが、履歴
戻しは履歴 0 からクリップボードに対しても行われます。cut 等を数回繰り返
した後の poppaste 実行後は、クリップボードと履歴 0 は同期が取れていない
ことになります。

明示的に getcliphist 0; で同期を取ることも可能です。同じデータを、その後
は paste しないこと(目的)が前提です。マクロの作者の思惑でコードする事に
なります。

今回、あちきの勘違いは、pop とは以前のデータを取り戻すと思い込んだことで
す。poppaste の機能後は、その paste のデータを保持すべきでしょう。当たり
前の仕様です。ですから pop clip hist (n) & paste のような動きとなります。

次の(操作) poppaste または paste を考慮して、同期が一つずれるんです。
あちきは、こんな仕様だと理解しています ...

[ ]
RE:01442 poppaste の動き、考察ですね ..No.01444
セキセイニャンコ さん 98/07/28 12:57
 
番頭++ さん、いつもお世話になります m(_ _)m

番頭++ さんのご発言が、どうも私には理解できないようです。
行きがかり上^^;、もう少しご説明頂けると、たいへんありがたいの
ですが... m(_ _)m

ええと、逆に、私の現状の理解では、この問題は単に秀丸の単純な
バグと思っています。回避方法は複雑ですし、現象は少々混乱して
いますが、バグであるということ自体は単純なことのように思われる
のです。

試しにクリップボード履歴の「消去」で、先頭のものを消去してみて
下さい。この操作を行っても、貼り付け操作で貼り付くのは、消去
した筈の文字列です。これは、マクロの仕様としての強引な理解は
不可能なことではないかと感じます。

なお、履歴の取り出しや貼り付け+履歴戻しは、期待の動作を行い
ます(クリップボード履歴と操作で貼り付く文字列は一致している)。
マクロの場合には逆に poppaste(貼り付け+履歴戻し)で問題が
起きるわけで、事情は逆ですが、クリップボード履歴で表示される
状態と、実際に貼り付けられる文字列の不一致という点は同じです。

[ ]
RE:01444 poppaste の動き、考察ですね ..No.01445
番頭++ さん 98/07/28 15:16
 
VZ の編集をご存知でしょうか、(言語の)ソースの並べ替え(編集)は削除(Del.)
によるスタックへの push と挿入(Ins.)による pop で行なっていました。これ
に慣れてしまうと「秀丸エディタ」とか Windows の cut & paste によるソース
の並べ替えには違和感を感じました、私はそうでした。

ここで言う push, pop は一般的なコンピュータ用語のスタックオペレーション
です。

クリップボードの履歴が何時、いつどのような経緯で出来たのかは分かりません
が。クリップボードの履歴をスタックに見立てて並べ替えを行ないたいと考える
と、cut; でデータを push することになります。ところが「秀丸エディタ」に
は VZ の挿入(Ins.)の機能はありません。Windows の標準は cut & pasteです。
挿入(Ins.)はスタックからデータを pop しながら挿入を繰り返します。ところ
が paste; には、再度 paste; できる、言い換えれば、履歴を残すと言う
Windows の標準化が付きまといます。

もし誰かが VZ のような並べ替えの機能を希望したら、(その根拠は RE1442 の
ヘルプを見て下さい) 何らかの新しい操作を作ることになります。「貼り付け+
履歴戻し」がその機能ではないかと思いました。poppaste; はそのマクロでしょ
う。「秀丸エディタ」の機能はキーに割り当てる単一操作になっています。

その poppaste; はこんな動きに見えてきます。cut; はクリップボードの履歴を
push してクリップボード及び履歴 0 にデータをいれる、poppaste; はクリップ
ボード履歴を pop して、クリップボードからデータを paste; する。履歴 0 を
クリップボードにいれた後で paste; しているように見えてきます。これにより
同じデータを paste; 出来ると言う標準化も保たれ、次の poppaste; への準備
も出来たことになります。==> test41.mac を参照

ただこの時点で、履歴 0 とクリップボードは不一致と言う矛盾が出てきます。

getcliphist 0; で同期を取るとは push を完了して、履歴 0 とクリップボード
の内容を一致させることになるわけです。

// test1.mac // original. RE:01418
clearcliphist;
setclipboard "1"; setclipboard "2"; setclipboard "3";
gofileend;
poppaste;
getcliphist 0; // add. RE:01421 同期をとる。==> clipboard に複写
beginclipboardread;
$str = getclipboard;
message $str;
showcliphist;
endmacro;

次のマクロを実行すると、

// test41.mac
clearcliphist;
setclipboard "1"; setclipboard "2";
clearcliphist;
// この時点ではクリップボードだけは 2
// 履歴 0 は 無し
// 履歴 1 は 無し
gofileend;
paste; // 2 がクリップボードから paste; される
poppaste; // 何も paste; されない、クリップボードは空になる
message str(result); // 1 ???
endmacro;

と言うことは poppaste; は pop cliphist アンド paste; に似ている。
この結果は操作でも同じです。

マクロだけを考えると popcliphist; と paste; でもよいのですが、
「秀丸エディタ」の機能はキーに割り当てる単一操作になっています。
そうでないと不便でしょう。

履歴 0 は poppaste; の連続操作に使われるワークエリアにも見えてきます。

paste; は再度実行しても同じデータを paste; する義務があります。
poppaste; は連続操作に耐える義務があります。次 poppaste; の準備が必要です。
履歴 0 とクリップボードの矛盾はここでおきます。

バグと言えばその様な気がしますが、
「仕様」だと言われると返す言葉がありません。


p.s. クリップボードにゴミが入るのは、以前あちきも経験しましたが再現出来
ません。これが何のバグなのか判らない状況です。


[ ]
RE:01445 poppaste の動き、考察ですね ..No.01446
セキセイニャンコ さん 98/07/28 16:56
 
番頭++さん、こんにちは。早速のコメント、ありがとうございます。

番頭++さんのおしゃることは、一応理解できたように思います。
同じことかどうか自信がありませんが、おかげさまで私も poppaste の
動作に、ある思い込みをしていたことに気づきました。

>今回、あちきの勘違いは、pop とは以前のデータを取り戻すと思い込んだことで
>す。poppaste の機能後は、その paste のデータを保持すべきでしょう。当たり
>前の仕様です。ですから pop clip hist (n) & paste のような動きとなります。

私も、poppaste というのは、クリップボードをスタックと見立てた場合、
そのスタックトップを paste すると同時に、スタックポインタを動かして
paste した 内容自体はクリップボードから捨て去るのだと思っていました。

ところが、キー操作で試してみるとそうではなくて、poppaste した内容は
依然クリップボードに残っていて(でも履歴からは消えている)、もう一度
poppaste してはじめて捨てられるもののようです。

paste の連続、あるいは poppaste の連続の操作をしている限り、どちらでも
変わりはないのですが、これらを混在して使用すると違いが出るわけですね。

ただ、番頭++さんは、それをそれでも仕様であると理解を示しておられますが、
少なくとも私には信じられない仕様です。ことによると、Windows API 側にも
遠因があるのかもしれませんが、少なくとも、クリップボードの最大の用途は
カット&ペーストのためのものですから、クリップボード履歴の先頭の内容と
いうのは、貼り付け及びマクロの paste した時に出てくるものでなければ
なりません。これがずれる場合があるというのは、まず、バグであると言って
良いと思います。

また、その点を除いてもけっして良い仕様ではありませんね。

しかし、特にマクロに関する部分では、仕様を変えようとすると従来との互換を
失うわけですから、容易には変えられないことは理解できます。poppaste を
現状の仕様で置いておかねばならないならば、せめて pastepop(paste してから
pop する、即ちスタックトップは捨て去る)を用意して頂きたいものです。なお
マクロに関しては本当はそれよりも、単に pop だけの方が有用だと思います。

[ ]
RE:01446 poppaste の動き、考察ですね .No.01451
秀丸担当 さん 98/07/30 18:40
 
poppasteの件ですが、仕様はやはり現状どおりということにさせてください。
pastepop追加は検討しておきます。


[ ]