「Mery.iniのオプション値を取得」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
Sukemaru (トーク | 投稿記録)
編集の要約なし
3行目: 3行目:
Mery.ini ファイル内の各行<br>
Mery.ini ファイル内の各行<br>
 '''''OptionName=value''''' <br>
 '''''OptionName=value''''' <br>
の「項目名」の文字列を指定して「値」を取得するための '''組み込み用関数''' です。<br>
の「項目名 key」の文字列を指定して「値 value」を取得するための '''組み込み用関数''' です。<br>
[[includeライブラリ]] の [[includeライブラリ#MeryInfo.js|MeryInfo.js]] とは異なり、Mery.ini の任意の項目名(左辺)で検索をかけて、生の値(右辺)をそのまま取得します。
[[includeライブラリ]] の [[includeライブラリ#MeryInfo.js|MeryInfo.js]] とは異なり、Mery.ini の任意の項目名(左辺)で検索をかけて、生の値(右辺)をそのまま取得します。


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


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


: [[#関数本体|組み込み関数本体]] を任意のマクロのソースコード内にペーストして使用します。
* INI 内に同名の「項目名」がある場合は、さいしょにヒットした項目の「値」のみを返します。これは、引数の配列の要素(項目名)と戻り値の配列の要素(値)を 1 対 1 で対照させるための仕様です。
: 使い方は [[#使い方|使用例]] を参考にしてください。
 
* 「オプション項目名」の記述を間違えると ''var value = iniText.match(reg)[0]'' の行でエラーになります。これにより引数の記述のミスを指摘できるので、エラー回避の処理は入れてありません。
 
* 「Mery.exe」自体のファイル名をリネームしている場合、%AppData%\Mery\Mery.ini を参照できません(ポータブル版であれば参照可)。




* '''このマクロは Mery.ini の内容を編集(書き換え)するものではありません。
* '''このマクロは Mery.ini の内容を編集(書き換え)するものではありません。'''


* 基本的に Mery.ini は[[ヘルプ:ツール#オプション|オプション]]設定パネルを [OK] で閉じたときと Mery を終了したときにしか更新されず、標準メニューバー、ツールバーアイコン、右クリックメニュー、ショートカットキー、マクロ等でエディタの設定状態を変更しているばあい、INI の内容が最新の状態とはなりません。 <br> → かならずしもエディタの表示状態どおりの値を取得できるわけではない。
* 基本的に Mery.ini は[[ヘルプ:ツール#オプション|オプション]]設定パネルを [OK] で閉じたときと Mery を終了したときにしか更新されず、標準メニューバー、ツールバーアイコン、右クリックメニュー、ショートカットキー、マクロ等でエディタの設定状態を変更しているばあい、INI の内容が最新の状態とはなりません。 <br> → かならずしもエディタの表示状態どおりの値を取得できるわけではありません。
よって MeryInfo.js にはない項目として「行の表示方法」の取得ぐらいしか使い道がない…
: よって MeryInfo.js にはない項目として「行の表示方法」の取得ぐらいしか使い道がない…
* Mery.ini の直接編集でオプションパネルから設定変更できない「'''隠し機能'''」項目をカスタマイズしている人なら、現在の設定値の確認などにも使えるかも?
* Mery.ini の直接編集でオプションパネルから設定変更できない「'''隠し機能'''」項目をカスタマイズしている人なら、現在の設定値の確認などにも使えるかも?


=== ソースコード ===
=== ソースコード ===
61行目: 66行目:
                       .replace(/^[^=]+=(.*)$/, "$1");
                       .replace(/^[^=]+=(.*)$/, "$1");
     // 10進数なら Number 型で返す
     // 10進数なら Number 型で返す
     if ( /^-?[0-9]+$/.test( value ) ) {
     if (/^-?[0-9]+$/.test( value)) {
       value = Number( value );
       value = Number(value);
     }
     }
     dist.push(value);
     dist.push(value);
98行目: 103行目:


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

2019年4月29日 (月) 21:05時点における版

GetIniOption() 関数

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


使い方は 使用例 を参考にしてください。
  • INI 内に同名の「項目名」がある場合は、さいしょにヒットした項目の「値」のみを返します。これは、引数の配列の要素(項目名)と戻り値の配列の要素(値)を 1 対 1 で対照させるための仕様です。
  • 「オプション項目名」の記述を間違えると var value = iniText.match(reg)[0] の行でエラーになります。これにより引数の記述のミスを指摘できるので、エラー回避の処理は入れてありません。
  • 「Mery.exe」自体のファイル名をリネームしている場合、%AppData%\Mery\Mery.ini を参照できません(ポータブル版であれば参照可)。


  • このマクロは 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, type; i < iniItem.length; i ++ ) {
  type = Object.prototype.toString.call( iniValue[i] ).slice( 8, -1 );
  Alert( iniItem[i] + " = " + iniValue[i] + "\nobject type: " + type );
}


// ③-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 の文字列 "" のまま)。
スポンサーリンク