マクロを作って見ましたNo.03380
KOBO さん 02/09/18 20:59
 
お世話になります

さて、全くの初心者です。見よう見まねでマクロを作ってみました。

案の定動作しません。

ご多忙のところ申し訳ないのですが、アドバイスいただきたくお願い

いたします。

処理内容
 @をAに整形する
   33202933 5GHz送信部 (5GHz TX).ppt 二つに分離させる
  行の長さは千差万別で、後尾の .ppt"></A> は共通です。

@<A href="F-sv10/top/workphase/presentation/330/5GHz/33202933 5GHz送信部 (5
GHz TX).ppt"></A>

A<A href="F-sv10/top/workphase/presentation/330/5GHz/33202933.ppt">5GHz送信
部 (5GHz TX)</A>

マクロ内容
//---------------
disabledraw;
gofiletop;
while (code != -1) {
 golineend2;    // 行末へ移動
 moveto x-11,y; // 11個左へカーソル移動
 label1:
 $letter="??";    // カーソル位置の文字取込
 if $letter<>"/" then goto label2; // とBASIC調に書きたい
     #L=#L+1;     // 文字数数え
     left;    // 左へカーソル移動
 goto label1;
 label2:    // if文抜出
 moveto x+10,y; // 名称の頭にカーソル移動
 beginsel;      // 範囲選択開始
 label3:        //
   if(#M==#L-10) //
     right;      //
     #M=#M+1;    //
 goto label3;
 endsel;        // 範囲選択終了
 copy2;         // クリップボードにコピー
 golineend2;    // 行末へ移動
 moveto x+4,y;  // 左へ4個カーソル移動
 paste;      // クリップボードから貼付け
 clearcliphist; // クリップボード履歴消去
 down;          // 次行
 #L=0;          // Lの初期化
 #M=0;          // Mの初期化
}
endmacro;
//---------------

マクロになってないと思われるのですが、第一の難関は代入文です。

カーソル部分の文字を $Letterという変数に代入する方法がわかり
ません。

第二は、秀丸のIF文がよくわかりません。

if文は,その直後にある条件式が0以外の場合に次のコマンドを実行す

るとあります。

basic調の if $letter<>"/" then label2 を秀丸流に書くとどうい

うことになるのでしょうか。

実行しない場合はどこに行くのでしょうか。前記次のコマンドを飛び越

えた行から実行されるのでしょうか。


以上

[ ]
RE:03380 マクロを作って見ましたNo.03381
ひろ さん 02/09/18 21:16
 
 KOBO さん今日は、ひろです。
>  $letter="??";    // カーソル位置の文字取込
 gettext を使ってみてください。例えば、
beginsel;
$letter = gettext( x, y, x + 1, y );
とします。ただし今回の場合は、文字列というよりカーソル位置の文字を判
定したいだけのようなので、
if( code != ascii( "/" ) )
という手も有ります。( ascii( "/" ) は 0x2F なので、直接総書いた方が速度
は早い)

>  if $letter<>"/" then goto label2; // とBASIC調に書きたい
if ($letter != "/" )goto label2;
となりますが、秀丸のマクロは C 言語ライクですから、スパゲッティ・コー
ドになりがちな、goto 文はあまり使わない方がよいと思います。今回の場合、
「{」と「}」によるブロックや、while 文を使うと良いでしょう。

[ ]
RE:03381 マクロを作って見ましたNo.03382
encodingshiftjis さん 02/09/18 23:06
 
文字列の入れ替えですから

正規表現でもがんばれるでしょう、たぶん。

分かりやすさでは、 .ppt">
を /[0-9]+ の直後に移動でしょうか。
searchdown / up と cut / paste でほとんど if  無しで
できるでしょう、
キー操作を記録してマクロソースを得られます。

[ ]
RE:03381 マクロを作って見ましたNo.03383
KOBO さん 02/09/19 22:01
 
早速のアドバイスありがとうございました。

やってみたのですが、相変わらずエラーが出て確認ができません。

エラー箇所 paste で文法エラーになります。

paste以前はエラーは出ないのですが、目的の実行ができているのかは

不明です。

よろしくお願い致します。


//---------------
disabledraw;
gofiletop;
while (code != -1) {
 golineend2;    // 行末へ移動
 moveto x-11,y; // 11個左へカーソル移動
 label1:
 $letter=gettext(x,y,x-1,y); //
   if ($letter!="/") goto label2; //
     #L=#L+1;   // 文字数数え
   goto label1;  //
 label2:
 moveto x+10,y; // 名称の頭にカーソル移動
 beginsel;      // 範囲選択開始
 label3:
   if (#M==#L-10) goto label4; // 名称の最後尾になったら
     right;      // 右へカーソル移動
     #M=#M+1;    // 文字数数え
 goto label3;
 label4:
 endsel;        // 範囲選択終了
 copy2;         // クリップボードにコピー
 golineend2;    // 行末へ移動
 moveto x+4,y;  // 左へ4個カーソル移動
 paste;      // クリップボードから貼付け
 clearcliphist; // クリップボード履歴消去
 down;          // 次行
 #L=0;          // Lの初期化
 #M=0;          // Mの初期化
}
endmacro;
//---------------




















> KOBO さん今日は、ひろです。
>>  $letter="??";    // カーソル位置の文字取込
> gettext を使ってみてください。例えば、
>beginsel;
>$letter = gettext( x, y, x + 1, y );
>とします。ただし今回の場合は、文字列というよりカーソル位置の文字を判
>定したいだけのようなので、
>if( code != ascii( "/" ) )
>という手も有ります。( ascii( "/" ) は 0x2F なので、直接総書いた方が速度
>は早い)
>
>>  if $letter<>"/" then goto label2; // とBASIC調に書きたい
>if ($letter != "/" )goto label2;
>となりますが、秀丸のマクロは C 言語ライクですから、スパゲッティ・コー
>ドになりがちな、goto 文はあまり使わない方がよいと思います。今回の場合、
>「{」と「}」によるブロックや、while 文を使うと良いでしょう。

[ ]
RE:03382 マクロを作って見ましたNo.03384
KOBO さん 02/09/19 22:06
 
ありがとうございます。

>文字列の入れ替えですから
>
>正規表現でもがんばれるでしょう、たぶん。
>
>分かりやすさでは、 .ppt">
>を /[0-9]+ の直後に移動でしょうか。

この意味がわからないのですが・・・・・

>searchdown / up と cut / paste でほとんど if  無しで
>できるでしょう、

勉強して見ます。全くの初心者で皆目不明であります。(今時何
ですが、basic は知ってます)


>キー操作を記録してマクロソースを得られます。

[ ]
RE:03383 マクロを作って見ましたNo.03385
ひろ さん 02/09/19 22:37
 
 KOBO さん今日は、ひろです。
> エラー箇所 paste で文法エラーになります。
 ここまで解っていたら、ソースを良く見直してください。これが上達の近
道です。

 因みに原因は、全角空白があることです。ただしこれを直しても、ファイ
ルの終端で無限ループになります。

 またプログラミングをするときは、タブ、改行、全/半角空白を表示するよ
うにしておいた方が、ミスを素早く見つけられます。

 また今回の例の場合、おそらくマクロを書かなくとも置換で出来ると思います。
検索文字列:<A href="[A-Za-z0-9/_-]+\f \f.+\f\.ppt"></A>
置換文字列:\0\.ppt">\2</A>
正規表現:ON
とします。

 更にこの置換を、マクロにすると、
replaceallfast "<A href=\"[A-Za-z0-9/_-]+\\f \\f.+\\f\\.ppt\"></A>",
  "\\0\\.ppt\">\\2</A>",regular;
となります。(例が 1 つだけなので、上手くいかないものもあるかも)

[ ]
RE:03384 マクロを作って見ましたNo.03386
encodingshiftjis さん 02/09/19 23:07
 
>>キー操作を記録してマクロソースを得られます。

エディタの構造物を理解すると、エディタ的発想でマクロが書けます。
ほとんど、変数/配列の 一般プログラムと味わいのちがいが。

カーソルを行頭に置き。キーはWin標準と仮定して

キー操作の記録開始
下検索 .ppt">
Ctrl+X
上検索 /[0-9]+ (正規表現)
下検索 半角空白
Ctrl+V
キー操作の記録終了

記録の確認で キー操作の再生 をしてみる。

OKなら、キー操作の保存、 K.mac (macrodir の中)
開く K.mac  でマクロソース(1単位)が得られます。

[ ]
RE:03385 マクロを作って見ましたNo.03387
KOBO さん 02/09/21 12:51
 
大変お世話になります

> ここまで解っていたら、ソースを良く見直してください。これが上達の近道です。

   申し訳ありません。色々はやってるのですが

> 因みに原因は、全角空白があることです。ただしこれを直しても、ファイ>ルの終
>端で無限ループになります。
>
    全角空白があるとだめなのですか??

> また今回の例の場合、おそらくマクロを書かなくとも置換で出来ると思います。
>検索文字列:<A href="[A-Za-z0-9/_-]+\f \f.+\f\.ppt"></A>
>置換文字列:\0\.ppt">\2</A>
>正規表現:ON
>とします。

下記の事例では動作しません
*.pptは名称自体が色々です。字種類、字数、空白等千差万別です。
<A href="files:/Fchoso-sv10/top/workphase/presentation/tec/共通/Tec05964 放
送・映像技術で社会へ貢献.ppt"></A>
<A href="files:/Fchoso-sv10/top/workphase/presentation/tec/衛星映像システム/Tec0
2919 衛星映像システム (SATELLITE VIDEO SYSTEM 多点間・片方向・アナログ・2
画面システム).ppt"></A>

恐縮ですが、検索文字列、置換文字列を説明していただけないでしょうか。

よろしくお願い致します。



>
> 更にこの置換を、マクロにすると、
>replaceallfast "<A href=\"[A-Za-z0-9/_-]+\\f \\f.+\\f\\.ppt\"></A>",
>  "\\0\\.ppt\">\\2</A>",regular;
>となります。(例が 1 つだけなので、上手くいかないものもあるかも)

[ ]
RE:03387 マクロを作って見ましたNo.03393
ひろ さん 02/09/22 00:47
 
 KOBO さん今日は、ひろです。
>     全角空白があるとだめなのですか??
 文字列としては勿論出来ますが、それ以外では無理です。要するに日本語
文字だから、ある意味当然です。

> 下記の事例では動作しません
> *.pptは名称自体が色々です。字種類、字数、空白等千差万別です。
 これについては規則性が解らなければ、置換であれ、他の方法であれ自動変
換できません。元々何か規則性があるので、マクロで変更しようとされたの
ではないのですか? それを書いていただくと、解決策が提示できるかもしれ
ません。

> 恐縮ですが、検索文字列、置換文字列を説明していただけないでしょうか。
 まずヘルプで正規表現、特にタグ付き正規表現の項目を呼んでみてください。

[ ]
RE:03393 マクロを作って見ましたNo.03395
KOBO さん 02/09/22 07:54
 
お世話になります

秀丸Q/Aでタグ付きの説明を見ました。色々なことが出来るのですね。

今般、正規表現あるいはタグ付き正規表現を知っただけでも収穫です。

ありがとうございます。


目的は次の通りです。

  ハイパーリンク部分のファイル名の分解です。ファイル名は半角英  数以外は
ダメのようなので、漢字カナを分離するためのものです。

<A href="files:/Fchoso-sv10/top/workphase/presentation/tec/共通/Tec03901 放
送の未来.ppt"></A>

            ↓

<A href="files:/Fchoso-sv10/top/workphase/presentation/tec/共通/TEC03901.ppt
">放送の未来</A>

 
ご質問の規則性は次のとおりです。

パスは千差万別で末尾の形式が共通

パス最後の / の後に TEC03901 放送の未来.ppt"></A>  がある

この要素は次の通り

TEC03901 [A-Z]..[0-9].... の規則
TEC03901と放送映像・・・・・の間には半角スペースがある
放送の未来 は自由長で半角・全角のスペースあるいは数字もある

以上です

よろしくお願い致します。
 

[ ]
RE:03386 マクロを作って見ましたNo.03396
KOBO さん 02/09/22 08:00
 
ありがとうございます

やってみました。プログラムが出来ますね。ただ、これだけでは

全ての処理を行うことが出来ず、当方にとってこのプログラミン

グの勉強をしないとダメという状況です。



>>>キー操作を記録してマクロソースを得られます。
>
>エディタの構造物を理解すると、エディタ的発想でマクロが書けます。
>ほとんど、変数/配列の 一般プログラムと味わいのちがいが。
>
>カーソルを行頭に置き。キーはWin標準と仮定して
>
>キー操作の記録開始
>下検索 .ppt">
>Ctrl+X
>上検索 /[0-9]+ (正規表現)
>下検索 半角空白
>Ctrl+V
>キー操作の記録終了
>
>記録の確認で キー操作の再生 をしてみる。
>
>OKなら、キー操作の保存、 K.mac (macrodir の中)
>開く K.mac  でマクロソース(1単位)が得られます。

[ ]
RE:03395 マクロを作って見ましたNo.03397
きいろいまふらあ さん 02/09/22 09:19
 
おはようございます。

わざとではないでしょうけれど、KOBOさんのお書きになっている内容に一貫性が
ないので、回答されている方々も混乱されていると思います。

>パス最後の / の後に TEC03901 放送の未来.ppt"></A>  がある
>
>この要素は次の通り
>
>TEC03901 [A-Z]..[0-9].... の規則

↑既に提示された例では、数字のみで8桁というものもありますよ。

>TEC03901と放送映像・・・・・の間には半角スペースがある

↑全角スペースの例もありますよ。

>放送の未来 は自由長で半角・全角のスペースあるいは数字もある

例の記述ミスなのか、分析のミスなのかはっきりさせて、もう一度ここの仕様を
明確にしたらいいんじゃないかと思います。

が、3383番のひろさんのをちょこっと変形して

検索文字列:<A href=".+\f/[A-Z0-9][A-Z0-9][A-Z0-9][0-9][0-9][0-9][0-9][0-
9]\f[  ]\f[~/].+\f\.ppt"></A>
置換文字列:\0\1.ppt">\3</A>

くらいでなんとかならないですかね?
条件が絞れればもっとシンプルにできると思います。<すべきです。

マクロにするときは
「\」を「\\」に
「"」を「\"」に置き換えます。

[ ]
RE:03396 マクロを作って見ましたNo.03398
encodingshiftjis さん 02/09/22 09:38
 
>全ての処理を行うことが出来ず、当方にとってこのプログラミン
>グの勉強をしないとダメという状況です。

勉強すれば、苦行の報酬はあります。ただ、まとまる段階に達する
まで、暗闇期間が長いです。

「全ての処理」の不足している部分は
繰り返しと、その終了判定です

カーソルをファイルの先頭に飛ばす
(エディタ操作では「カーソル意識」が重要です)

while(1){  // 永久ループ
  searchdown ".ppt\">" ;   // 下検索  .ppt">
    if( !result )  break; // 変換の対象が見つからないから、オシマイ
〜〜〜〜〜〜〜〜 以下前回の以降の部分
       }
 
上検索 /[0-9]+ (正規表現) は
上検索 /[A-Za-z0-9]+ (正規表現)   に変更します。

<A 以外に .ppt"> があると、まったくだめですが
操作対象範囲を限定するのにテクニックを要するのが
テキスト処理の弱点です。

[ ]
RE:03398 マクロを作って見ましたNo.03402
KOBO さん 02/09/22 17:45
 
ありがとうございます

早速やって見たところ、何となく動作がし始めてきたようにみえますが、2点ほどお
かしい部分があるのです。

1.CONTROL+X が機能していない

 最後のPASTE時にCONTOROL+Xしたものが、貼り付け
 られず、クリップボード内の別なものが貼り付けられてしまう

2.ループから抜け出せない



while(1){  // 永久ループ
 searchdown ".ppt\">" ;   // 下検索  .ppt">
 if( !result )  break; // 変換の対象が見つからないから、オシマイ
 searchdown ".ppt" , regular;
 if( ! result )  beep;
 cut;
 searchup "/[A-Za-z0-9]+" , regular;
 if( ! result )  beep;
 searchdown " ";
 if( ! result )  beep;
 paste;
}

参考データ

<A href="files:/Fchoso-sv10/top/workphase/presentation/tec/共通/TEC05964 放
送技術.ppt"></A>
<A href="files:/Fchoso-sv10/top/workphase/presentation/tec/衛星システム/TEC02919
 衛星システム.ppt"></A>
<A href="files:/Fchoso-sv10/top/workphase/presentation/tec/衛星システム/TEC0691o
 衛星システム.ppt"></A>


その他

TEC05964 放送技術.ppt"></A>
  → TEC05964.ppt">放送技術</A>

分解移動が出来ていませんが自分でやってみます。ちなみに検索で
移動先の>を見つけたとします。この時点のカーソルはどこにある
のでしょうか。>上にあるのなら一文字RIGHTさせて、PASTEで良い
のでしょうか
 

以上




>>全ての処理を行うことが出来ず、当方にとってこのプログラミン
>>グの勉強をしないとダメという状況です。
>
>勉強すれば、苦行の報酬はあります。ただ、まとまる段階に達する
>まで、暗闇期間が長いです。
>
>「全ての処理」の不足している部分は
>繰り返しと、その終了判定です
>
>カーソルをファイルの先頭に飛ばす
>(エディタ操作では「カーソル意識」が重要です)
>
>while(1){  // 永久ループ
>  searchdown ".ppt\">" ;   // 下検索  .ppt">
>    if( !result )  break; // 変換の対象が見つからないから、オシマイ
>〜〜〜〜〜〜〜〜 以下前回の以降の部分
>       }
>
>上検索 /[0-9]+ (正規表現) は
>上検索 /[A-Za-z0-9]+ (正規表現)   に変更します。
>
><A 以外に .ppt"> があると、まったくだめですが
>操作対象範囲を限定するのにテクニックを要するのが
>テキスト処理の弱点です。

[ ]
RE:03397 マクロを作って見ましたNo.03404
KOBO さん 02/09/22 22:58
 
ありがとうございます

>わざとではないでしょうけれど、KOBOさんのお書きになっている内容に一貫性が
>ないので、回答されている方々も混乱されていると思います。

 申し訳ありません。


>>パス最後の / の後に TEC03901 放送の未来.ppt"></A>  がある
>>
>>この要素は次の通り
>>
>>TEC03901 [A-Z]..[0-9].... の規則

  英文字3文字と数字5文字です

>>TEC03901と放送映像・・・・・の間には半角スペースがある
 
  半角で結構です。実はファイル名を変更しつつあります。

>
>>放送の未来 は自由長で半角・全角のスペースあるいは数字もある

  この通りです


>検索文字列:<A href=".+\f/[A-Z0-9][A-Z0-9][A-Z0-9][0-9][0-9][0-9][0-9][0-
>9]\f[  ]\f[~/].+\f\.ppt"></A>

  検索ボックスに長すぎて入りきりません

  [A-Z0-9][A-Z0-9][A-Z0-9][0-9][0-9][0-9][0-9][0->9]の部分
    を[A-Z0-9]..[0-9]....ではだめでしょうか。やってみたところ
  みつかりませんでしたとのメッセージでした。

>置換文字列:\0\1.ppt">\3</A>

  勉強してみます。
  
  ありがとうございました。


[ ]
RE:03404 マクロを作って見ましたNo.03405
きいろいまふらあ さん 02/09/23 01:24
 
きいろいまふらあです。

>  検索ボックスに長すぎて入りきりません

そんなことはないと思いますけど???

>  英文字3文字と数字5文字です
>  半角で結構です。実はファイル名を変更しつつあります。

ということであれば

検索文字列:<A href=".+\f/[A-Z][A-Z][A-Z][0-9][0-9][0-9][0-9][0-9]\f \f[^
/].+\f\.ppt"></A>
置換文字列:\0\1.ppt">\3</A>

くらいまで短くできますかね。
#前回ちょっと間違えてました。

>  [A-Z0-9][A-Z0-9][A-Z0-9][0-9][0-9][0-9][0-9][0->9]の部分
>    を[A-Z0-9]..[0-9]....ではだめでしょうか。やってみたところ
>  みつかりませんでしたとのメッセージでした。

「.」は任意の1文字を表す正規表現です。直前のパターンの繰り返しではあり
ません。なのでだめです。

[ ]
RE:03402 マクロを作って見ましたNo.03407
encodingshiftjis さん 02/09/23 21:57
 
マクロはその場で書き捨て実行です。

while(1){  // 永久ループ
 searchdown ".ppt\">" ;  // 下検索  .ppt">
 if( !result )  break; // 変換の対象が見つからないから、オシマイ
// 直前のsearchdown で済んでいるため不要、
 // searchdown は先読みではない
  //searchdown ".ppt" , regular; // regular では . の解釈がちがう
   //if( ! result )  beep;
    //  search は選択を含んでいるので、
     // その間に何も入れないほうが,好ましい
 cut;
// 秀丸にはソースデバッガーはない、自分でプリントなどを設定する
menu "Break Point 1";  // [ESC]  キーで進行
 searchup "TEC[0-9]+" , regular;  //  TEC9999 状況依存+創発
menu "Break Point 2";  // カーソル位置を確認
// if( ! result )  beep; // beep では一時しか停止しない
 searchdown " ";
// if( ! result )  beep; // ステップ実行するなら menu
 paste;
}

[ ]