○第93回目 QXマクロの紹介(その4)
※QXマクロは、QXエディタ(テキストエディタ)で使用されるマクロのことです。
QXマクロでは、全角スペースはデーター以外は認められていません。コピーして使う場合は、必ず半角スペースに変えてください。
機能の拡張から根本的な改良
1.前の文が短すぎて、入力で指定した位置に文字がない(本来は入力誤り)、カーソルの位置に文字がない(本来は指定誤り)の場合の処理が一つ考えられます。
2.コピーもとの文字列を、直前の行だけでなく、当該行、直後の行も指定できる。更に、直前直後の行ではなく離れた行も指定できる、ということも考えられます。
本質的な機能は後者です。前者は注意して入力すれば回避できますから。
後者は、行の指定ですので、これまでは一行前だったので、最初の行のマイナス1でしたが、ここを変えればいいのです。最初の行を0として、前はプラスの数値、あとはマイナスの数値としていますので、
前回の中で、
『前の行の全文字列取得は、
@Line = @CrLineToScrLine(y_begin-1) '論理行から物理行への変換
b$ = @TextCr$(@Line)』
としていましたが、(y_begin-1)の"1"を、入力したものにすればいいのです。
これで終了です。
簡単すぎてばかばかしいほどです。
この機能を使って作業をしていますと、やはりこれもあれもということになっていきます。そして現時点の最終形は、最も簡単(マクロ構造上)なものに集約されてしまいました。
基本的な違いは、カーソルの動きを主にしたことと、移動も加えたことです。
前者の意味は、コピー元をカーソルを動かして先頭も最後も決定するということです。すべてカーソルを動かすのではなく、おおよその行の位置を入力します。入力値は第一次のカーソルの移動という意味合いとなります。その後にコピー元を決定しますので、間違った行であってもいいのです。(移動はコピーの変形なので詳細は省略)
マクロの流れを追っていきます。
1.カーソルの場所、行を取得する。最終的にはここに貼り付けます。
2.およその行の入力。(移動の場合は頭に"*"をつけます)
3.指定された行へカーソルを移動。横の位置は最初の位置のままとします。
4.矢印キー等でコピー文の最初と最後を選択。選択はEnterとSpaceキーを使います。 矢印キーの外には、Home、End、PageUp、PageDown、Tab(単語単位左へ)、BackSpace(単語単位右へ)が使えます。
5.コピー文をクリップボードに貼り付ける。(移動の場合は削除してクリップボードに張り付ける、ということが異なる)
6.元の場所に戻ってクリップボードから貼り付け。
1.カーソルの場所、行を取得する。
'カーソル行及び場所(バイト数)を記憶
y_begin = @ScrLineToCrLine(@Line) '物理行から論理行への変換
p1=@BytePosCr
2.およその行の入力。(移動の場合は頭に"*"をつけます)
入力値は、コピーの場合は、2、-2、移動の場合は*2、*-2。2は2行上、-2は2行下
(入力値がヌルの場合は、コピー機能・当該行の選択とします)
初期値は0、コピー機能・当該行の選択としました。
msg$ = "おおよその行を入力してください。移動の場合は頭に"*"をつける"
kubun$ = inputbox$(msg$,"QX32 指定文字列のコピー・移動","0")
if kubun$ = "" then
kubun$ = "1"
p3 = 0
else
p2 = instr(kubun$,"*")
if p2 = 0 then
p3 = val(kubun$)
kubun$ = "1"
ELSE
p3 = val(mid$(kubun$,p2+1))
kubun$ = "2"
end if
end if
3.指定された行へカーソルを移動。横の位置は最初の位置のままとします。
'カーソルの大まかな移動
@Line = @CrLineToScrLine(y_begin-p3)
@BytePosCr=p1
4.矢印キー等でコピー文の最初と最後を選択。選択はENTERとSpaceキーを使います。 矢印キーの外には、Home、End、PageUp、PageDown、Tab(単語単位左へ)、BackSpace(単語単位右へ)が使えます。
4-1.使用するキーの指定
'キーの設定
call iskeypressed(KEY_RETURN)
call iskeypressed(KEY_SPACE)
call iskeypressed(KEY_PRIOR) '行を上に画面単位で移動
call iskeypressed(KEY_NEXT) '行を下に画面単位で移動
call iskeypressed(KEY_LEFT) '左矢印キー
call iskeypressed(KEY_UP) '上矢印キー
call iskeypressed(KEY_RIGHT) '右矢印キー
call iskeypressed(KEY_DOWN) '下矢印キー
call iskeypressed(KEY_END) '文末
call iskeypressed(KEY_HOME) '文頭
call iskeypressed(KEY_TAB) '単語単位に左に移動
call iskeypressed(KEY_BACK) '単語単位に右に移動
4-2.押されたキーによってカーソルを動かすなど
押されたキーによって処理をする。
マクロ中ですので通常のキー操作が効きませんので、押されたキーをもとにキー操作をマクロで作ります。
確定は2回行ないますので、その区分をするためにフラッグを立てます。1回目は選択開始、2回目は選択の終了で、doループを抜け出して次の処理へ行きます。Spaceキーで文字を変換する操作になれているので、EnterキーのほかにSpaceキーでも可能としました。
基本的には無限ループなので、CPUが使いっぱなしなってしまいます。途中に動きを止める命令(_sleep(50))を入れています。50とは1000分の50秒のことです。
if文の後にあるコマンドは、QXマクロでのキー操作コマンドです。@MoveRightCharはカーソルを右に動かすコマンドです。
flag = 0
do
call _sleep(50)
if iskeypressed(KEY_RETURN) or iskeypressed(KEY_SPACE) then
if flag=1 then exit do
flag=1
@BlockSelect
elseIf iskeypressed(KEY_PRIOR) then
@ScrollUpHalfPage
elseif iskeypressed(KEY_NEXT) then
@ScrollDownHalfPage
elseif iskeypressed(KEY_LEFT) then
@MoveLeftChar
elseif iskeypressed(KEY_UP) then
@MoveUpChar
elseif iskeypressed(KEY_RIGHT) then
@MoveRightChar
elseif iskeypressed(KEY_DOWN) then
@MoveDownChar
【以下略】
end if
loop while 1
5.コピー文をクリップボードに貼り付ける。(移動の場合は削除してクリップボードに張り付ける、ということが異なる)
コピーか移動かはkubun$で判断します。
'指定範囲をクリップボードへ、クリックからコピー
if kubun$ = "1" then
@BlockClipboardCopy
else
@BlockClipboardCut
end if
6.元の場所に戻ってクリップボードから貼り付け。
@Line = @CrLineToScrLine(y_begin)
@BytePosCr=p1
@BlockClipboardPaste
※比較
通常の操作(カーソルは貼り付けたい場所にある状態から。コピーもとが五行上にあったとする)
1.カーソルを五行上に移動
2.カーソルをコピー文の先頭に移動
3.シフトを押しながらカーソルをコピー文の最後に移動
4.Ctrl+Cでクリップボードへ
5.カーソルを貼り付けたい場所に戻す。1と2の操作
6.Ctrl+Vでクリップボードから貼り付け
このマクロによる操作
1.マクロの起動。TAB+1の2タッチ
2.パラメータの入力。5と入力。
3.入力値の確定。Enterキーを押す
4.カーソルをコピー文の先頭に移動しEnterキーを押す
5.カーソルをコピー文の最後に移動しEnterキーを押す
共通部分を除いてみます。
通常の操作
1.カーソルを五行上に移動
3.シフトを押しながら
4.Ctrl+Cでクリップボードへ
5.カーソルを貼り付けたい場所に戻す。1と2の操作
6.Ctrl+Vでクリップボードから貼り付け
このマクロによる操作
1.マクロの起動。TAB+1の2タッチ
2.パラメータの入力。5と入力。
3.入力値の確定。Enterキーを押す
4.Enterキーを押す
5.Enterキーを押す
Ctrl+C、Ctrl+Vを2タッチとし、同数のキー操作を削除すると残るのは、
通常の操作
1.カーソルを五行上に移動
3.シフトを押しながら
5.カーソルを貼り付けたい場所に戻す。1と2の操作
このマクロによる操作
4.Enterキーを押す
5.Enterキーを押す
通常操作では、1の操作が不要な場合もありますのでこの分を差し引いて、このマクロの効果としては、おおむね通常の操作の3、5が省略されるということといえます。
※掲載までの間での修正
行数の入力をやめて、"3"を押すことによって3行移動させました。他の行数は面倒なので設定していません。
2.パラメータの入力。5と入力。
3.確定。Enterキーを押す
の箇所が、
3と上矢印と上矢印となります。キータッチとしては一つ増えました。また、下への場合は"-"を押す必要があるので、2タッチの増加です。しかしながら、感覚的に見て、こっちのほうがやりやすいようです。
上矢印を5回押すよりも、3回(3と上矢印と上矢印)のほうが早いという主張です。
質問
なぜ3回なのか。=⇒PageUpでは7行動きます。真ん中で3か4かと考え、後は適当に3に決めました。
3だけでなく、4、5、6も対象にしたらどうか。=⇒取り入れてみましょうか。1-9まで可能とします。

0 件のコメント:
コメントを投稿