行の表示方法を切り替える
概要
「オプション」ダイアログを開いて「行の表示方法」の設定を切り替えます。
「オプション」ダイアログは自動的に閉じられて、「行の表示方法」の変更が適用されます。
- 非正規メソッド 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)
- 初版
スポンサーリンク