行の表示方法を切り替える

概要 編集

「オプション」ダイアログを開いて「行の表示方法」の設定を切り替えます。
「オプション」ダイアログは自動的に閉じられて、「行の表示方法」の変更が適用されます。

  • 非正規メソッド ExecuteCommandByID( 2177 ) で「オプション」ダイアログを開き、VBScript 経由で「行の表示方法(&D)」のアクセラレータ Alt+D と、ドロップダウンリストのアイテムを選択するための矢印キー のいずれかと、設定の変更を確定するための Enter キーを送信します。
  • マクロ本体となる JavaScript ファイルと、キーストロークを送信するための VBScript ファイル×2 が必要です。
「マクロのカスタマイズ」に登録する必要があるのは、"行の表示方法を切り替える.js" ファイルだけです。
VBScript ファイル×2 は、JS ファイルと同じディレクトリに配置してください。
※ VBScript ファイル×2 のファイル名を変更する場合は、"行の表示方法を切り替える.js" 内のコードも書き替えなければなりません。
※ VBScript ファイル×2 には、500 ミリ秒の遅延を仕込んでありますが、環境によってはもっと長い遅延が必要になる場合もあります(セキュリティソフトによるスクリプトチェック/ブロックなどが障害となる場合もあります)。
また、システムがビジー状態で「オプション」ダイアログが開かれるまでに 500 ミリ秒を経過してしまった場合も、「行の表示方法の切り替え」に失敗します。
→ 失敗したときは「オプション」ダイアログが開かれたままになります。
  • このマクロは、Mery.ini の「読み込み」と「書き換え」をします。
※「読み込み」は、マクロ起動時点での「行の表示方法」を取得するためのものです。
※「書き込み」は、「オプション」ダイアログで「行の表示方法」の変更をして「OK」ボタンを押したさいに発生するものです(← VBScript からの Enter キーの送信で自動的に「OK」を適用します)。
※ 素早く 連続で このマクロを実行すると、ファイルアクセスに失敗してエラーを引き起こす可能性があります。
  • 将来的に Mery 本体の仕様変更によって「オプション」ダイアログの「行の表示方法」の変更のためのキー操作も変更される可能性があります。

ダウンロード 編集

ファイル:行の表示方法を切り替える.zip」 (2019-08-25 更新)

  • 行の表示方法を切り替える.js
  • SendKeys( Alt+D, Up, Enter ).vbs
  • SendKeys( Alt+D, Down, Enter ).vbs

ソースコード 編集

行の表示方法を切り替える.js 編集

#title = "行の表示方法を切り替える"
#tooltip = "論理行表示 と 物理行表示 を切り替える"

/**
 * sukemaru, (2019-08-24 - 2019-08-25)
 * 
 * 「オプション」ダイアログを開いて「行の表示方法」の設定値を切り替える
 * 
 * ※ 推奨要件: Mery Ver 2.7.5 ~
 * 
 * ※ 別途、キーストロークを送信するための VBScript ファイル×2 が必要
 * (このマクロの実体ファイルと同じフォルダに配置すること)
 * 
 * ※ CPU がビジー状態の場合は、キー送信までの遅延が不十分で失敗するかも
 */

// ---------- ▼ 設定項目 ▼ ----------

// Sleep(500) と SendKeys() を仕込んだ VBS のファイル名
var upVbs = "SendKeys( Alt+D, Up, Enter ).vbs";
var dnVbs = "SendKeys( Alt+D, Down, Enter ).vbs";

// ---------- ▲ 設定項目 ▲ ----------


// 行の表示方法を取得
var lineColumnView = ( GetIniOptionNum( "LineColumnView" ) == 1 );

// Sleep(500) と SendKeys() を仕込んだ VBS ファイルのフルパス
var vbs = ScriptFullName.slice( 0, - ScriptName.length )
        + ( lineColumnView ? dnVbs : upVbs );

var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
if ( Fso.FileExists( vbs ) ) {

  // キー送信のタイミング失敗時のための保険
  var d = editor.ActiveDocument;
  var s = d.selection;
  var act = s.GetActivePos();
  var anc = s.GetAnchorPos();
  var dReadOnly = d.ReadOnly;
  var dLength = d.Text.length;
  var requirement =  VersionCheck( "2.7.5" );
  // 書き込み禁止にしてエディタ内で改行(Enter)するのを防ぐ
  if ( requirement ) {
    d.ReadOnly = true;
  }

  // VBS ファイルを呼び出す
  var WshShell = new ActiveXObject( "WScript.Shell" );
  WshShell.Run( "WScript.exe \"" + vbs + "\"" );
  
  // 「オプション」パネルを開く
  editor.ExecuteCommandByID( MEID_TOOLS_OPTIONS = 2177 );

  // 保険を適用
  if ( requirement ) {
    d.ReadOnly = dReadOnly;
  }
  else if ( d.Text.length != dLength ) {
    d.Undo();
  }
  d.selection.SetActivePos( act );
  d.selection.SetAnchorPos( anc );
}


// 関数 GetIniOptionNum( key )
function GetIniOptionNum( key ) {
  // Mery.ini を探す
  var iniPath = editor.FullName.replace( /\.exe$/i, ".ini" );
  var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
  if ( ! Fso.FileExists( iniPath ) ) {
    var iniName = /\\([^\\]+)\.exe$/.exec( editor.FullName )[1];
    var WshShell = new ActiveXObject( "WScript.Shell" );
    iniPath = WshShell.SpecialFolders( "APPDATA" )
            + "\\Mery\\" + iniName + ".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 );
  Adodb.Close();

  // ini から引数で指定したオプションの値を取得する
  var reg = new RegExp( "^" + key + "=[^\\r\\n]*$", "gm" );
  var value = iniText.match( reg )[0].substr( key.length + 1 );
  iniText = "";
  // Number 型で返す
  return Number( value );
}

// 関数 VersionCheck( versionStr )
function VersionCheck( versionStr ) {
  var Pad2 = function( str ) {
    return str.replace( /[0-9]+/g , function( digit ) {
      return digit.length < 2 ? "0" + digit : digit
    } )
  };
  var editorVer = + ( Pad2( editor.Version ).replace( /\./g, "" ).slice( 0, 6 ) );
  var requirement = + ( Pad2( versionStr ).replace( /\./g, "" ).slice( 0, 6 ) );
  return ( editorVer >= requirement );
}

SendKeys( Alt+D, Up, Enter ).vbs 編集

set WshShell = WScript.CreateObject("WScript.Shell")

' 500 ミリ秒の遅延
WScript.Sleep 500
' Alt+D, Up, Enter
WshShell.SendKeys "%D{UP}~"

SendKeys( Alt+D, Down, Enter ).vbs 編集

set WshShell = WScript.CreateObject("WScript.Shell")

' 500 ミリ秒の遅延
WScript.Sleep 500
' Alt+D, Up, Enter
WshShell.SendKeys "%D{DOWN}~"

変更履歴 編集

  • 1.0.1 (2019-08-25)
    • システムがビジー状態のときにキー送信がエディタ内に作用して改行してしまう不具合に対策
    • VBS ファイルが拡張子「.VBS」の既定のプログラムではなく、WScript.exe で実行されるよう修正
  • 1.0.0 (2019-08-24)
    • 初版
スポンサーリンク