[ 新規に投稿する ]

Enterキーによるフラグ判定No.08761
ゆら さん 18/09/01 16:38 [ コメントを投稿する ]
  初めてマクロを作成しています。
特定の記号の後ろで改行すると、記号の位置まで自動でインデントする自動起動型のマクロを作りたいと思っています。

例えば、
aaaaa●zzzzz/zzzzz
という文があったとします。aとzは適当な文字、●は改行でインデントさせたい記号、/は改行したい位置です。
この文を/で改行すると、
aaaaa●zzzzz
       zzzzz
と、なるようにしたいのです。

Enterキーを押すことで改行したかどうかのフラグを判定しているのですが、Enterキーを押しても何の反応も帰ってきません。
そもそもEnterキーには反応しない仕組みなのでしょうか。
もしそうならば、違う方法でフラグ判定する方法はありますか。
皆様の知恵をお貸しください。よろしくお願いします。

以下に現在作成中のマクロを載せます。
動作確認のために余計なメッセージ文を入れていますが無視して下さい。


//**********************************************************
// 箇条書きでよく使用する記号が改行位置の前にある場合、
// 改行すると記号の後ろに自動でインデントするマクロ
//**********************************************************

call SearchItemizeMark;

  if (##return >= 1) {
  call LocateLineTopX; ##x_linetop = ##return + 2;
  call FragInsertReturn;

    if(##return == 1) {
    call SpaceLineTop ##x_linetop; }

  }

endmacro;


//**********************************************************
// キャレットがある行、かつ、キャレットより前に
// 一覧の記号があるか探すサブルーチン
//**********************************************************
SearchItemizeMark:

// 範囲選択中であれば何もしない
if (selecting == 1) return;

//**********************************************************
// 箇条書きでよく使用する記号(全角のみ)のコード一覧
//**********************************************************
#I_M[0] = 0x8144;  //.
#I_M[1] = 0x8145;  //・
#I_M[2] = 0x8146;  //:
#I_M[3] = 0x816A;  //)
#I_M[4] = 0x819B;  //○
#I_M[5] = 0x819C;  //●
#I_M[6] = 0x81A6;  //※
#I_M[7] = 0x8740;  //@
#I_M[8] = 0x8741;  //A
#I_M[9] = 0x8742;  //B
#I_M[10] = 0x8743;  //C
#I_M[11] = 0x8744;  //D
#I_M[12] = 0x8745;  //E
#I_M[13] = 0x8746;  //F
#I_M[14] = 0x8747;  //G
#I_M[15] = 0x8748;  //H
#I_M[16] = 0x8749;  //I
//**********************************************************

// 検索する範囲
$$S_line = gettext(0,y,x,y);

// 一覧内の記号があるか検索する
##IM_count = 0; ##IM_number = 0;
while (##IM_number <= 16) {

  $$S_letter = char(#I_M[##IM_number]);
  ##yes_no = strstr($$S_line,$$S_letter);

    if (##yes_no != -1) {##IM_count = ##IM_count + 1;}

  ##IM_number = ##IM_number + 1;
}

return ##IM_count;


//**********************************************************
// 改行した時に行頭になるx座標を決めるサブルーチン
//**********************************************************
LocateLineTopX:

##x = 0; ##x_now = x; ##y_now = y;
##x_IM = -1;

// キャレットより前の文字を1文字ずつ確認する
while (##x < ##x_now) {

  // 全角文字
  $$L_letter = gettext(##x,##y_now,##x + 2,##y_now);
  if (ascii($$L_letter) > 0x00FF) {

    // 記号があるか確認する
    ##IM_number = 0;
    while (##IM_number <= 16) {
      if ($$L_letter == char(#I_M[##IM_number])) {
      ##x_IM = ##x;
      message "!あるよ!\nX座標は" + str(##x_IM);  //確認用
      return ##x_IM; }
    ##IM_number = ##IM_number + 1; }
    ##x = ##x + 2; }

  // 半角文字
  else {
  $$L_letter = gettext(##x,##y,##x + 1,##y);
  ##x = ##x + 1; }

}

return;


//**********************************************************
// 改行したかどうかを確認するサブルーチン
//**********************************************************
FragInsertReturn:

// Enterキーのキーコード
##Enter_key = 0x000D;

// ##frag = 0 なら無効、1なら有効
##frag = 0;
if (iskeydown(##Enter_key) == 1) {##frag = 1;}

message "frag=" + str(##frag);
return ##frag;


//**********************************************************
// 改行した次の行に空白を挿入するサブルーチン
// ##1=挿入する空白の数
//**********************************************************
SpaceLineTop:

##s_length = ##1;

message "移行OK\n" + "空白数は" + str(##s_length);  //確認用

$$string = ""; $$space = " ";

##x = 1;
while (##x <= ##s_length) {
  $$string = $$string + $$space;
  ##x = ##x + 1;
}

insert $$string;
return;

[ ]
RE:08761 Enterキーによるフラグ判定No.08762
ヒラメ さん 18/09/01 22:04 [ コメントを投稿する ]
  こんにちは。秀丸エディタの一ユーザーです。

マクロをEnterキーへの割り当て用に少しいじってみました。変更しているのは13・15・137行目辺りと、デバッグ用のメッセージ表示をコメントアウトした部分です。これでどうでしょうか。


//**********************************************************
// 箇条書きでよく使用する記号が改行位置の前にある場合、
// 改行すると記号の後ろに自動でインデントするマクロ
//**********************************************************

call SearchItemizeMark;

  if (##return >= 1) {
  call LocateLineTopX; ##x_linetop = ##return + 2;
  call FragInsertReturn;

    if(##return == 1) {
    call SpaceLineTop ##x_linetop; }else{insertreturn;} //else以降追加

  }else{insertreturn;} //else以降追加

endmacro;


//**********************************************************
// キャレットがある行、かつ、キャレットより前に
// 一覧の記号があるか探すサブルーチン
//**********************************************************
SearchItemizeMark:

// 範囲選択中であれば何もしない
if (selecting == 1) return;

//**********************************************************
// 箇条書きでよく使用する記号(全角のみ)のコード一覧
//**********************************************************
#I_M[0] = 0x8144;  //.
#I_M[1] = 0x8145;  //・
#I_M[2] = 0x8146;  //:
#I_M[3] = 0x816A;  //)
#I_M[4] = 0x819B;  //○
#I_M[5] = 0x819C;  //●
#I_M[6] = 0x81A6;  //※
#I_M[7] = 0x8740;  //@
#I_M[8] = 0x8741;  //A
#I_M[9] = 0x8742;  //B
#I_M[10] = 0x8743;  //C
#I_M[11] = 0x8744;  //D
#I_M[12] = 0x8745;  //E
#I_M[13] = 0x8746;  //F
#I_M[14] = 0x8747;  //G
#I_M[15] = 0x8748;  //H
#I_M[16] = 0x8749;  //I
//**********************************************************

// 検索する範囲
$$S_line = gettext(0,y,x,y);

// 一覧内の記号があるか検索する
##IM_count = 0; ##IM_number = 0;
while (##IM_number <= 16) {

  $$S_letter = char(#I_M[##IM_number]);
  ##yes_no = strstr($$S_line,$$S_letter);

    if (##yes_no != -1) {##IM_count = ##IM_count + 1;}

  ##IM_number = ##IM_number + 1;
}

return ##IM_count;


//**********************************************************
// 改行した時に行頭になるx座標を決めるサブルーチン
//**********************************************************
LocateLineTopX:

##x = 0; ##x_now = x; ##y_now = y;
##x_IM = -1;

// キャレットより前の文字を1文字ずつ確認する
while (##x < ##x_now) {

  // 全角文字
  $$L_letter = gettext(##x,##y_now,##x + 2,##y_now);
  if (ascii($$L_letter) > 0x00FF) {

    // 記号があるか確認する
    ##IM_number = 0;
    while (##IM_number <= 16) {
      if ($$L_letter == char(#I_M[##IM_number])) {
      ##x_IM = ##x;
      //message "!あるよ!\nX座標は" + str(##x_IM);  //確認用
      return ##x_IM; }
    ##IM_number = ##IM_number + 1; }
    ##x = ##x + 2; }

  // 半角文字
  else {
  $$L_letter = gettext(##x,##y,##x + 1,##y);
  ##x = ##x + 1; }

}

return;


//**********************************************************
// 改行したかどうかを確認するサブルーチン
//**********************************************************
FragInsertReturn:

// Enterキーのキーコード
##Enter_key = 0x000D;

// ##frag = 0 なら無効、1なら有効
##frag = 0;
if (iskeydown(##Enter_key) == 1) {##frag = 1;}

//message "frag=" + str(##frag);
return ##frag;


//**********************************************************
// 改行した次の行に空白を挿入するサブルーチン
// ##1=挿入する空白の数
//**********************************************************
SpaceLineTop:

##s_length = ##1;

//message "移行OK\n" + "空白数は" + str(##s_length);  //確認用

$$string = ""; $$space = " ";

##x = 1;
while (##x <= ##s_length) {
  $$string = $$string + $$space;
  ##x = ##x + 1;
}
insert "\n"; //追加
insert $$string;
return;
[ ]
RE:08762 Enterキーによるフラグ判定No.08763
ヒラメ さん 18/09/02 02:24 [ コメントを投稿する ]
  こんにちは。

Enterキーへの割り当てで動作させるということでいいのであれば、こちらの方が短くて使いやすいかもしれません。よろしければ試してみてください。



//**********************************************************
// 箇条書きでよく使用する記号が改行位置の前にある場合、
// 改行すると記号の後ろに自動でインデントするマクロ
//**********************************************************


//**********************************************************
// 箇条書きでよく使用する記号(半角/全角)
//**********************************************************
$I_M = ".・:)○●※@ABCDEFGHI";
//**********************************************************


call SearchItemizeMark;
if (##return >= 1) {
  call RepeatString " ", ##return;
  disabledraw; begingroupundo;
  insert "\n";
  insert $$return;
  endgroupundo; enabledraw;
}else{
  //インデント対象外
  //insert "\n"; //改行を1個入力
  insertreturn; //普通のEnterキーの処理
}
endmacro;


//**********************************************************
// キャレットがある行、かつ、キャレットより前に
// 一覧の記号があるか探すサブルーチン
//**********************************************************
SearchItemizeMark:
// 範囲選択中であれば何もしない
if(selecting == 1) return;

// 検索する範囲
//$$S_line = gettext(0,y,x,y); //折り返しを考慮しない
$$S_line = gettext2(0,lineno,column,lineno); //折り返しを考慮する

// 一覧内の記号があるか検索する
##IM_number = 0;
while(wcsmidstr($I_M, ##IM_number, 1) != ""){
  $$S_letter = wcsmidstr($I_M, ##IM_number, 1);
  ##yes_no = strstr($$S_line,$$S_letter);
  //見つかった場合はインデントの位置を返す
  if(##yes_no != -1) return ##yes_no + strlen($$S_letter);

  ##IM_number = ##IM_number + 1;
}
return;


//**********************************************************
// $$1 を ##2 回繰り返した文字列を返すサブルーチン
//**********************************************************
RepeatString:
if(($$1!="")&&(##2>0)){while(##i<##2){$$s=$$s+$$1;##i=##i+1;}}
return $$s;
[ ]
RE:08763 Enterキーによるフラグ判定No.08764
ゆら さん 18/09/02 10:11 [ コメントを投稿する ]
  ヒラメさん

回答ありがとうございます。
提案して頂いた2つの案を試したのですが、両方とも上手く動きませんでした。
どちらの案もその場で使う分には問題なく動きます。
しかし、最初の投稿で書いた通り「自動起動型の」マクロを書きたいと思っているので、その条件で動かすと動かないようです。

わざわざ2つも提案して頂いて申し訳ないです。
[ ]
RE:08764 Enterキーによるフラグ判定No.08765
ヒラメ さん 18/09/02 12:12 [ コメントを投稿する ]
  こんにちは。

「自動起動-編集後タイマー」用に改造してみました。遅延は0msにしないと動作しません。こちらよければお試しください。



//**********************************************************
// 箇条書きでよく使用する記号が改行位置の前にある場合、
// 改行すると記号の後ろに自動でインデントするマクロ
//**********************************************************


//**********************************************************
// 箇条書きでよく使用する記号(半角/全角)
//**********************************************************
$I_M = ".・:)○●※@ABCDEFGHI";
//**********************************************************

if((event==5) && (geteventparam(1)==1)){ //編集後タイマー&改行による編集
  call SearchItemizeMark;
  if (##return >= 1) {
    call RepeatString " ", ##return-x;
    insert $$return;
  }
}
endmacro;


//**********************************************************
// キャレットがある行、かつ、キャレットより前に
// 一覧の記号があるか探すサブルーチン
//**********************************************************
SearchItemizeMark:
// 範囲選択中であれば何もしない
if(selecting == 1) return;

// 検索する範囲
//$$S_line = gettext(0,y-1,9999,y-1); //折り返しを考慮しない
$$S_line = gettext2(0,lineno-1,9999,lineno-1); //折り返しを考慮する

// 一覧内の記号があるか検索する
##IM_number = 0;
while(wcsmidstr($I_M, ##IM_number, 1) != ""){
  $$S_letter = wcsmidstr($I_M, ##IM_number, 1);
  ##yes_no = strstr($$S_line,$$S_letter);
  //見つかった場合はインデントの位置を返す
  if(##yes_no != -1) return ##yes_no + strlen($$S_letter);

  ##IM_number = ##IM_number + 1;
}
return;


//**********************************************************
// $$1 を ##2 回繰り返した文字列を返すサブルーチン
//**********************************************************
RepeatString:
if(($$1!="")&&(##2>0)){while(##i<##2){$$s=$$s+$$1;##i=##i+1;}}
return $$s;
[ ]
RE:08765 Enterキーによるフラグ判定No.08766
ゆら さん 18/09/02 15:45 [ コメントを投稿する ]
  ヒラメさん

>こんにちは。
>
>「自動起動-編集後タイマー」用に改造してみました。遅延は0msにしないと動作しません。こちらよければお試しください。


こちらは上手く動きました。まさしく頭で描いた通りの動きでした。
こちらを参考に少し自分用に手を加えたいと思います。

本当にありがとうございました!
[ ]

[ 新規に投稿する ]