選択範囲内の改行削除と【 】付加No.36628
柳絮 さん 18/06/10 15:36
 
いつもお世話になります。

ある文字列を選択しその前後を墨付括弧で括った上でその中にある改行をすべて削除
しようとしています。これを実現するにはスクリプトはどう書いたら良いでしょうか。
それぞれの動作は既に実現しているのですが2つの動作を同時に実現する方法がわか
らないのです。

たとえば
あいうえおかきくけこさしすせそ
という文字列でかきくけこを選択したところでこのスクリプトを動かすと
あいうえお【かきくけこ】さしすせそ
になるようにする方法は、以前ここでご教示いただきました。

この場合は範囲を選択したうえで
getsearch;
replaceall searchbuffer, "【" + searchbuffer + "】";
を実行すればいいのです。

また改行削除は
replaceall "\\n" , "" , regular, nocasesense, inselect, nohilight;
でいいと思うのです。



では選択範囲を【 】で括ると同時に途中の改行をすべて削除するにはどうした良い
でしょうか。
つまり

あいうえおかき



こさしすせそ

という文字列で「か」から「こ」までを改行を含めて選択すると
あいうえお【かきくけこ】さしすせそ
という文字列にしたいのです。

両者を組み合わせる方法がわかりません。ご教示いただければ幸いです。

柳絮

[ ]
RE:36628 選択範囲内の改行削除と【 】付No.36632
秀丸担当 さん 18/06/11 11:10
 

replaceallでinselectを使う場合は行単位になるということと、複数行は検索バッフ
ァに収まるかどうかわからないということもあるので、カーソルを範囲選択の先頭と
最後に移動して【】を挿入するほうが現実的になりそうです。
以下のようなマクロで一応できると思います。

setcompatiblemode 0x20000;
if( selecting != false && rectselecting == false ) {
  #line1=seltoplineno;
  #col1=seltopcolumn;
  #line2=selendlineno;
  #col2=selendcolumn;
  escape;
  moveto2 #col1,#line1;
  insert "【";
  if( #line1 == #line2 ) {
    #col2 = #col2 + 2;
  }
  moveto2 #col2,#line2;
  insert "】";
  #col2 = #col2 + 2;
  if( #line2 > #line1 ) {
    moveto2 1,#line2;
    beginsel;
    moveto2 1,#line1;
    endsel;
    replaceall "\\n", "",regular,inselect;
    moveto2 #col1,#line1;
  }
}


--------

ちなみにinselectの置換を使う場合は、行単位になるということと、最後の行の改行
も含まれるので、改行の扱いが面倒になります。
改行を扱う場合、今回は使ってないですが、部分編集(rangeeditin/rangeeditout)
を使ったほうがいい場合があります。

あと、参考までの情報として、範囲選択を文字単位で置換する場合は、カラーマー
カーを使う方法があります。
例えば範囲選択を文字単位で"a"を"b"に置換するマクロは以下のような感じになりま
す。
setcompatiblemode 0x20000;
disabledraw;
deletecolormarkerall;
colormarker -1,-1,0,0,0;
settargetcolormarker "";
replaceallfast "a", "b", incolormarker;
deletecolormarkerall;
endmacro;

[ ]
RE:36632 選択範囲内の改行削除と【 】付No.36633
柳絮 さん 18/06/11 14:13
 
秀丸担当様

いつも有難う御座います。
出来ました。
早速のご対応に感謝しています。

参考のカラーマーカーは、以前お教えいただいて重宝しています。


[ ]
RE:36633 選択範囲内の改行削除と【 】付No.36635
山紫水明 さん 18/06/11 21:38
 
 柳絮さん,

 すでに解決されたようですが,次のようなやり方もあるようです。
// ---------------------------------------------------------------
if( selecting == 0 || rectselecting ) endmacro;
$s = gettext( seltopx, seltopy, selendx, selendy, 1 );
loaddll "hmJre.dll";
$s = dllfuncstr( "ReplaceRegular", "\r\n", $s, 0, "", 2 );
insert "【" + $s + "】";
freedll;
endmacro;
// ---------------------------------------------------------------

                    山紫水明

[ ]