Mery.iniのオプション値を取得

提供:MeryWiki
2019年4月29日 (月) 20:18時点におけるSukemaru (トーク | 投稿記録)による版 (→‎メモ)
ナビゲーションに移動 検索に移動

GetIniOption() 関数

Mery.ini ファイル内の各行
 OptionName=value
の「項目名」の文字列を指定して「値」を取得するための 組み込み用関数 です。
includeライブラリMeryInfo.js とは異なり、Mery.ini の任意の項目名(左辺)で検索をかけて、生の値(右辺)をそのまま取得します。

※ 2019/04/28: 2 バイト文字の「値」を読みこめなかったので修正


組み込み関数本体 を任意のマクロのソースコード内にペーストして使用します。
使い方は 使用例 を参考にしてください。


  • このマクロは Mery.ini の内容を編集(書き換え)するものではありません。
  • 基本的に Mery.ini はオプション設定パネルを [OK] で閉じたときと Mery を終了したときにしか更新されず、標準メニューバー、ツールバーアイコン、右クリックメニュー、ショートカットキー、マクロ等でエディタの設定状態を変更しているばあい、INI の内容が最新の状態とはなりません。
    → かならずしもエディタの表示状態どおりの値を取得できるわけではない。

よって MeryInfo.js にはない項目として「行の表示方法」の取得ぐらいしか使い道がない…

  • Mery.ini の直接編集でオプションパネルから設定変更できない「隠し機能」項目をカスタマイズしている人なら、現在の設定値の確認などにも使えるかも?

ソースコード

// #title="Mery.ini のオプション値を取得"

/**
 * 組み込み関数 GetIniOption( array )
 * 引数で指定した任意の INI オプション項目の「値」を返す
 *
 * ※ 引数は INI オプション項目名を列挙した配列
 *   [ "HogeHoge", "FugaFuga", "PiyoPiyo" ] を指定すること。
 * → 戻り値 も INI オプション項目の値を並べた 配列。
 *   (各要素は 数値 または 文字列)
 */
// ---------- ▼ 組み込み関数 ココから ▼ ----------

function GetIniOption( array ) {
  // var start = new Date();
  var Fso = new ActiveXObject("Scripting.FileSystemObject");
  
  // Mery.ini を探す
  var iniPath = editor.FullName.replace(/\.exe$/i, ".ini");
  if (!Fso.FileExists(iniPath)) {
    var WshShell = new ActiveXObject("WScript.Shell");
    iniPath = WshShell.ExpandEnvironmentStrings("%APPDATA%\\Mery\\Mery.ini");
  }
  // Mery.ini を読みこむ
  var Adodb = new ActiveXObject("ADODB.Stream");
  var adTypeText = 2, adReadAll = -1;
  Adodb.Type = adTypeText;
  Adodb.Charset = "UTF-8";
  Adodb.Open();
  Adodb.LoadFromFile(iniPath);
  var iniText = Adodb.ReadText(adReadAll).replace(/\r\n?/g, "\n");
  Adodb.Close();
  
  // 引数の配列をループ処理して ini からオプションの値を取得する
  for (var i = 0, len = array.length, dist = [], reg; i < len; i++) {
    reg = new RegExp("^" + array[i] + "=.*$", "igm");
    var value = iniText.match(reg)[0]
                       .replace(/^[^=]+=(.*)$/, "$1");
    // 10進数なら Number 型で返す
    if ( /^-?[0-9]+$/.test( value ) ) {
      value = Number( value );
    }
    dist.push(value);
  }
  
  // Status = ((new Date() - start) / 1000).toFixed(3) + " 秒";
  return dist;
}

// ---------- ▲ 組み込み関数 ココまで ▲ ----------

使い方

/**
 * 【使い方】
 *
 * GetIniOptions() 関数の使用は1回で済ませないと
 * その都度 INI ファイルの読み込みが発生してマクロの処理速度が落ちるので
 * 取得したい項目すべてをひとつの配列にまとめること
 *
 * ※ INI のオプション項目名の記述を間違えるとエラーになる
 */

// ① 取得したい INI オプション項目を ["配列"] に列挙する
var iniItem = [ "LineColumnView", "WrapMode", "QuoteCharacter", "TabColumns", "AutoIndent" ];

// または
var iniItem = new Array( "LineColumnView", "WrapMode", "QuoteCharacter", "TabColumns", "AutoIndent" );


// ② GetIniOption() 関数の引数に配列を指定する (※返り値も配列)
var iniValue = GetIniOption( iniItem );


// ③-1. (例1)取得したオプションをダイアログで順々に表示する
for ( var i = 0; i < iniItem.length; i ++ ) {
  Alert( iniItem[i] + " = " + iniValue[i] );
}


// ③-2. (例2)個々の値は戻り値の配列のインデックス番号で要素を指定する
var settings = {
  lineColumnView: iniValue[0],
  wrapMode: iniValue[1],
  quoteCharacter: iniValue[2],
  tabColumns: iniValue[3],
  autoIndent: iniValue[4]
};

Alert( "行の表示方法: " + 
  ( settings.lineColumnView == 1 ? "表示行" : "論理行" )
);


// ③-3. (注)取得したいオプション項目がひとつだけの場合も、["配列"] のかたちで記述すること
Alert( GetIniOption( ["LineColumnView"] ) );

メモ

  • 2019/03/10 sukemaru
将来的に、INI を最新の状態に強制更新したり INI の設定項目を取得できる専用メソッドが実装されるかもしれませんし、現状でも includeライブラリ(MeryInfo.js)でもある程度 INI へのアクセスはできますが…。
(また、includeライブラリ(IO.js)の使用のみでエディタの表示状態を変更するマクロの例として「折り返しトグル切り替え」などもあります。)
※ INI アクセスの専用メソッドについてはフォーラム内の「マクロコマンドから「表示」の「色の反転」を取得したい」のトピック内で検討・議論されていますので、ご参考まで。
  • 2019/04/28 sukemaru
2 バイト文字の「文字列値」を正常に読みこめなかったので、"ADODB.Stream" / UTF-8 での読みこみに変更した。
  • 2019/04/29 sukemaru
値が「-」のときに NaN になっていたのを文字列 "-" で返すように修正(値が空のときは長さ 0 の文字列 "" のまま)。
スポンサーリンク