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

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
Sukemaru (トーク | 投稿記録)
更新
5行目: 5行目:
の「項目名」の文字列を指定して「値」を取得するための '''組み込み用関数''' です。<br>
の「項目名」の文字列を指定して「値」を取得するための '''組み込み用関数''' です。<br>
[[includeライブラリ]] の [[includeライブラリ#MeryInfo.js|MeryInfo.js]] とは異なり、Mery.ini の任意の項目名(左辺)で検索をかけて、生の値(右辺)をそのまま取得します。
[[includeライブラリ]] の [[includeライブラリ#MeryInfo.js|MeryInfo.js]] とは異なり、Mery.ini の任意の項目名(左辺)で検索をかけて、生の値(右辺)をそのまま取得します。
※ 2019/04/28: 2 バイト文字の「値」を読みこめなかったので修正




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


function GetIniOption( array ) {
function GetIniOption( array ) {
   // var start = new Date();
   // var start = new Date();
   var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
   var Fso = new ActiveXObject("Scripting.FileSystemObject");
    
    
   // Mery.ini を探す
   // Mery.ini を探す
   var iniPath = editor.FullName.replace( /\.exe$/i , ".ini" );
   var iniPath = editor.FullName.replace(/\.exe$/i, ".ini");
   if ( ! Fso.FileExists( iniPath ) ) {
   if (!Fso.FileExists(iniPath)) {
     var WshShell = new ActiveXObject( "WScript.Shell" );
     var WshShell = new ActiveXObject("WScript.Shell");
     iniPath = WshShell.ExpandEnvironmentStrings( "%APPDATA%\\Mery\\Mery.ini" );
     iniPath = WshShell.ExpandEnvironmentStrings("%APPDATA%\\Mery\\Mery.ini");
   }
   }
   // Mery.ini を読み込む
   // Mery.ini を読みこむ
   var iniFile = Fso.OpenTextFile( iniPath, 1 );
   var Adodb = new ActiveXObject("ADODB.Stream");
   var iniText = iniFile.ReadAll();
  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, dist = []; i < array.length; i ++ ) {
   for (var i = 0, len = array.length, dist = [], reg; i < len; i++) {
     var value = iniText.match( new RegExp( "^" + array[i] + "=.*$" , "igm" ) )
     reg = new RegExp("^" + array[i] + "=.*$", "igm");
                      .shift()
    var value = iniText.match(reg)[0]
                       .replace( /^.*?=(.*)/ , "$1" )
                       .replace(/^[^=]+=(.*)$/, "$1");
                      .replace( /[\r\n]*/g , "" );
     if (value.match(/^[\-0-9]+$/)) {
     if ( value.match( /^[\-0-9]+$/ ) ) {
       value = Number(value);
       value = Number( value )
     }
     }
     dist.push( value );
     dist.push(value);
   }
   }
    
    
  iniFile.Close();
   // Status = ((new Date() - start) / 1000).toFixed(3) + " 秒";
   // Status = ( ( new Date() - start ) /1000 ) +"秒";
   return dist;
   return dist;
}
}


// ---------- 組み込み関数 ココまで ▲ ----------
// ---------- 組み込み関数 ココまで ▲ ----------
</source>
</source>


72行目: 79行目:
  *
  *
  * GetIniOptions() 関数の使用は1回で済ませないと
  * GetIniOptions() 関数の使用は1回で済ませないと
  * その都度 INI ファイルの読み込みが発生し処理速度が落ちるので
  * その都度 INI ファイルの読み込みが発生してマクロの処理速度が落ちるので
  * 取得したい項目すべてをひとつの配列にまとめること
  * 取得したい項目すべてをひとつの配列にまとめること
  *
  *
89行目: 96行目:




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




// ③-2. (例)個々の値は戻り値の配列のインデックス番号で要素を指定する
// ③-2. (例2)個々の値は戻り値の配列のインデックス番号で要素を指定する
var settings = {
var settings = {
   lineColumnView: iniValue[0],
   lineColumnView: iniValue[0],
115行目: 122行目:
=== メモ ===
=== メモ ===
* 2019/03/10 sukemaru
* 2019/03/10 sukemaru
: 将来的に、INI を最新の状態に強制更新したり INI の設定項目を取得できる専用メソッドが実装されるかもしれませんし、現状でも [[includeライブラリ]](MeryInfo.js)でもある程度 INI へのアクセスはできますが…。 <br> (また、[[includeライブラリ]](IO.js)の使用のみでエディタの表示状態を変更するマクロの例として「[[折り返しトグル切り替え]]」などもあります。) <br> ※ INI アクセスの専用メソッドについては[https://www.haijin-boys.com/discussions フォーラム]内の「[https://www.haijin-boys.com/discussions/4081 マクロコマンドから「表示」の「色の反転」を取得したい]」のトピック内で検討・議論されていますので、ご参考まで。
: 将来的に、INI を最新の状態に強制更新したり INI の設定項目を取得できる専用メソッドが実装されるかもしれませんし、現状でも [[includeライブラリ]](MeryInfo.js)でもある程度 INI へのアクセスはできますが…。 <br> (また、includeライブラリ(IO.js)の使用のみでエディタの表示状態を変更するマクロの例として「[[折り返しトグル切り替え]]」などもあります。) <br> ※ INI アクセスの専用メソッドについては[https://www.haijin-boys.com/discussions フォーラム]内の「[https://www.haijin-boys.com/discussions/4081 マクロコマンドから「表示」の「色の反転」を取得したい]」のトピック内で検討・議論されていますので、ご参考まで。
* 2019/04/28 sukemaru
: 2 バイト文字の「文字列値」を正常に読みこめなかったので、"ADODB.Stream" / UTF-8 での読みこみに変更した。

2019年4月28日 (日) 19:28時点における版

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");
    if (value.match(/^[\-0-9]+$/)) {
      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 での読みこみに変更した。
スポンサーリンク