選択範囲のみマクロを実行する方法No.10090
石田 さん 23/03/02 05:15
 
10年以上前に初めて作ったマクロを今も重宝して使っています。当時の Word 文書は
改行後の論理行頭は
ソフト的に一字下げをしており、秀丸にコピーすると「行頭天付き」ファイルになる
ため、全角空白を一個入れて
字下げするマクロです。replaceallfast を使っているので、ファイル全体を置換し
ますが、マウスで範囲選択
した箇所のみマクロを実行するためにはどんな「文」が必要になるのでしょうか。
マクロ中に少し時代遅れの \\f も使っていますが、これを @ で記すやり方も教え
て貰えたら幸いです。
---
title "―― ●マクロ実行中";
setcompatiblemode 0x20000;
replaceallfast "^[  \\t]+$" , "" , regular;
replaceallfast "^[ ]+" , "" , regular;
replaceallfast "^\\f[^ ○§「◎『〈・[(<「■([◆★●※―〔【〒-][^$]" , "
 \\1" , regular;
   message "字下げ総数は" +str(result)+ "個です。";
  gofiletop;
endmacro;

[ ]
RE:10090 選択範囲のみマクロを実行する方No.10091
秀丸担当 さん 23/03/02 11:25
 
範囲選択のみを対象にする方法は幾つかあるのですが、まずは普通の操作として行う
としたら、秀丸エディタヘルプ(マクロヘルプでない)の
[目次]→[コマンド]→[検索系コマンド]→[いろいろな検索例]→[特定の範囲内だけ
で検索したい場合]
のところに説明があります。
マクロの場合、これらの操作と同等の文として書くといいです。

選択した範囲を使う方法は、replaceallfastのパラメータのinselectで行単位、inse
lect2で文字単位にできます。
replaceallfastをすると選択が解除されるので、もう一度するには、selectinselect
([範囲内検索を選択]コマンド相当)を使います。

setcompatiblemode 0x20000;
disabledraw;
if(selecting){
  replaceallfast "A","B",inselect2;
  selectinselect;
  replaceallfast "C","D",inselect2;
  selectinselect;
}
endmacro;

部分編集を使う方法は、rangeeditin、rangeeditoutを使います。行単位のみです。
今回の例の場合、行単位だと思うので、これが一番簡単かもしれません。

setcompatiblemode 0x2000C;//0x000C=部分編集を使う
disabledraw;
if(selecting){
  rangeeditin;
  replaceallfast "A","B";
  replaceallfast "C","D";
  rangeeditout;
}
endmacro;

カラーマーカーを使う場合は、incolormarkerを使います。
手動操作の場合は手数が多くて面倒ですが、マクロにすると文字単位にできて、いち
いち選択し直さなても対象を維持できるのでやりやすい場合があります。

setcompatiblemode 0x20000;
//disabledraw;
if(selecting){
  colormarker "#F00","#FF0", -1, 0, 0, "mylayer";
  escape;
  message "色を付けました";
  settargetcolormarker "mylayer";
  replaceallfast "A","B", incolormarker;
  replaceallfast "C","D", incolormarker;
  message "置換しました";
  deletecolormarkerall "mylayer";
  message "色を消しました";
}
endmacro;

このあたりの例を、秀丸エディタヘルプだけでなく、マクロヘルプのほうにもあった
ほうがよさそうなので書いておこうと思います。

文字列で@""の書き方を使うと、\でエスケープせずにそのまま"\\t"を@"\t"のように
書けます。
ただしダブルクォーテーション「"」そのものはそのまま書けないです。

\fの書き方を使わないようにするには、区切ごとに()でくくって、それを\1、\2…と
するといいです。
@"ABC\fDEF", @"\1"
だったとしたら、
@"(ABC)(DEF)", @"\2"
といった感じです。

まとめると、以下のような感じになります。(inselect2の場合)

title "―― ●マクロ実行中";
disabledraw;
setcompatiblemode 0x20000;
if( selecting ) {
  message "範囲選択を処理します。";
  #x=seltopx;
  #y=seltopy;
  replaceallfast @"^[  \t]+$" , @"" , regular, inselect2;
  selectinselect; //再度inselect2
  replaceallfast @"^[ ]+" , @"" , regular, inselect2;
 selectinselect; //再度inselect2
 replaceallfast @"(^)([^ ○§「◎『〈・[(<「■([◆★●※―〔【〒-][^$])"
 , @" \2" , regular, inselect2;
  escapeinselect; //inselect2状態を解除
     message "字下げ総数は" +str(result)+ "個です。";
    moveto #x,  #y;
  endmacro;
}
message "ファイル全体を処理します。";
//ここに従来の処理
endmacro;

[ ]
RE:10091 選択範囲のみマクロを実行する方No.10092
秀丸担当 さん 23/03/02 11:30
 
すみません、最後の例が、マクロ上でテストして全角空白が入ったものになってしま
っていました。正しくは以下の通りです。

title "―― ●マクロ実行中";
disabledraw;
setcompatiblemode 0x20000;
if( selecting ) {
  message "範囲選択を処理します。";
  #x=seltopx;
  #y=seltopy;
  replaceallfast @"^[  \t]+$" , @"" , regular, inselect2;
  selectinselect; //再度inselect2
  replaceallfast @"^[ ]+" , @"" , regular, inselect2;
  selectinselect; //再度inselect2
  replaceallfast @"(^)([^ ○§「◎『〈・[(<「■([◆★●※―〔【〒-][^$])"
 , @" \2" , regular, inselect2;
  escapeinselect; //inselect2状態を解除
     message "字下げ総数は" +str(result)+ "個です。";
    moveto #x,  #y;
  endmacro;
}
message "ファイル全体を処理します。";
//ここに従来の処理
endmacro;

[ ]
RE:10092 選択範囲のみマクロを実行する方No.10093
石田 さん 23/03/03 01:24
 
うまくいきました。

三千行ほどのテキストで試してみました。
マクロを試作した当時はまだ Word 文書の FD 入稿もありましたが、今はエディタで
書いて FTP 入稿がメインです。ただ、行頭インデントを使っていない執筆者もいる
ので、このマクロは欠かせません。

また、昔から「ワープロ一太郎」で書いて、「ファイル→送信」でテキストファイル
にして FTP 入稿する重要顧客もいます。ワープロのセンタリング、右寄せ≠ネん
て組版ソフトでは意味が無いのですが…。

※ 秀丸ヘルプの方も見てみます。
(追 記)
β1で、右クリックで、ブックマークやマーク一覧が手元に表示出来るようになり、
より便利になりました。

※ 感謝します。

[ ]