クリップボード履歴を順繰りに表示する方No.04971
いちる さん 05/12/18 04:21
 
はじめまして。いちると言います。
ずっと自分で考えていて、全く解決策が思いつかないので、よろしければぜひ教えて
ください。

以下のような動きをするマクロを作ろうと考えています。

1.クリップボードの一番最新の履歴に「あ」、次の履歴に「い」、最後の履歴に
「う」と入っている。
2.「ういあ」と表示する。

上記を実現するために、ヘルプと格闘しながら、以下のようなマクロを書きました。

// ここから↓
beginclipboardread;

#i = 0;

while (#i != 3) {
 $a[#i] = getclipboard;  //配列$a[0]に「あ」、$a[1]に「い」、$a[2]に「う」と
入り、$a[3]になった時点でwhileが終了することを想定
 #i = #i + 1;
 }

#i = 0;

while (#i != 3) {
 $b = $a[#i];  //配列をいったん変数に代入してから表示
 insert $b;
 #i = #i + 1;
 }
// ここまで↑

しかし、実行結果は…以下が表示されます。

//ここから↓
beginclipboardread;

#i = 0;
//ここまで↑

なんで!? これマクロの中身じゃん!
何故なのでしょう? ずっと考えていたのですが、どうしてもわかりません…

[ ]
RE:04971 クリップボード履歴を順繰りに表No.04972
いちる さん 05/12/18 04:37
 
いちるです。今クリップボード履歴をまっさらにして、

最新:あ
1つ前:い
2つ前:う

だけにしてマクロを実行してみたら、「あ」だけが表示されました。

いずれにしても、なぜ思ったとおりに動かないのか、判りません…

[ ]
RE:04972 クリップボード履歴を順繰りに表No.04973
山紫水明 さん 05/12/18 08:42
 
 いちるさん,こんにちは。

 クリップボードの履歴から取り出すためには,getcliphist を使う必要があり
ます。
「クリップボードの履歴をとる」に設定してありますよね。
getclipboard は履歴の中の1行分を取り出します。(一つの履歴が複数行の場
合はそれなりの処理が必要になります。)
次のようにしてみてください。

// ここから↓
#i = 0;
while (#i != 3) {
    getcliphist #i;
    beginclipboardread;
    $a[#i] = getclipboard;
    #i = #i + 1;
}
#i = 0;

while (#i != 3) {
    $b = $a[#i];  //配列をいったん変数に代入してから表示
    insert $b;
    #i = #i + 1;
}
endmacro;
// ここまで↑

なお,
    $b = $a[#i];  //配列をいったん変数に代入してから表示
    insert $b;
の2行は
    insert $a[#i];
と書いてもいいでしょう。

     では, (^^)/~
                                        山紫水明(ユーザー)
                                        SANSHISUIMEI

[ ]
RE:04973 クリップボード履歴を順繰りに表No.04974
いちる さん 05/12/18 18:09
 
山紫さん

こんにちは!

おしえていただいたマクロで実現できました! ありがとうございます。
ところで、マクロ中少しわからないところがあります。

>    getcliphist #i;
>    beginclipboardread;
>    $a[#i] = getclipboard;

ここなのですが、「getcliphist」を、僕は以下のように解釈していました。

●最新のクリップボード履歴は0、1個前が1、2個前が2…
●「getcliphist 1;」を実行すると、1に入っているクリップボード履歴が0に来る

上記の仕様が正しいとすると、「getcliphist 1;」を実行したとたん、今まで0だっ
たものが1になり、1だったものが2になり…となると思っていました。

実際、クリップボード履歴で、最新が「あ」次が「い」最後が「う」の状態で、以下
のマクロを実行すると、「いいあ」と表示されます。

//ここから↓
getcliphist 1;
paste;
getcliphist 0;
paste;
getcliphist 1;
paste;
//ここまで↑

しかし山紫さんのマクロだと、getcliphistを実行しても、クリップボード内の順番
は変わっていないようです。
なぜでしょう?




> クリップボードの履歴から取り出すためには,getcliphist を使う必要があり
>ます。
>「クリップボードの履歴をとる」に設定してありますよね。
>getclipboard は履歴の中の1行分を取り出します。(一つの履歴が複数行の場
>合はそれなりの処理が必要になります。)
>次のようにしてみてください。
>
>// ここから↓
>#i = 0;
>while (#i != 3) {
>    getcliphist #i;
>    beginclipboardread;
>    $a[#i] = getclipboard;
>    #i = #i + 1;
>}
>#i = 0;
>
>while (#i != 3) {
>    $b = $a[#i];  //配列をいったん変数に代入してから表示
>    insert $b;
>    #i = #i + 1;
>}
>endmacro;
>// ここまで↑
>
>なお,
>    $b = $a[#i];  //配列をいったん変数に代入してから表示
>    insert $b;
>の2行は
>    insert $a[#i];
>と書いてもいいでしょう。
>
>     では, (^^)/~
>                                        山紫水明(ユーザー)
>                                        SANSHISUIMEI

[ ]
RE:04974 クリップボード履歴を順繰りに表No.04975
山紫水明 さん 05/12/18 21:39
 
 いちるさん,

>「getcliphist」を、僕は以下のように解釈していました。
>●最新のクリップボード履歴は0、1個前が1、2個前が2…
>●「getcliphist 1;」を実行すると、1に入っているクリップボード履歴が0に来る

 「クリップボード履歴」コマンドを実行してダイアログを出し,そこで「取り
出し」を実行します。(「取り出しと同時に貼り付け」にチェックしておいた方
がわかりやすいでしょう)
 これでやっても履歴自体は変わっていないことがわかります。

>//ここから↓
>getcliphist 1;
>paste;
>getcliphist 0;
>paste;
>getcliphist 1;
>paste;
>//ここまで↑

 これを実行すると,「いあい」となると思ったのですが,
たしかにおっしゃるように「いいあ」となりますね。
 これを全部,
getcliphist 0;
にして実行すると
「あああ」となります。
これはいいのですが,実は全部を
getcliphist 1;
にすると,「いいい」となると思ったのですが,実際には,
「いあい」
となってしまいます。マクロ文の paste は「取り出して貼り付け」とは対応し
ていないのかもしれませんね。私もよくわかりません。

 識者の方,あるいは秀丸担当さんにコメントをお願いしたいと思います。

# 本題とは関係ないのですが,引用は必要最小限にして,全文引用は避けた方
がいいと思います。
         では, (^^)/~
                                        山紫水明
                                        SANSHISUIMEI

[ ]
RE:04975 クリップボード履歴を順繰りに表No.04981
秀丸担当 さん 05/12/19 11:18
 

確認してみたところ、クリップボード履歴から取り出したときも、getcliphist
をしたときも、履歴の順番は入れ替わっていると思うのですがどうでしょう?

山紫水明さんが最初に示されたマクロでも、履歴の順番は入れ替わっていると思
います。

クリップボード履歴の順番が
「あ」「い」「う」

となっているとき、山紫水明さんの示されたマクロでは、
#i = 0のときのgetcliphist #i;で、
「あ」「い」「う」
#i = 1のときのgetcliphist #i;で、
「い」「あ」「う」
#i = 2のときのgetcliphist #i;で、
「う」「い」「あ」

で、結果は「あ」「い」「う」という順番は得られますが、実行後のクリップ
ボード履歴の順番は逆の順番になっていると思います。

[ ]
RE:04981 クリップボード履歴を順繰りに表No.04982
山紫水明 さん 05/12/19 20:19
 
 秀丸担当さん,

>確認してみたところ、クリップボード履歴から取り出したときも、getcliphist
>をしたときも、履歴の順番は入れ替わっていると思うのですがどうでしょう?

 そのとおりでした。完全に見誤っていました。
 自分でライブラリに出している「クリップボードの履歴の並べ替え & まとめ
て貼り付けるマクロ」もこの性質を利用してつくっていたのに,何とも間の抜け
た話でした。

 いちるさん,

>●最新のクリップボード履歴は0、1個前が1、2個前が2…
>●「getcliphist 1;」を実行すると、1に入っているクリップボード履歴が0に来る
 この理解でまちがいありませんでした。申し訳ありません。。
 秀丸担当さんの説明でもうご理解頂けたと思いますが,お示し頂いた例でいい
ますと,

getcliphist 1; //ここで「い」が先頭に来て「いあう」となる。
paste;         //「い」を貼り付ける
getcliphist 0;ここで「あ」が先頭に来て「あいう」となる。
paste;         //「あ」を貼り付ける
getcliphist 1;ここで「い」が先頭に来て「いあう」となる。
paste;         //「い」を貼り付ける

で正しい動作でした。

私のマクロで言いますと,
getcliphist #i;        // i 番目の履歴を先頭におく。
beginclipboardread;
$a[#i] = getclipboard; //先頭に置かれた履歴から1行から分取り出す。
という動きになります。

     では, (^^)/~
                                        山紫水明
                                        SANSHISUIMEI

[ ]