Help us understand the problem. What is going on with this article?

JScript(サクラエディタマクロ)でSetが使いたい

More than 1 year has passed since last update.

環境

サクラエディタ Ver. 2.2.0.1
Windows 10

マクロ

仕事上、サクラエディタのマクロに頼ることが多い。
サクラエディタはオールドスタイルなエディタではあるが、その中では比較的高機能だと思う。

マクロはWSHのJScriptで記述できるのだが、本流のJavaScriptではないので、最近のECMAScriptの新しい構文が軒並み使えない。

ただ、サクラエディタのマクロでは

  • 画像を出す
  • エディタのメニュー自体を拡張

みたいなところまではできないため、そこまで高機能な構文は要らない気もしている。

…のだが、非常に痒い点が1点。

Setが使えない。

Setがあると、重複行や仲間外れをどうこうする感じのマクロが非常に書きやすい。

ところで、JavaScriptにはSetによく似たものとしてオブジェクト(連想配列)がある。
そこで、キーの部分をSetとして使えば良いと考えて、Setもどきを実装してみた。

機能は限定的。中身に使える値は文字列のみ。
JSON.stringify的な何かがあれば、文字列以外も使えそうだが…(JScriptなので無い)

Setもどき&重複行削除マクロ

var pseudoSet = function( str ){
  var hash = {}

  this.add = function( str ){
    hash[ str ] = true;
  }

  this.has = function( str ){
    if( true === hash[ str ] ) {
      return true;
    }
    else {
      return false;
    }
  }

  this._delete = function( str ){
    delete hash[ str ];
  }

}


// ここからエディタマクロ
var text = GetSelectedString(0);
lines = text.split("\n");

var set = new pseudoSet();
var deleted_duplicate = [];
for( var i = 0; i < lines.length; ++i ){
  var str = lines[i];
  if( !set.has( str ) ) deleted_duplicate.push( str );
  set.add( str );
}

var outText = deleted_duplicate.join("\n");
Editor.InsText( outText );

「ツール」→「名前を指定してマクロを実行」か、「共通設定」→「マクロ」タブから登録することで実行できる。

image.png

選択行を入力とするので、入力後、カーソル選択。

入力
a
b
c
c
c

すると、以下のように出力される。
重複除去という目的は達成できた。

出力
a
b
c

集合演算(intersectionみたいなの)は別途実装すること。

前に空行区切りの2つの文字列群の積集合と差集合を取るマクロを書いたことがあったので、
良い形に直して追記したい(書けたら追記するが、未定)。

サクラエディタのヘルプ

ltzz
仕事ではバックエンドしてます。元組み込み屋。いろいろ。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away