文字列の行移動のマクロについてNo.00753
Gavo さん 99/09/25 17:04
 
 Gavoです。みなさんこんにちは。

 先日、リターンキーで選択範囲を取り込むには、inputposを使うと教えていただき
ましたので、下のような文字列行移動のマクロを書いてみました。

 しかし、escapeキーを押しても中止できず、1度目で削除されて2度押し目で同じ
位置に貼り付けられます。escapeキーの1度押しで中止したいのですが。

 また、範囲が選択されていない場合には、マクロを中止してクリップボードを書き
換えないようにしたいのですが、8行目のendmacroが動作していないようです。

 また、左右の矢印キーを押すと、実際(最終)の選択範囲と画面上の選択範囲とが
一致しなくなります。画面上の選択範囲が行単位となるようにするか、左右の矢印
キーを効かないようにする方法を教えてください。

 ワープロなどでよくある機能ですが、どのようにしてよいのか分かりません。
よろしくお願いします。

//−−−−−−−−文字列の行移動−−−−−−−−−−−
golinetop;
beginsel;
down;
inputpos "移動範囲選択後リターン";
golinetop;
title 0;
if (!selecting) endmacro;
cut;
inputpos "移動先は?";
golinetop;
paste;
endmacro;
//−−−−−−−−−−−−−−−−−−−−−−−−−−

[ ]
RE:00753 文字列の行移動のマクロについNo.00754
大森鉄工所 さん 99/09/25 21:26
 
まず、マクロを使わなくても、
1) 選択開始行で左トリプルクリックしたまま放さずに(トリプルドラッグ?)
    選択終了行までマウスカーソルを移動して放す。
2) 選択範囲内でドラッグしたまま、移動先の行頭にドロップする。
で、クリップボードを使わずに、同様の編集ができます。

inputposが中止されたかどうかは、直後の resultの値で判別します。

Gavoさんのマクロは、こんな風に変えたらご希望の動作に近くなると思います。
    #x = x; #y = y;
    golinetop2;
    beginsel;
    movetolineno 1, lineno + 1;
    call s1, "移動範囲選択後リターン";
    if( ##return ){
        escape;
        moveto #x, #y;
    } else {
        cut;
        call s1, "移動先は?";
        #r = ##return;
        poppaste; getcliphist 0;
        if( #r ){
            undo; undo;
            moveto #x, #y;
        }
    }
endmacro;
s1:
    while( 1 ){
        ##i = inputchar( $$1 );
        if( ##i == 0x1F ) call s2, 1;
        else if( ##i == 0x1D ) call s2, -1;
        else if( ##i == 0x0D ) return no;
        else if( ##i == 0x1B ) return yes;
    }
s2:
    movetolineno 1, lineno + ##1;
    if( selecting && seltopy == selendy ){
        movetolineno 1, lineno - ##1;
        beginsel;
        movetolineno 1, lineno + ##1 * 2;
    }
return;

[ ]
RE:00754 文字列の行移動のマクロについNo.00762
Gavo さん 99/10/03 12:16
 

大森鉄工所さん、ありがとうございました。
 DOS時代の新松にあったような、画面上における
行単位で移動するものを考えていたので、大森鉄工所
さんのマクロを参考にして作ってみましたが、もとの
移動マクロの方が使い易そうだと思って、このまま使
わせていだだくことにしました。

[ ]