教えてください。No.01871
wizard さん 01/03/22 09:05
 
初めまして。
秀丸エディタのマクロについてですが、

aaaaaaaaaaaaaaa
bbbbbbbbbbbbbbb
cccccccccccccccという行があって
aaaaaaaaaaaaaaa
aaaaaaaaaaaaaaa
bbbbbbbbbbbbbbb
bbbbbbbbbbbbbbb
ccccccccccccccc
cccccccccccccccと元の行に対して同じ行をを挿入することって可能
なんでしょうか?
エディタを使っていて同じ行を何度もコピーして貼り付けることが多
いのでマクロでできたらいいのにと思ったんですが、ヘルプでもあま
りわかりませんでした。
どうすればよいか、教えてください。お願いします。

[ ]
RE:01871 教えてください。No.01872
TAKA さん 01/03/22 09:42
 
TAKA です。

>ccccccccccccccc
>cccccccccccccccと元の行に対して同じ行をを挿入することって可能
>なんでしょうか?

行の二重化という、そのものずばりの機能があります。
その機能を好きなキーに割り当てて使用されるといいと思います。
「その他→キー割り当て」で「キー」リストから割り当てたいキー
を選択、「コマンド」コンボボックスで「挿入系」を選択、リスト
の中にある「行の二重化」を選択して「OK」ボタンを押して下さ
い。
以降は、そのキーで行の二重化が出来ます。


>エディタを使っていて同じ行を何度もコピーして貼り付けることが多
>いのでマクロでできたらいいのにと思ったんですが、ヘルプでもあま
>りわかりませんでした。

もし、すべての行を二重化したいなら以下のマクロで出来ます。

// マクロ(ここから)
    disabledraw;
    gofiletop;
    while( code != eof )
    {
        dupline;
        down;
    }
    enabledraw;
    endmacro;
// マクロ(ここまで)

[ ]
RE:01871 教えてください。No.01873
しーめ さん 01/03/22 09:42
 
おせわになってます。

>初めまして。
>秀丸エディタのマクロについてですが、
>例
>aaaaaaaaaaaaaaa
>bbbbbbbbbbbbbbb
>cccccccccccccccという行があって
>aaaaaaaaaaaaaaa
>aaaaaaaaaaaaaaa
>bbbbbbbbbbbbbbb
>bbbbbbbbbbbbbbb
>ccccccccccccccc
>cccccccccccccccと元の行に対して同じ行をを挿入することって可能
>なんでしょうか?
>エディタを使っていて同じ行を何度もコピーして貼り付けることが多
>いのでマクロでできたらいいのにと思ったんですが、ヘルプでもあま
>りわかりませんでした。
>どうすればよいか、教えてください。お願いします。

マクロを使用しなくても可能です。
標準で用意されています。
増やしたい行にカーソルを置いて、

その他→キー割り当て・・・、もしくは
その他→コマンド一覧・・・

で、挿入系→行の2重化

を実行して下さい。

キー割り当てをしておくと便利です。

[ ]
RE:01871 同じ行を何度もコピー ...No.01874
番頭++ さん 01/03/22 09:45
 
>エディタを使っていて同じ行を何度もコピー ...

//*5    a1.mac
//  replaceall  "^.+\\f\\n", "\\0\\n\\0\\n", regular, ask;
    replacedown "^.+\\f\\n", "\\0\\n\\0\\n", regular, ask;
endmacro;



[ ]
RE:01874 同じ行を何度もコピー ...No.01881
山紫水明 さん 01/03/22 20:16
 
 番頭++さん,こんばんは。
ちょっと教えてください。

》    replacedown "^.+\\f\\n", "\\0\\n\\0\\n", regular, ask;
 これは,
    replacedown "^.+\\n", "\\0\\0", regular, ask;
とすると何か不都合が生じますか?

     では, (^^)/~
                                        山紫水明

[ ]
RE:01881 同じ行を何度もコピー ...No.01883
番頭++ さん 01/03/22 21:36
 
>》    replacedown "^.+\\f\\n", "\\0\\n\\0\\n", regular, ask;
> これは,
>    replacedown "^.+\\n", "\\0\\0", regular, ask;
>とすると何か不都合が生じますか?

それでも、動くでしょ、
ただ \f あっての \0 と、じちゃんは信じております。
本との仕様は解りません。

# それより inselect をわすれてる ...

[ ]
RE:01883 同じ行を何度もコピー ...No.01885
TAKA さん 01/03/22 22:18
 
TAKA です。

>>》    replacedown "^.+\\f\\n", "\\0\\n\\0\\n", regular, ask;
>> これは,
>>    replacedown "^.+\\n", "\\0\\0", regular, ask;
>>とすると何か不都合が生じますか?
>
>それでも、動くでしょ、
>ただ \f あっての \0 と、じちゃんは信じております。
>本との仕様は解りません。

先頭と最後の\fは省略できますので、仕様上は問題ありません。
\fが1個もないということは、先頭と最後に\fがあるのと同じ意味
になり、全体を\0として扱うことが出来ます。

それよりも、最終行が[EOF]で終わった時に最終行が置換されない
ことの方が問題だとは思います。

// テスト(ここから)
TEST\n
TEST[EOF]
// テスト(ここまで)
「\n」は改行
「[EOF]」はEOF

replacedown "^.+(\\n|$)", "\\0\\0", regular, ask;
とか
replacedown "^.*(\\n|$)", "\\0\\0", regular, ask;
で正常に動作しないのも、少し謎です。

$の検索で不具合を見つけたので、後で、一緒に質問しようとは思
っていますが。

[ ]
RE:01885 同じ行を何度もコピー ...No.01886
番頭++ さん 01/03/22 22:22
 
あちきは、昔からこんなこだわりがあります。参考になれば ...

    gofileend;
    if( x != 0 ){   insertreturn;   }   //  最後の行は改行だけにする、こだわ
り !
    gofiletop;

# そこいら中に、あるな ...

[ ]
RE:01885 同じ行を何度もコピー ...No.01887
山紫水明 さん 01/03/22 23:39
 
 TAKAさん,こんばんは。

》replacedown "^.+(\\n|$)", "\\0\\0", regular, ask;
》とか
》replacedown "^.*(\\n|$)", "\\0\\0", regular, ask;
》で正常に動作しないのも、少し謎です。

 そうですね,動いてもよさそうですが。

replacedown "^.+\\n?", "\\0\\0", regular, ask;
とすればいいようですね。

     では, (^^)/~
                                        山紫水明

[ ]
RE:01886 同じ行を何度もコピー ...No.01889
山紫水明 さん 01/03/22 23:40
 
 番頭++さん,こんばんは。

》    if( x != 0 ){   insertreturn;   }   //  最後の行は改行だけにする、こ
》だわり !

 たしかに。何となく落ち着かないので入れたくはなります。
 他方,もとのテキストにはできるだけ手をふれたくないとも。

     では, (^^)/~
                                        山紫水明

[ ]
RE:01886 同じ行を何度もコピー ...No.01890
TAKA さん 01/03/22 23:49
 
TAKA です。

>    if( x != 0 ){   insertreturn;   }   //  最後の行は改行だけにする、

これだと、折り返しがあったときにまずい場合があるので、
    if( column != 0 )
の方がいいかもしれませんね。

[ ]
RE:01887 同じ行を何度もコピー ...No.01891
TAKA さん 01/03/23 00:14
 
TAKA です。

>replacedown "^.+\\n?", "\\0\\0", regular, ask;
>とすればいいようですね。

一瞬、いけると思ったのですが、以下のようなデータがだめでした。
#くやしいー
##何故、駄目なのか?

// テスト(ここから)
TEST\n
\n
TEST[EOF]
// テスト(ここまで)

[ ]
RE:01885 同じ行を何度もコピー ...No.01892
Arimac さん 01/03/23 00:38
 
BREGEXPだと

TEST\n
TEST\n
TESTTEST[EOF]

となりました。

古いgrepとかのヘルプでは
^(行頭)と$(行末)はパターンの
先頭と最後でしか働かないと
書いてあるので、JRE32.DLLも
そうなのかも知れません。
()の中に書くことは想定して
なかったのでしょう・・・

[ ]
RE:01891 同じ行を何度もコピー ...No.01893
Arimac さん 01/03/23 00:41
 
秀丸エディタのヘルプ
「\nを使った複数行検索の際の制限について」
のためだと思います。

[ ]
RE:01892 同じ行を何度もコピー ...No.01894
TAKA さん 01/03/23 01:03
 
TAKA です。

>BREGEXPだと
>
>TEST\n
>TEST\n
>TESTTEST[EOF]
>
>となりました。

「BREGEXP」は意図した通り動くのですね。


>古いgrepとかのヘルプでは
>^(行頭)と$(行末)はパターンの
>先頭と最後でしか働かないと
>書いてあるので、JRE32.DLLも
>そうなのかも知れません。
>()の中に書くことは想定して
>なかったのでしょう・・・

多分、そうなのでしょうね。
念のために、確認の書き込みをしておきました。

[ ]
RE:01893 同じ行を何度もコピー ...No.01895
TAKA さん 01/03/23 01:07
 
TAKA です。

>秀丸エディタのヘルプ
>「\nを使った複数行検索の際の制限について」
>のためだと思います。

「?」は0から1なので、複数とは違うような気もします。
少し気になることもありましたので、先ほど、「情報交換」会議室
へ書き込みを行いました。

[ ]
RE:01885 同じ行を何度もコピー ...No.01896
きいろいまふらあ さん 01/03/23 01:41
 
>先頭と最後の\fは省略できますので、仕様上は問題ありません。
>\fが1個もないということは、先頭と最後に\fがあるのと同じ意味
>になり、全体を\0として扱うことが出来ます。

省略はできるけど、あるとないとでは後方参照の記述が変わってきます。
先頭と最後に \f をつけたら、全体(=\fにはさまれた部分)は \1
になります。\0は「長さ0の文字列」を返すようですね。

[ ]
RE:01890 同じ行を何度もコピー ...No.01897
きいろいまふらあ さん 01/03/23 01:41
 
>>    if( x != 0 ){   insertreturn;   }   //  最後の行は改行だけにする、
>
>これだと、折り返しがあったときにまずい場合があるので、
>    if( column != 0 )
>の方がいいかもしれませんね。

linelen2 って手もありますかね。
それより、insertreturn って、挿入モードと上書きモードで動作が違うんじゃ
なかったっけ?「リターンキーを押したのと同じことになる」と。

[ ]
RE:01897 同じ行を何度もコピー ...No.01898
TAKA さん 01/03/23 02:03
 
TAKA です。

>linelen2 って手もありますかね。

ですね。


>それより、insertreturn って、挿入モードと上書きモードで動作が違うんじゃ
>なかったっけ?「リターンキーを押したのと同じことになる」と。

カーソルが[EOF]にある時には、同じ結果になるみたいです。
でも、素直に「insert "\n";」がいいかもしれませんね。

[ ]
RE:01898 同じ行を何度もコピー ...No.01899
きいろいまふらあ さん 01/03/23 09:10
 
> >それより、insertreturn って、挿入モードと上書きモードで動作が違うんじゃ
> >なかったっけ?「リターンキーを押したのと同じことになる」と。
>
> カーソルが[EOF]にある時には、同じ結果になるみたいです。

状況の特殊性を全く考慮してませんでした。お恥ずかしい。

[ ]
RE:01890 同じ行を何度もコピー ...No.01900
番頭++ さん 01/03/23 09:36
 
>>    if( x != 0 ){   insertreturn;   }   //  最後の行は改行だけにする、
>これだと、折り返しがあったときにまずい場合があるので、
>    if( column != 0 )
>の方がいいかもしれませんね。

いえ、そうすべきです。

# でも、もう提供しているマクロに山ほどありそう ...

[ ]
RE:01898 同じ行を何度もコピー ...No.01901
番頭++ さん 01/03/23 10:14
 
>>それより、insertreturn って、挿入モードと上書きモードで動作が違うんじゃ
>>なかったっけ?「リターンキーを押したのと同じことになる」と。
>
>カーソルが[EOF]にある時には、同じ結果になるみたいです。
>でも、素直に「insert "\n";」がいいかもしれませんね。

編集中に、後ろに追加して文字を入力すると同じでしょう。
と、言い訳しておきます。

# 昔、「秀丸」の手引書も無い時代にマクロを覚えたので ...
# Nifty の代金もかさんでた時期だし。

[ ]
RE:01871 教えてください。No.01902
wizard さん 01/03/23 21:32
 
自己フォローです。

3130 print using"### &       & &  …
.LSPEC$;B.TYPE$;B.POWER$;B.TANI$;
と二行になっているのは、
'3130 print using"### &       & &  …
.LSPEC$;B.TYPE$;B.POWER$;B.TANI$;
3130 print using"### &       & &  …
.LSPEC$;B.TYPE$;B.POWER$;B.TANI$;
                :
         :
10061 MID$(D0$(2),  1, 5)=B.AMP.T$
10062 MID$(D0$(2),  6, 5)=B.TIME$
10063 MID$(D0$(2), 11, 5)=B.S.COIL$

'10061 MID$(D0$(2),  1, 5)=B.AMP.T$
10061 MID$(D0$(2),  1, 5)=B.AMP.T$
'10062 MID$(D0$(2),  6, 5)=B.TIME$
10062 MID$(D0$(2),  6, 5)=B.TIME$
'10063 MID$(D0$(2), 11, 5)=B.S.COIL$
10063 MID$(D0$(2), 11, 5)=B.S.COIL$
とファイルの範囲選択したところだけをたとえばコメント
記号「'」をつけてマクロを使ってするためにはどうしたら
よいかということでした。
'3130 print using"### &       & &  …
.LSPEC$;B.TYPE$;B.POWER$;B.TANI$;
3130 print using"### &       & &  …
_LSPEC$;B_TYPE$;B_POWER$;B_TANI$;
                :
         :
'10061 MID$(D0$(2),  1, 5)=B.AMP.T$
10061 MID$(D0$(2),  1, 5)=B_AMP_T$
'10062 MID$(D0$(2),  6, 5)=B.TIME$
10062 MID$(D0$(2),  6, 5)=B_TIME$
'10063 MID$(D0$(2), 11, 5)=B.S.COIL$
10063 MID$(D0$(2), 11, 5)=B_S_COIL$
また、範囲選択してコメント記号「'」をつけた行以外を置換する
ためにはマクロでどういった方法があるの教えてください。



[ ]
RE:01902 教えてください。No.01903
TAKA さん 01/03/23 22:22
 
TAKA です。

>3130 print using"### &       & &  …
>.LSPEC$;B.TYPE$;B.POWER$;B.TANI$;
>と二行になっているのは、
>'3130 print using"### &       & &  …
>.LSPEC$;B.TYPE$;B.POWER$;B.TANI$;
>3130 print using"### &       & &  …
>.LSPEC$;B.TYPE$;B.POWER$;B.TANI$;

2行であるかどうかの判断方法が分かりません。
行の先頭が数値でなければ、その行は前の行とセットと見なすので
しょうか?

// テストファイル(ここから)
0 TETS
TEST
TEST
// テストファイル(ここまで)

このような場合にはどうしたいのでしょうか?
#私は何か勘違いしているのかな?


>とファイルの範囲選択したところだけをたとえばコメント
>記号「'」をつけてマクロを使ってするためにはどうしたら
>よいかということでした。

行の2重化を行い、片方(最初の方)には先頭に「'」を付けるな
ら、

// マクロ(ここから)
    replaceallfast "^.*\\n", "'\\0\\0", regular, inselect;
    endmacro;
// マクロ(ここまで)

でいいと思いますが、やりたいことは違うかな?
範囲選択していない場合は、ファイル全体が対象です。


>'3130 print using"### &       & &  …
>.LSPEC$;B.TYPE$;B.POWER$;B.TANI$;
>3130 print using"### &       & &  …
>_LSPEC$;B_TYPE$;B_POWER$;B_TANI$;

ここは、何がしたいのでしょうか?


>また、範囲選択してコメント記号「'」をつけた行以外を置換する
>ためにはマクロでどういった方法があるの教えてください。

どのように置換したいのかが分かりませんので、取りあえず、置換
対象の行には、頭に「置換した」という文字をつけるマクロです。

// マクロ(ここから)
    replaceallfast "^[^'].*\\n", "置換した\\0", regular, inselect;
    endmacro;
// マクロ(ここまで)




少なくと私には、仕様が不明確すぎて分かりませんでした。
説明文の区切りが、どこなのかが分かりにくいです。区切りが分か
らないので、何個のマクロが必要なのかも分かりませんでした。
もし、他の人からレスがつかない場合には、分かりにくいのでレス
がつかないだけだと思います。
その時には、もう少し仕様を分かりやすく説明してもらえれば、明
確なマクロも書けると思います。

変換前と変換後のテストデータ(実データではなくてシンプルなも
の)は、どこからがデータの開始でどこまでがデータの終了かを分
かりやすく書いた方がいいかも。

[ ]
RE:01903 もう少し簡単なサンプルを ...No.01904
番頭++ さん 01/03/23 22:31
 
TAKA さんへ

案ですが、もう少し簡単なサンプルを示していただくのも案かも。

# 同感、いまいち、ワカラン ...

[ ]
RE:01903 教えてください。No.01905
TAKA さん 01/03/23 22:38
 
TAKA です。

>// マクロ(ここから)
>    replaceallfast "^[^'].*\\n", "置換した\\0", regular, inselect;
>    endmacro;
>// マクロ(ここまで)

改行だけの行も置換の対象にするなら、

// マクロ(ここから)
    replaceallfast "^([^'].*\\n|\\n)", "置換した\\0", regular, inselect;
    endmacro;
// マクロ(ここまで)

です。
#もっと、簡単にかけるかも。

[ ]
RE:01902 教えてください。No.01906
Arimac さん 01/03/23 22:39
 
恐らく範囲指定、履歴付き置換を行ないたいのでは?(^^;

履歴付き置換だけなら
$srch2 = "(^|[^'].*)\\f" + $srch1 + "\\f.*$";
$rep2 = "'**\\0\\1\\2\\t\\t'2001-03-23 Arimac Del\\n" +
        "\\0" + $rep1 + "\\2\\t\\t'2001-03-23 Arimac Add";
replaceallfast $srch2, $rep2, regular;
という感じのマクロを作って利用しています(^^;
($srch1, $rep1はinputで入力)

これには1行に1ヶ所の置換がある場合にしか
適用できないという欠点があります(^^;

#最新バージョンは確か日付は自動入力にしたはず(^^;

[ ]
RE:01904 もう少し簡単なサンプルを ...No.01907
wizard さん 01/03/26 12:56
 
すいませんでした。
やりたかったこととしては、ファイル全体ではなくて範囲選択したところで
1a.a.a.a.a
2b.b.b.b.b
3c.c.c.c.c
と元の行番号つきの文があって
'1a.a.a.a.a
1a.a.a.a.a
'2b.b.b.b.b
2b.b.b.b.b
'3c.c.c.c.c
3c.c.c.c.c
と元の行には「'」をつけます。行番号のついていないものは
前の行の改行とみなします。

置換前
 ↓
'1a.a.a.a.a
1a.a.a.a.a
'2b.b.b.b.b
2b.b.b.b.b
'3c.c.c.c.c
3c.c.c.c.c

置換後
'1a.a.a.a
1a_a_a_a_a
'2b.b.b.b.b
2b_b_b_b_b
'3c.c.c.c.c
3c_c_c_c_c

「'」のつけた行はそのまま残して例えば「.」を「_」に
置き換えるようにします。
行番号のついていない行は上と同様に前の行の改行分です


[ ]
RE:01907 もう少し簡単なサンプルを ...No.01908
TAKA さん 01/03/26 16:03
 
TAKA です。

>やりたかったこととしては、ファイル全体ではなくて範囲選択したところで

範囲選択していない時はどうしましょう。何もしないでいいのでし
ょうか?それともファイル全体にしたいのでしょうか?

行番号であるかどうかの判断は、行頭が数値であればという判断で
よいでしょうか?

改行だけの行はあるのでしょうか?
あるとしたら、改行だけの行は行番号がついていない行と同様の扱い
でいいでしょうか?

一度マクロで編集したものに対して、再度マクロを実行した場合は
どうしたらいいでしょうか?
何も、考えずにマクロを作ると、「'」がついている行は、行番号が
ついていない行と同様の扱いになりますが。
ユーザーが、再度マクロを実行しないというようにするだけの、運
用でカバーしてもうらのが楽ですが。


>前の行の改行とみなします。

意味が分かりませんが、以前の発言から推測するに、

// テストデータ(編集前)(ここから)
1t.e.s.t.1
t.e.s.t.2
t.e.s.t.3
2t.e.s.t.4
t.e.s.t.5
// テストデータ(編集前)(ここまで)

とあった場合に、

// テストデータ(編集後)(ここから)
'1t.e.s.t.1
t.e.s.t.2
t.e.s.t.3
1.t.e.s.t.1
t.e.s.t.2
t.e.s.t.3
'2t.e.s.t.4
t.e.s.t.5
2t.e.s.t.4
t.e.s.t.5
// テストデータ(編集後)(ここまで)

となって欲しいということですよね。


>「'」のつけた行はそのまま残して例えば「.」を「_」に
>置き換えるようにします。

ふむふむ。


マクロが2つ欲しいということだと思いますが、どちらも以下の手
順で簡単に実現できます。

1.選択範囲を作業用のステルス秀丸にコピー
2.対象データを1行にする。正規表現の置換で実現。
3.1行単位で処理する。正規表現の置換で実現。
4.1行を元のデータに戻す。正規表現の置換で実現。
5.元のファイルに戻す。

以下は最初のマクロでの例です。

// テストデータ(手順2の前)(ここから)
1t.e.s.t.1
t.e.s.t.2
t.e.s.t.3
2t.e.s.t.4
t.e.s.t.5
// テストデータ(手順2の前)(ここまで)

元データの区切りが分かるようにありえないものを入れる。
例として「\t」(タブ)を挿入。

// テストデータ(手順2の後)(ここから)
1t.e.s.t.1\tt.e.s.t.2\tt.e.s.t.3
2t.e.s.t.4\tt.e.s.t.5
// テストデータ(手順2の後)(ここまで)

// テストデータ(手順3の後)(ここから)
'1t.e.s.t.1\tt.e.s.t.2\tt.e.s.t.3
1t.e.s.t.1\tt.e.s.t.2\tt.e.s.t.3
'2t.e.s.t.4\tt.e.s.t.5
2t.e.s.t.4\tt.e.s.t.5
// テストデータ(手順3の後)(ここまで)

// テストデータ(手順4の後)(ここから)
'1t.e.s.t.1
t.e.s.t.2
t.e.s.t.3
1t.e.s.t.1
t.e.s.t.2
t.e.s.t.3
'2t.e.s.t.4
t.e.s.t.5
2t.e.s.t.4
t.e.s.t.5
// テストデータ(手順4の後)(ここまで)

こんな感じで、簡単に実現できます。


どうやら、今回のマクロで重要になりそうな所は、複数の行を1レ
コードとして処理しなければ、ならないことのようですね。

2つめのマクロも同様に簡単に出来ます。
ただ、「.」を無条件に「_」に置換する訳にはいかないので、実際
にマクロを作る時には、もう一つステルス秀丸を使用するのと、も
う一つありえない文字を使用して、高速化を測ると思います。
#私だったらですが。

データは多い時には、置換対象となる「.」の数は大体何個くらいで
すか。
1000行*平均10個で10000個位とか?
データが少なければ、高速化なしで、実現したほうが簡単ですが。


こんな感じでよければ、マクロを作りますので、必要であれば、言
って下さい。(1つめのマクロは、速攻で作れます)
その時には、ありえない文字列を2つ決めて下さい。
一つ目のマクロは文字列を1つしか使用しませんが。
タブがないのなら、タブがお勧めですね。

[ ]
RE:01908 もう少し簡単なサンプルを ...No.01909
wizard さん 01/03/27 14:22
 
>範囲選択していない時はどうしましょう。何もしないでいいのでし
>ょうか?それともファイル全体にしたいのでしょうか?

範囲選択していないときは何もしません。

>
>行番号であるかどうかの判断は、行頭が数値であればという判断で
>よいでしょうか?
>
>改行だけの行はあるのでしょうか?
>あるとしたら、改行だけの行は行番号がついていない行と同様の扱い
>でいいでしょうか?

行番号は行頭が数字であればよいです。数字がついていない行は改行と
同じ扱いです。

>一度マクロで編集したものに対して、再度マクロを実行した場合は
>どうしたらいいでしょうか?
>何も、考えずにマクロを作ると、「'」がついている行は、行番号が
>ついていない行と同様の扱いになりますが。
>ユーザーが、再度マクロを実行しないというようにするだけの、運
>用でカバーしてもうらのが楽ですが。
>
>
>// テストデータ(編集前)(ここから)
>1t.e.s.t.1
>t.e.s.t.2
>t.e.s.t.3
>2t.e.s.t.4
>t.e.s.t.5
>// テストデータ(編集前)(ここまで)
>
>とあった場合に、
>
>// テストデータ(編集後)(ここから)
>'1t.e.s.t.1
>t.e.s.t.2
>t.e.s.t.3
>1.t.e.s.t.1
>t.e.s.t.2
>t.e.s.t.3
>'2t.e.s.t.4
>t.e.s.t.5
>2t.e.s.t.4
>t.e.s.t.5
>// テストデータ(編集後)(ここまで)
>
>となって欲しいということですよね。
>
そうです。

>マクロが2つ欲しいということだと思いますが、どちらも以下の手
>順で簡単に実現できます。
>
>1.選択範囲を作業用のステルス秀丸にコピー
>2.対象データを1行にする。正規表現の置換で実現。
>3.1行単位で処理する。正規表現の置換で実現。
>4.1行を元のデータに戻す。正規表現の置換で実現。
>5.元のファイルに戻す。
>
>以下は最初のマクロでの例です。
>
>// テストデータ(手順2の前)(ここから)
>1t.e.s.t.1
>t.e.s.t.2
>t.e.s.t.3
>2t.e.s.t.4
>t.e.s.t.5
>// テストデータ(手順2の前)(ここまで)
>
>元データの区切りが分かるようにありえないものを入れる。
>例として「\t」(タブ)を挿入。
>
>// テストデータ(手順2の後)(ここから)
>1t.e.s.t.1\tt.e.s.t.2\tt.e.s.t.3
>2t.e.s.t.4\tt.e.s.t.5
>// テストデータ(手順2の後)(ここまで)
>
>// テストデータ(手順3の後)(ここから)
>'1t.e.s.t.1\tt.e.s.t.2\tt.e.s.t.3
>1t.e.s.t.1\tt.e.s.t.2\tt.e.s.t.3
>'2t.e.s.t.4\tt.e.s.t.5
>2t.e.s.t.4\tt.e.s.t.5
>// テストデータ(手順3の後)(ここまで)
>
>// テストデータ(手順4の後)(ここから)
>'1t.e.s.t.1
>t.e.s.t.2
>t.e.s.t.3
>1t.e.s.t.1
>t.e.s.t.2
>t.e.s.t.3
>'2t.e.s.t.4
>t.e.s.t.5
>2t.e.s.t.4
>t.e.s.t.5
>// テストデータ(手順4の後)(ここまで)
>
>こんな感じで、簡単に実現できます。
>
>
>どうやら、今回のマクロで重要になりそうな所は、複数の行を1レ
>コードとして処理しなければ、ならないことのようですね。
>
>2つめのマクロも同様に簡単に出来ます。
>ただ、「.」を無条件に「_」に置換する訳にはいかないので、実際
>にマクロを作る時には、もう一つステルス秀丸を使用するのと、も
>う一つありえない文字を使用して、高速化を測ると思います。
>#私だったらですが。
>
>データは多い時には、置換対象となる「.」の数は大体何個くらいで
>すか。

正確には数えてませんが、範囲選択した部分だけでは50〜100個
くらいです。ただ「.」を「_」に置換するだけじゃなく、マクロで任
意の文字で置換前の文字を置換後の文字に変えることはできますか?


>
>
>こんな感じでよければ、マクロを作りますので、必要であれば、言
>って下さい。(1つめのマクロは、速攻で作れます)
>その時には、ありえない文字列を2つ決めて下さい。

>一つ目のマクロは文字列を1つしか使用しませんが。
>タブがないのなら、タブがお勧めですね。
タブでかまわないです。

色々と説明不足ですいません。

[ ]
RE:01909 もう少し簡単なサンプルを ...No.01910
TAKA さん 01/03/27 17:58
 
TAKA です。

>>改行だけの行はあるのでしょうか?
>>あるとしたら、改行だけの行は行番号がついていない行と同様の扱い
>>でいいでしょうか?
>
>行番号は行頭が数字であればよいです。数字がついていない行は改行と
>同じ扱いです。

先ほども書いた通り、改行と同じ扱いの意味がわかりませんが、私
の質問は、改行のみの行があるでしょうか?ということなのですが・・・
つまり、

// テストデータ(編集前)(ここから)
1t.e.s.t.1

t.e.s.t.2

2t.e.s.t.3

t.e.s.t.4
>// テストデータ(編集前)(ここまで)

このようなデータはあるのでしょうか?ということですが。
あった場合は、どうしたいのかを聞きたかったのですが。



>正確には数えてませんが、範囲選択した部分だけでは50〜100個

これなら、高速化なしでもまったく問題なさそうです。


>くらいです。ただ「.」を「_」に置換するだけじゃなく、マクロで任
>意の文字で置換前の文字を置換後の文字に変えることはできますか?

はい、可能です。
例えば、「.」を「_」に置換するのではなくて、「,」を「@」にす
るような場合は、「.」を「,」、「_」を「@」のようにマクロを修
正すれば可能です。
マクロを修正したなくれば、ユーザーに変換前の文字列と変換後の
文字列を入力させることも可能です。

どちらが都合がいいのでしょうか?
1.マクロ内のプログラムを修正する方法
2.ユーザーに毎回入力させる方法

1の方法がいいでしょうか?それとも2の方法がいいでしょうか?



取りあえず、二重化する方のマクロを書いておきます。
改行だけの行は、行番号がついていない行と同様の扱いにしていま
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
す。
^^^^
// 2重化マクロ(ここから)
    if( !selecting )
    { // 範囲選択されていない
        goto LEND;
    }

    // 範囲選択の取り込み
    #FH = hidemaruhandle( 0 );
    copy2;

    // テンポラリへ複写
    openfile "/h";
    showwindow 1;
    disabledraw;
    #TmpFH = hidemaruhandle( 0 );
    paste;

    // 編集
    replaceallfast "^\\n", "\\t", regular;              // 改行のみの例外処理
    replaceallfast "\\n\\f[^0-9]", "\\t\\1", regular;   // 1行にする
    replaceallfast "^.*\\n", "'\\0\\0", regular;        // 2重化
    replaceallfast "\\t", "\\n", regular;               // 元に戻す

    // 編集結果を元のファイルに戻す
    selectall;
    copy;
    enabledraw;
    setactivehidemaru #FH;
    closehidemaruforced #TmpFH;
    paste;

LEND:
    endmacro;
// 2重化マクロ(ここまで)

多分、希望通りの動きだと思います。
#私の勘違いがなければ。

[ ]
RE:01910 もう少し簡単なサンプルを ...No.01911
wizard さん 01/03/28 10:11
 
改行だけの行はないです。

あと置換の方法ですが、マクロ内のプログラムを修正する方法
ではなく、ユーザーに毎回入力させる方法でおねがいします。


[ ]
RE:01911 もう少し簡単なサンプルを ...No.01912
TAKA さん 01/03/28 12:38
 
TAKA です。

>改行だけの行はないです。

そうですか。
取りあえず、前回のマクロは改行だけの行はなくても、私の勘違い
がない限り正常に動作すると思いますので、問題はなさそうです。


>あと置換の方法ですが、マクロ内のプログラムを修正する方法
>ではなく、ユーザーに毎回入力させる方法でおねがいします。

前回の1つ目のマクロは正常(意図した通り)に動作しているでし
ょうか?
動作していないなら、私の勘違いがありますので、2つめのマクロ
を作っても意味がありません。
正常に動作しているようでしたら、2つめのマクロを作ります。

ユーザーに入力させた値を保存しておいて、次回からはその値をデ
フォルト表示させることも可能ですが、どうしましょうか?
また、前回値は保存しないで、毎回デフォルト値を同じ文字列にす
ることも可能です。
デフォルト値には、何が出て欲しいでしょうか?

[ ]