タグ: EmEditor

  • お手軽ソートマクロを作った(3)

    本日の成果:お手軽ソートマクロを作った(3)

      前回改善したソートマクロに、バグというか問題点が見つかった。大文字小文字を区別しないで比較するために、全部大文字に変換してから比較するようにしたんだけど、それだと、いくつかの記号([]^_`)がアルファベットより後に並んでしまう。他の多くの記号はアルファベットより前に並ぶのでどうも違和感がある。というわけで全部大文字に変換してから比較するのではなく、全部小文字に変換してから比較するようにした。これで先述の6字は、アルファベットより前に並ぶようになった。

      しかしこれを機会に文字コード表を改めて見直してみると、記号と数字とアルファベットの並び順って実はかなり入り乱れていて醜いことになっていることが判った。個人的には、記号→数字→アルファベット の順になっているのが一番直感的かなと思うのだけど、実際には、記号→数字→記号→アルファベット大文字→記号→アルファベット小文字→記号 という具合に並んでいて、もういやーんな感じですよ。なのでこれに対する対策はとりあえず諦めることにしました。orz

      ダウンロードはこちらから。(URL前回と同)

  • お手軽ソートマクロを作った(2)

    お手軽ソートマクロを作った(2)

    本日の成果:お手軽ソートマクロ(Ignore Case版)を作った

    前回作ったソートマクロの処理を見直しして、さらに大文字小文字を区別しないタイプのソートのマクロも作ったよ。欲しい人はこちらからどうぞ。

    ↑これが
    ↑こうなる (そのまま保存すると悲しい事に)

     前回のソートマクロは、改行文字の扱いがテキトーで、ソートした部分の改行文字を常にCR+LFに置き換えてしまってた。Windowsを使っている限り、たいていの場合はそれで問題ないのだけれど、そもそもこのマクロでやりたい事はソートであって改行文字の変更ではないので、キチンと元の改行文字を保存するようにした。それから、前回は行の途中から範囲選択してソートをかけるということができたのだけれど、単純に行の途中からを切り取ってソートした結果で置き換えただけだと、ソート結果が一見おかしなことになるので、ちょっと小細工して改行文字をコッソリ挿入するようにしてた。でも、それってあまり意味がないし、今回 改行文字の種類を保存するようにしたわけだけれど、じゃあこの「小細工でコッソリ挿入する改行文字」は、CR, LF, CR+LFのどれを使えばいい? という問題も発生するので、フツーに行の途中から範囲選択されているときはメッセージを出して何もしないことにした。

     そして、大文字小文字を区別しない版のマクロも作った。自前の比較関数を用意してsort()に食わせるだけで簡単に好きな順でソートしてもらえるとは、いい時代になったものだ・・・とはいえ「大文字小文字を区別しないで比較する」というズバリそのものの関数はなく(知らないだけかも)、結局「全部大文字に変換したうえでフツーに比較」という方法でやっているので、1回比較するたびに新しいStringのオブジェクトがポコポコ生成されるという、あまり褒められない方式となっております(笑)。ソートって比較のカタマリみたいなものだからすごく効率悪そう。

     効率を重視するのだったら、ソート対象の文字列とそれを大文字化したものをペアにしたオブジェクトの配列をソートするようにした方が断然速いとおもう。

     ちなみに、上で「全部大文字に変換したうえでフツーに比較」と言ってるけれど、実際はこれだけだと例えば「AAA」と「aaa」が同じものとして扱われ、ソートしたときにどっちが先に来るか判らないので、「全部大文字に変換した上で比較」した結果が等しいときだけは、続けて大文字に変換する前の文字列同士でも比較するようにしてます。

     単純にASCIIコード順の場合、A<B<C・・・<Z<a<b<c・・・<z という順で並ぶ。大文字小文字を区別しないでソートしたい場合、A<a<B<b<C<c・・・<Z<z と並ぶのを期待するところ、油断すると A=a<B=b<C=c・・・<Z=z となってしまう、という話でした。

  • お手軽ソートマクロを作った

    本日の成果:お手軽ソートマクロを作った。

     愛用のテキストエディタであるところの、EmEditor用のマクロを作った。ソートしたい範囲を選択してマクロを呼び出すとそこだけがソートされるという単純なもの。なんだかフルセットのJavaScriptで書けてしまうのでおそれいった。

     ソート前後で、エディタの画面に表示されている範囲が極力変化しないように、またCtrl+Z一発でソート前の状態に戻せるように工夫した。

    今後の課題:

    •  Case Ignoreなソートや逆順ソートもできるといいな。でも今のようにストイックに、蹴れば即並ぶという単純さも捨て難い。

    モノは以下のとおり。

    /*
     選択範囲 またはテキスト全部をソートする
    
     2009/04/14 opa
    
     for EmEditor v5.00 or later
    */
    
    var NewLine = "rn";
    var sortText;
    var eol = false;
    var Redraw;
    var scrollY;
    
    if(document.selection.isempty){
     Window.status = "ソート範囲が選択されていません。";
    }else{
     sortText = document.selection.text.split(NewLine);
    
     if(sortText.length > 0 && sortText[sortText.length - 1] === ""){
      --sortText.length;
      eol = true;
     }
    
     if(sortText.length > 1){
      sortText.sort();
    
      Redraw = Window.Redraw;
      scrollY = Window.scrollY;
      Window.Redraw = false;
    
      document.selection.Text = sortText.join(NewLine) + (eol ? NewLine : "");
    
      Window.scrollY = scrollY;
      Window.Redraw = Redraw;
     }
    }