BOX範囲選択のコピーを挿入したいNo.31773
hawk-eye さん 12/11/11 08:46
 
Windows XP Pro SP3
秀丸エディタ Version 8.21 使用

BOX範囲選択でコピーしたものを、既存の行に貼り付けた場合、
(貼り付け先にEOFがある場合は足りない行数だけ改行されるけれども、)
改行されずに既存の行に潜り込む形で貼り付けられますが、
そうではなく、既存の行が改行されて
BOX範囲選択でコピーしたもの挿入するようにできないでしょうか?

例えば、1行目〜20行目まで何か書かれたファイルがある場合、
縦は6行分、横は7カラム分をどこかでBOX範囲選択でコピーしたものを
このファイルの10行目と11行目の間に挿入したいとして、
カーソルを11行目に持ってきて、マウスの右ボタンで「挿入」を選んだら、
BOX範囲選択でコピーしたものが11行目〜16行目に挿入され、
既存の11行目〜20行目が17行目以降にずれるようにしたいという事です。

既に標準機能にあるのかどうか、また、マクロで出来るのかどうか分かりませんでし
たが、現状で出来るのでしょうか?
標準機能にないのであれば、すぐでなくても良いですけど標準機能で欲しい気がしま
す。

よろしくお願い致します。

以上

[ ]
RE:31773 BOX範囲選択のコピーを挿入したNo.31774
hawk-eye さん 12/11/11 08:58
 
既存の行を改行して欲しいというよりも、
BOX範囲選択でコピーしたものの各行の最後に「挿入」時に改行コードを入れて欲し
い、という方が正しいのかもしれません。

[ ]
RE:31773 BOX範囲選択のコピーを挿入したNo.31775
山紫水明 さん 12/11/11 15:48
 
 hawk-eyeさん,

>既存の行が改行されて
>BOX範囲選択でコピーしたもの挿入するようにできないでしょうか?

 他にも方法があるかもしれませんが,次のマクロでお試しください。

//----------------------------------------------//
#handle1 = hidemaruhandle(0);
openfile "/h";
#handle2 = hidemaruhandle(0);
paste;
#line = linecount;
selectall;
setactivehidemaru #handle1;
golinetop;
while( #line ) {
    insertfix "\n";
    #line = #line - 1;
}
paste;
closehidemaruforced #handle2;
endmacro;
//----------------------------------------------//

                          山紫水明
                          SANSHISUIMEI

[ ]
RE:31775 BOX範囲選択のコピーを挿入したNo.31776
山紫水明 さん 12/11/11 18:15
 
hawk-eyeさん,

こちらの方が速そうです。
//------------------------------------------//
if( getclipboardinfo( 1 ) == 0 ) {
    message "BOX選択ではありません。";
    endmacro;
}
beginclipboardread;
$a = getclipboard;
$s = $a;
while( $a != "" ) {
    $a = getclipboard;
    $s = $s + $a;
}
golinetop;
insert $s;
endmacro;
//-----------------------------------------//

                          山紫水明
                          SANSHISUIMEI

[ ]
RE:31776 BOX範囲選択のコピーを挿入したNo.31777
hawk-eye さん 12/11/11 19:05
 
山紫水明さん

両方確認させて頂きました。
二つ目の方が仰る通り速かったですし、
一つ目と違って「やり直し」をした場合に一度で元に戻って便利でした。

もし、秀丸エディタの標準機能に取り込むとしたら、
カーソルが途中のカラムにある場合に実行したらどうするか
検討する必要があるかもしれませんが、
用途としては、このマクロの実行結果しかないはずなので
必要十分でした。

ありがとうございました。

[ ]
RE:31773 BOX範囲選択のコピーを挿入したNo.31781
A1 さん 12/11/12 21:23
 

(直前の投稿をミスった)A1 と申します。

>BOX範囲選択でコピーしたもの挿入するようにできないでしょうか?

既に解決されたようですが、以下のマクロはどうでしょう。

----↓-- normal_paste.mac --------------------------------------
    addclipboard "";    // 追加(BOX 選択であったことを忘れる)
    paste;      // BOX の貼り付けにならない(行が挿入される)
----↑----------------------------------------------------------

(余談)

秀丸は標準で「貼り付け」と「BOX 貼り付け」の機能を持っていますが、
「貼り付け」は直前の選択が BOX 選択だったかどうかで自動判別するため、
BOX 選択でのコピーを「普通に」ペーストできません。

「(強制的な)非 BOX 貼り付け」機能があればよいのですが。
ちょっと見当たらないようです。

上のマクロは Ver.5xx 時代に見つけた裏ワザ(の改造)で、
クリップボード変更を伴う操作により、「BOX 選択」の状態が
リセットされる現象を利用しています。(既出かも)

副作用として、マクロ実行後のペーストも「非 BOX 貼り付け」になります。
改めて BOX 状にペーストしたい場合は明示的に「BOX 貼り付け」を選ぶことになり
ます。

では。

[ ]
RE:31781 BOX範囲選択のコピーを挿入したNo.31782
秀丸担当 さん 12/11/13 09:15
 

>    addclipboard "";    // 追加(BOX 選択であったことを忘れる)
>    paste;      // BOX の貼り付けにならない(行が挿入される)

補足させていただきますと、確かにaddclipboardをするとBOX選択によるコピー
であることの情報は消去されるようになっていました。
そのためこの方法で非BOXとしての貼り付けが可能でした。
マクロヘルプのaddclipboardのところにも消去されるということを追記させてい
ただきます。

[ ]
RE:31781 BOX範囲選択のコピーを挿入したNo.31783
hawk-eye さん 12/11/13 12:36
 
A1さん

確認させて頂きました。
ありがとうございました。

[ ]
RE:31782 BOX範囲選択のコピーを挿入したNo.31784
hawk-eye さん 12/11/13 12:38
 
標準機能には入らなさそうな感じですし、
既にマクロを作って頂いているので現状でも満足していますが、
ふと思いついた事があるので、ついでに書かせて頂きます。

普通に「貼り付け」をした場合に、
コピーされているものがBOX選択でないなら、そのまま貼り付けを行い、
コピーされているものがBOX選択なら、ダイアログを出して、改行コードを付加する
かどうかを選択する
という方が、先日書いたものより良いかと思いました。

動作環境の設定で、このダイアログを出すかどうか、ダイアログを出さない場合に改
行コードを付加するかどうかなど、設定できると良いのかもしれません。

以上

[ ]
RE:31784 BOX範囲選択のコピーを挿入したNo.31785
秀丸担当 さん 12/11/13 13:40
 

標準でできる方法もあったらいいということでネタにさせていただきます。
ダイアログとして選択できるようになっていると動作がわかりやすくていいと思
います。

参考までの情報として、現状でマクロを使わずやるとしたら、いったん新規作成
した秀丸エディタに貼り付けてから再度コピーするか、addclipboardの応用では
Shiftを押しながら→,←と入力して[編集]→[追加コピー]とすると一応可能で
した。

[ ]
RE:31784 BOX範囲選択のコピーを挿入したNo.31786
山紫水明 さん 12/11/13 17:12
 
 hawk-eyeさん,

>コピーされているものがBOX選択でないなら、そのまま貼り付けを行い、コピー
>されているものがBOX選択なら、ダイアログを出して、改行コードを付加するか
>どうかを選択する

 こんな感じでしょうか。

//-----------------------------------------//
if( getclipboardinfo( 1 ) == 0 ) {
    paste;
} else {
    menu "&1 通常のBOX貼り付け",
         "&2 各行に改行を付加";
    if( result == 1 ) {
        pasterect;
    } else if( result == 2 ) {
        beginclipboardread;
        $a = getclipboard;
        $s = $a;
        while( $a != "" ) {
            $a = getclipboard;
            $s = $s + $a;
        }
        golinetop;
        insert $s;
    }
}
endmacro;
//-----------------------------------------//

                          山紫水明
                          SANSHISUIMEI

[ ]
RE:31781 BOX範囲選択のコピーを挿入したNo.31787
山紫水明 さん 12/11/13 17:17
 
 A1さん,

>上のマクロは Ver.5xx 時代に見つけた裏ワザ(の改造)で、
>クリップボード変更を伴う操作により、「BOX 選択」の状態が
>リセットされる現象を利用しています。(既出かも)

 なるほどすごい裏技ですね。
 貼り付けた後,元にもどす裏技があれば完璧ですが。

                          山紫水明
                          SANSHISUIMEI

[ ]
RE:31786 BOX範囲選択のコピーを挿入したNo.31788
hawk-eye さん 12/11/13 19:34
 
山紫水明さん

度々すみません。確認させて頂きました。

Ctrl+V にキーを割り当てて、試してみましたが、
良い操作性でした。

ありがとうございました。

[ ]
RE:31785 BOX範囲選択のコピーを挿入したNo.31789
A1 さん 12/11/15 01:43
 

A1です。こちらにぶら下げます。

<秀丸担当 さん #31785>

>ダイアログとして選択できるようになっていると動作がわかりやすくていいと思
>います。

はい。ネタということでお願いします。

 ※個人的には、現「BOX 貼り付け」同様の強制型も推したいところですが…

>Shiftを押しながら→,←と入力して[編集]→[追加コピー]とすると一応可能でした。

元々の「裏ワザ」は丁度↑のようなものでした。手作業に対応するマクロとして、

 同じ場所で beginsel; endsel; (幅ゼロで選択) の後 appendcopy;

ということをやっていました。

<hawk-eye さん #31774> を見て思い出し、
addclipboard ""; に置き換えたので、以前からこの挙動だったかは不明でした。

テストの結果、appendcopy と同じ挙動でそのまま使えると判断して投稿しました。
しかし「現状の秀丸の動作に依存する」点はやはり「裏ワザ」なので、
もし仕様ならば公式に明示していただけると有難いです。その点

<秀丸担当 さん #31782>
>マクロヘルプのaddclipboardのところにも消去されるということを追記させてい
>ただきます。

は助かりました。(お手間を増やしてしまいますが) appendcopy についてもお願い
します。

では。

(以下参考)

以下は新規ファイル中で「幅ゼロの選択→コピー※→追加コピー」を行なったときの
動作例です。
「貼り付け」はせずに getclipboardinfo(n) で内部的な扱いを参照しています。

    ※copy2 を用いたのは選択範囲をクリアしないためです(手抜き)

----↓- 実行結果 -------------------------------------------------
TN,TN, 通常-appendcopy
TB,TN, BOX -appendcopy
TN,0N, 通常-addclip(空白)
TB,0N, BOX -addclip(空白)
TN,TN, 通常-addclip(文字有)
TB,TN, BOX -addclip(文字有)
----↑------------------------------------------------------------

copy2 直後はいずれも選択状態(通常/BOX)を反映してますが、
追加コピー後は (appendcopy/addclipboard 共に)いかなる場合で
あっても、BOX 選択状態がクリアされています("N"/"B" → "N" になる)。

また幅ゼロのコピーであるにもかかわらず、 copy2 の後は
「クリップボードにテキスト有り("T")」と認識していますが、
addclipboard "" の場合に限り、追加コピー後に「テキスト無し("0")」に
されています(3−4行目)。

    ※ここには書きませんが、(本来の用法通り)幅のある文字列を
    選択した状態から始めれば、全て「テキスト有り("T")」になります。

念のため、 addclipboard "a" と空でない文字列を渡してみると、
「テキスト有り("T")」になります。…って当然ですね(5-6行目)。

どうも(addclipboard の結果)クリップボードが空文字列になることに対して、
なんらかの最適化が働いているようです。

以下はテストコードです。

----↓- test.mac -------------------------------------------------
newfile;
$I = "";
beginsel;   endsel; copy2;  call L; appendcopy;       call L " 通常-appendco
py\n";
beginrect;  endsel; copy2;  call L; appendcopy;       call L " BOX -appendco
py\n";
beginsel;   endsel; copy2;  call L; addclipboard "";  call L " 通常-addclip
(空白)\n";
beginrect;  endsel; copy2;  call L; addclipboard "";  call L " BOX -addclip
(空白)\n";
beginsel;   endsel; copy2;  call L; addclipboard "a"; call L " 通常-addclip
(文字有)\n";
beginrect;  endsel; copy2;  call L; addclipboard "a"; call L " BOX -addclip
(文字有)\n";

insert $I;
clearupdated;
endmacro;

L:
    $$s = midstr("0T*", getclipboardinfo(0), 1);    // テキストの有無
    $$c = midstr("NB*", getclipboardinfo(1), 1);    // 通常/BOX選択
    $I = $I + $$s + $$c + ","+ $$1;
    return;
----↑------------------------------------------------------------

[ ]
RE:31789 BOX範囲選択のコピーを挿入したNo.31790
秀丸担当 さん 12/11/15 10:18
 

appendcopyのヘルプにも追記しておきます。

appendcopy,addclipboardの挙動としては、どちらもいったんBOX情報を含めたク
リップボード内容を全てクリアしてから再設定しています。

結果が空のときの違いを調べてみたら、addclipboardのほうはsetclipboard "";
としたときと同じということになり、setclipboard "";をしたときは設定せずに
消去するのみとしてありました。
setclipboard "";としたときに消去されるのもヘルプに書いておきます。

appendcopyのほうは、空の文字列であっても空の文字列を設定していました。
appendcopyのほうを仕様とするのは微妙なところですが、ソースを見る限りでは
敢えてそういう挙動になるように作られていたので、下手にいじるのはやめてお
こうと思います。

[ ]
RE:31790 BOX範囲選択のコピーを挿入したNo.31798
A1 さん 12/11/17 04:58
 

A1です。

>appendcopyのヘルプにも追記しておきます。

8.30Beta9 のヘルプにて確認しました。
ありがとうございました。

[ ]