不要な改行を削除No.01813
TAKA さん 01/03/01 02:24
 
整形マクロの高速版を少し考えているのですが、みなさんの知恵を
かして下さい。

方法として、出来る限り自前ではしないようにしようと思っていま
す。(高速化のために)

方法として、おおまかに言うと、以下の手順を考えています。
1.不要な改行を削除
2.折り返し文字数を変更
3.ワープロ行単位で改行を挿入

2については、アンドゥが効かなくなるので、情報交換のフォーラ
ムで質問中です。
3については、問題なく処理出来ています。
#多分

で、知恵を貸して欲しいのは、1の不要な改行の削除です。
私としては、改行だけの行は整形したくないので、以下のような置
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
換を考えましたが、2つ問題がありました。
1つは、情報交換のフォーラムで質問中です。
replaceallfast ".+\\f\\n\\f.", "\\0\\2", regular, inselect;
残りの1つの問題とは、次のようなテストデータの時に正常に動作
しないので(当然ですが)、何とかしたいと思っています。

//テストデータ1(ここから)
TEST
T
T
//テストデータ1(ここまで)

変換すると、次のようになります。
#そりゃ、そうだ。

//テストデータ変換後(ここから)(意図と違う)
TESTT
T
//テストデータ変換後(ここまで)(意図と違う)

//テストデータ変換後(ここから)(希望)
TESTTT
//テストデータ変換後(ここまで)(希望)

こうなって欲しい。


かと言って、
replaceallfast ".+\\f\\n", "\\0", regular, inselect;
とすると、

//テストデータ2(ここから)
TEST
T
T

TEST
//テストデータ2(ここまで)

変換すると、次のようになります。
#そりゃ、そうだ。

//テストデータ変換後(ここから)(意図と違う)
TESTTT
TEST
//テストデータ変換後(ここまで)(意図と違う)

//テストデータ変換後(ここから)(希望)
TESTTT

TEST
//テストデータ変換後(ここまで)(希望)

こうなって欲しい。


私は、次のように2回手順を踏むしか方法がないような気がしてい
るのですが、1回で出来ないものでしょうか?
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

replaceallfast ".+\\f\\n", "\\0", regular, inselect;
//ここで、必要な変換範囲を選択する。
//変換範囲は置換数と、最初の変換対象のエディタ行数などから容
//易に求めることが出来ています。
replaceallfast "\\n", "\\n\\n", regular, inselect;


説明が下手で判りにくいかもしれませんが、よろしくお願いします。

[ ]
RE:01813 不要な改行を削除No.01814
安久津 さん 01/03/01 10:34
 
こんにちは TAKAさん、安久津といいます。
#引用部分空白挿入。

>// 私は、次のように2回手順を踏むしか方法がないような気がしてい
>// るのですが、1回で出来ないものでしょうか?
処理済部分と未処理部分にずれが生じてしまうので、無理でしょう。

>replaceallfast ".+\\f\\n", "\\0", regular, inselect;
>// ここで、必要な変換範囲を選択する。
>// 変換範囲は置換数と、最初の変換対象のエディタ行数などから容
>// 易に求めることが出来ています。
>replaceallfast "\\n", "\\n\\n", regular, inselect;
この方法は、連続する空行が元データにあると、余計な空行を作ります。
1回での処理よりも、むしろこちらの方を問題視して発言されたのだと推測します。
#はずしているかな。(^^;)

// ---------------------------------------------------------------
  disabledraw;
  if( ! selecting ) selectall;
  ##top = seltopy; ##end = selendy;
  escape;
  moveto 0, ##top; golinetop2; ##top = lineno;
  beginsel;
  moveto 0, ##end; golineend2; ##end = lineno;
  // 本処理
  replaceallfast ".\\f\\n\\f.", "\\0\\2", regular, inselect;
  ##crlf = result;
  while( ##crlf ){
    ##end = ##end - ##crlf;
    movetolineno 1, ##top; beginsel; movetolineno 1, ##end;
    replaceallfast ".\\f\\n\\f.", "\\0\\2", regular, inselect;
    ##crlf = result;
  }
endmacro;
// ---------------------------------------------------------------

改行の数が減る置換をする場合、その減る数を ##d とすると。
// 例 ##d = -1
##crlf = ##d * result;
##end = ##end + ##crlf;
で汎用的になります。

参考。連続する空行を1つの空行にまとめる。
  ##d = -1; // 1度の置換で改行が1個減る。
  replaceallfast "^\\n\\n", "\\n", regular, inselect;
  ##crlf = ##d * result;
  while( ##crlf ){
    ##end = ##end + ##crlf;
    movetolineno 1, ##top; beginsel; movetolineno 1, ##end;
    replaceallfast "^\\n\\n", "\\n", regular, inselect;
    ##crlf = ##d * result;
  }
では。




[ ]
RE:01814 不要な改行を削除No.01815
安久津 さん 01/03/01 10:41
 
>moveto 0, ##end; golineend2; ##end = lineno;
なんで golineend2 が入っているのだろう?。意味不明。(^^;)

では。

[ ]
RE:01813 不要な改行を削除No.01816
TAKA さん 01/03/01 11:33
 
>replaceallfast "\\n", "\\n\\n", regular, inselect;

replaceallfast ".+\\f\\n", "\\0\\n\\n", regular, inselect;

の間違いでした。

[ ]
RE:01814 不要な改行を削除No.01817
TAKA さん 01/03/01 11:47
 
回答、ありがとうございます。

>>// 私は、次のように2回手順を踏むしか方法がないような気がしてい
>>// るのですが、1回で出来ないものでしょうか?
>処理済部分と未処理部分にずれが生じてしまうので、無理でしょう。

やはり、ずれがあるので1回では無理ですか。


>replaceallfast ".+\\f\\n", "\\0", regular, inselect;
>// ここで、必要な変換範囲を選択する。
>// 変換範囲は置換数と、最初の変換対象のエディタ行数などから容
>// 易に求めることが出来ています。
>replaceallfast "\\n", "\\n\\n", regular, inselect;
この方法は、連続する空行が元データにあると、余計な空行を作ります。
1回での処理よりも、むしろこちらの方を問題視して発言されたのだと推測します。

replaceallfast "\\n", "\\n\\n", regular, inselect;
ではなくて、
replaceallfast ".+\\f\\n", "\\0\\n\\n", regular, inselect;
の間違いでした。
私の間違いで、手間を取らせてしまい、申し訳ありませんでした。

今は、
replaceallfast ".+\\f\\n", "\\0\\n\\n", regular, inselect;
をする代わりに、整形が終わった行は無条件で改行を入れるように
して、ずれを吸収するようにしています。
#これで、行くしかないかな。

[ ]
RE:01817 不要な改行を削除No.01819
安久津 さん 01/03/01 12:49
 
>をする代わりに、整形が終わった行は無条件で改行を入れるように
>して、ずれを吸収するようにしています。
結構単純なことだったのね。(^^;)
ただし、replaceallfast 一回というわけにはいきません。

if( ! selecting ){ beep; endmacro; }
replaceup ".\\f\\n\\f.", "\\0\\2", regular, inselect;
while( result ) findup;
// replacedown/finddown でもOK

では。

[ ]
RE:01819 不要な改行を削除No.01822
TAKA さん 01/03/01 16:00
 
>if( ! selecting ){ beep; endmacro; }
>replaceup ".\\f\\n\\f.", "\\0\\2", regular, inselect;
>while( result ) findup;
>// replacedown/finddown でもOK

以下のようなテストデータで問題がありました。

// テストデータ(ここから)
T
T
T
TEST
T
T
T
// テストデータ(ここまで)

if( ! selecting ){ beep; endmacro; }
replaceup ".\\f\\n\\f.", "\\0\\2", regular, inselect;
while( result ) findup;

では、正常に動作するのですが、
#正常に動作してはいけないはずだとは思いますが。

if( ! selecting ){ beep; endmacro; }
replacedown ".\\f\\n\\f.", "\\0\\2", regular, inselect;
while( result ) finddown;

だと、

// テストデータ(置換後)(ここから)
TT
TTESTT
TT
// テストデータ(置換後)(ここまで)

このようになります。
#そりゃ、そうだ。

replaceupを使用すると、replaceallfastやreplacedownと違う結果
になること自体が謎です。
#最長一致の法則は今回関係ないしなー
##他に、何か重要な規則があったかなー

[ ]
RE:01822 不要な改行を削除No.01825
TAKA さん 01/03/01 16:37
 
>if( ! selecting ){ beep; endmacro; }
>replaceup ".\\f\\n\\f.", "\\0\\2", regular, inselect;
>while( result ) findup;
>
>では、正常に動作するのですが、
>#正常に動作してはいけないはずだとは思いますが。

// テストデータ(ここから)
TTTTTTTT
// テストデータ(ここまで)

replaceup "TT", "TA";
while( result ) findup;

// テストデータ(置換後)(ここから)
TAAAAAAA
// テストデータ(置換後)(ここまで)

になることから、正しいということが理解できました。
ということで、サンプル通り、replaceupの場合は希望通りの動作
をすることが分かりました。

安久津 さん、色々どうもありがとうございました。
replaceupの方法も検討させてもらいます。

[ ]
RE:01825 不要な改行を削除No.01826
安久津 さん 01/03/01 17:58
 
一つのテストデータで上手くいったので、つい replacedown の方でも
 OK だと勘違いしました。#ちょっと今日はボケてます。(^^;)

>replaceupを使用すると、replaceallfastやreplacedownと違う結果
>になること自体が謎です。
>#最長一致の法則は今回関係ないしなー
>##他に、何か重要な規則があったかなー
replacedown の方は、置換開始位置より前(up)の文字を置換対象に含めることが
できません。しかし、replaceup は、置換開始位置より後ろ(down)の文字を置換対象
に含めることができます。#と、今一般化に気づいて驚いた。(^O^)

  $str =~ s/foo/bar/g; # perl
  str.gsub!(/foo/,"bar") # ruby
  str = str.replace( /foo/g, "bar" ); // JScript

そうか、後ろから置換するという発想自体貧困だった。
なぬ!。ってことは、連続する空行をひとつの空行にするのも、

  replaceup "^\\n\\n", "\\n", regular, inselect;
  while( result ) findup;

で良いじゃん。>自分(ToT)

では。

[ ]
RE:01822 不要な改行を削除No.01827
ひろ さん 01/03/01 18:26
 
 TAKA さん今日は、横から失礼します。ひろです。
> replaceupを使用すると、replaceallfastやreplacedownと違う結果
 これは検索においてカーソルより前か後かの違いだと思います。
 文章で書くと解りにくいので、メニューから行う場合は「置換の前に確認」
を ON、マクロでやる場合は finddown, findup にはオプションがないので、
replaceup, replacedown 等置換系のコマンドで、ask オプションを加えて
その動きを見て下さい。

[ ]
RE:01827 不要な改行を削除No.01831
TAKA さん 01/03/01 19:02
 
>> replaceupを使用すると、replaceallfastやreplacedownと違う結果
> これは検索においてカーソルより前か後かの違いだと思います。
> 文章で書くと解りにくいので、メニューから行う場合は「置換の前に確認」
>を ON、マクロでやる場合は finddown, findup にはオプションがないので、
>replaceup, replacedown 等置換系のコマンドで、ask オプションを加えて
>その動きを見て下さい。

少しタイムラグがあったかもしれませんが、「1825」の方法で気が
つきました。
いつも思うのですが、置換って奥が深いですね。
ただでさえ奥が深いのに正規表現が入るとパニック状態になったり
もします。

それにしても、今日は、チャット状態に近いですね。
#今日は平日なのに、みんな仕事や学校など大丈夫なのかな?

[ ]