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・1
5・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にしないと動作し
>ません。こちらよければお試しください。


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

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

[ ]