利用者:Sukemaru
マクロライブラリに投稿したマクロ
「テキスト操作補助」 カテゴリ
- 行頭か行末 または 選択範囲の始点か終点 に移動 (last modified: 2019/03/29)
- 文書の 先頭か末尾 に移動 (last modified: 2019/03/29)
- 「対応する括弧に移動」の追加コード (last modified: 2019/05/12)
- バイト数と文字数・行数 ※イベントマクロ (last modified: 2018/11/18)
- 日付と時刻を挿入 (last modified: 2018/12/09)
- 行を複製 (複数行可) (last modified: 2019/05/07)
- 字下げ・字上げ(スペース×2 追加・削除) (last modified: 2019/04/07)
- 貼付け実行後のカーソル位置を貼付け文字列の先頭にする (added: 2018/11/14)
- 行の先頭に貼り付け (uploaded: 2018/08/24)
- 引用符/コメント ※ポップアップメニュー (last modified: 2019/04/07) ※行頭の文字列操作マクロ「引用の追加」の増補改訂版
- カッコで囲う ※ポップアップメニュー (last modified: 2019/04/07)
- カッコで囲う (簡易版 ポップアップメニューなし)
- 引用符を追加/削除 ※"二重引用符" の追加/削除トグル
- 定型文を挿入 マクロ集 (uploaded: 2018/12/03)
-
引用符/コメント
-
カッコで囲う
「ファイル操作補助」 カテゴリ
- ファイルのプロパティ (uploaded: 2018/12/18)
- ひらけゴマ! (last modified: 2019/04/07) ※選択範囲のURL・パスを開く
- ブックマーク一覧ジャンプ (通常版/include版) ※ポップアップメニュー (last modified: 2019/04/16)
- 編集モードの自動選択 または 「書き換え禁止で開く」 (通常版/include版) ※イベントマクロ (last modified: 2019/04/24)
- 特定のフォルダで「ファイルを開く」ダイアログ (last modified: 2018/12/19)
- すべて閉じる マクロ集 (last modified: 2019/05/03)
- 「他(右側/左側)のタブを閉じる」 などを追加
- ファイルを読み直す・開きなおす (通常版/include版) ※ポップアップメニュー (last modified: 2019/05/30)
- エンコード指定で読み直し・読み取り専用属性の変更・編集モードの変更・プロパティを開く・さいごに閉じたファイルを開く・etc.
- さいごに閉じたファイルを開く ※ポップアップメニュー (uploaded: 2019/04/30)
-
ブックマークジャンプ 【include版】
-
すべて閉じる: 入力ダイアログ
-
すべて閉じる: ポップアップメニュー
-
ファイルを読み直す 【通常版】
-
ファイルを読み直す 【include版】
「変換・ソート・整形」 カテゴリ
- 昇順で並び替え/降順で並び替え トグル変換 (uploaded: 2019/06/03)
- YES/NO マクロ (last modified: 2018/11/27) ※「True」 ⇔ 「False」 トグル変換
- + 改造版「ToDoリストモード[1]」 (added: 2019/05/06)
- 全角/半角 トグル変換 (last modified: 2019/05/20) ※「ABCアイウエオ」 ⇔ 「ABCアイウエオ」
- 大文字/小文字/頭文字 トグル変換 (last modified: 2019/08/29) ※「Abc」 → 「ABC」 → 「abc」 ...
- ひらがな/カタカナ変換 (uploaded: 2019/07/06) ※「あいうえお」 → 「アイウエオ」 / 「カキクケコ」 → 「かきくけこ」
- 文字列の順番を逆に書き出す (uploaded: 2019/07/06) ※「あいうえお」 → 「おえういあ」
「検索・置換」 カテゴリ
- ポップアップメニューで検索先にジャンプ (通常版/include版) (last modified: 2019/04/16)
+おまけマクロ「次の文字列を検索/前の文字列を検索 (検索オプションをリセット&強調なし)」他 - 検索ヒット数表示(選択文字列) ※イベントマクロ (last modified: 2019/07/20)
- + 機能強化版「文字数・行数・ヒット件数(選択文字列)」 ※イベントマクロ (last modified: 2019/08/28)

「プログラミング補助」 カテゴリ
- 行コメント (last modified: 2019/04/07) ※コメントマーク付け外し
「実験的マクロ・練習マクロなど」 カテゴリ
- 【自家用】 カッコをはずす & カッコを削除/追加 トグル & カッコを追加/削除 (last modified: 2019/05/03)
- 【自家用】 ファイルのフルパスをコピーして閉じる ※イベントマクロ (last modified: 2019/04/14)
- 【自家用】 行を上下に移動(Mery 2.7 用) (uploaded: 2019/05/07)
- 【自家用】 全角/半角変換 (last modified: 2019/05/11)
- 【実験】 ファイルへ移動(物理座標ジャンプ) (uploaded: 2019/05/15)
- 【実験】 位置情報を保存してから「次の文字列を検索」+復帰 (uploaded: 2019/05/28)
- 【実験】 タブが「縦書き」モードかチェックする ※組み込み用関数 (uploaded: 2019/04/29)
- サンプルコード: 「特定の条件で縦書きモードに切りかえる」(※ ver 2.6.5 - 2.7.5 用)
- 【自家用】 「クリップボード履歴」メニューのマクロ化 ※ポップアップメニュー (last modified: 2019/08/05)
※「スニペット」の機能を統合 / ※ ver 2.8.1 以降用 - 【自家用】 アクティブなタブのマクロを実行する (uploaded: 2019/08/12)
- 【自家用】行の表示方法を切り替える (last modified: 2019/08/24) ※論理行/表示行 トグル切り替え
- 【実験】 ブックマークを復元(Mery 2.7用) (last modified: 2019/04/07 → 2019/04/12 削除)

「その他」 カテゴリ
- 折り返しトグル切り替え (added: 2019/02/19 ※w/ Bleat氏)
- Mery.iniのオプション値を取得 ※組み込み用関数 (last modified: 2019/08/27)
- Mery本体のバージョンチェック ※組み込み用関数 (uploaded: 2019/04/17)
- サンプルコード: 「Begin/EndUndoGroup() メソッドを使えるのは ver 2.7.0 以降」
- IO.Serialize() の JSON を参照する ※組み込み用関数 (uploaded: 2019/04/17)
- ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する ※組み込み用関数 (uploaded: 2019/04/20)
- サンプルコード: 「すべての論理行をポップアップメニューに表示する」
-
JSON ファイルを開く
-
分割サブメニュー 1
-
分割サブメニュー 2
- キーアサイン集 (last modified: 2018/10/19 ※w/ ks氏, masme氏, 有志)
- マテリアルデザインっぽいアイコンと『小マクロ集』 (last modified: 2019/05/01) ※アイコン収録数300コ
-
アイコン 一覧画像
-
小マクロ集 アウトラインイメージ
外部サイトに投稿したマクロ
- StrConvテキスト変換メニュー (uploaded: 2018/08/25)
山本隆 氏作成の 文字変換ライブラリ StrConvDLL の機能をポップアップメニューにまとめたマクロ - gPad用 文字数・行数・ヒット数 (uploaded: 2019/08/26)
Mery 用マクロ「文字数・行数・ヒット件数(選択文字列)」を gPad 用に改編したもの
マクロ覚え書き
- リンク
拙作マクロはポップアップメニューを利用するものが多いので、Tips はその分野の内容に偏ってしまいますが…。
アイコン化したマクロ
通常、フォーカスがアウトプットバーやアウトラインペイン、検索/置換ダイアログにあると、ポップアップメニューやショートカットキーからマクロを起動することはできない。
Document オブジェクトのかわりに Editor.ActiveDocument で記述したマクロであれば、エディタ領域にフォーカスがない場合でもツールバーアイコンやマクロメニューからマクロを起動できる。
ただし、アクティブなタブ以外を操作・編集するマクロにおいては Editor.Documents.Item( dd ) などのような記述が必要。
マクロをツールバー/マクロバーから使用するために アイコン を作ったり、マクロバーにアイコンを詰め込むために 試行錯誤 したりも…。
ポップアップメニュー
オプションフラグ
PopupMenu.Add() メソッド の第三引数 Flags : int を数値化すると
meMenuChecked = 1
meMenuGrayed = 2
meMenuChecked + meMenuGrayed = 3
meMenuSeparator = 4
となるので、真偽値が true=1 / false=0 で評価されることを利用して、真偽値を返す変数や条件式を代入することができる(ただし Number 型に変換する必要がある)。
var menu = CreatePopupMenu();
var hoge = true;
var fuga = false;
menu.Add( "Hoge", 1, + hoge ); // "+" を付けて数値化すると meMenuChecked
menu.Add( "Fuga", 2, !fuga * 2 ); // (!fuga = 1) *2 なので meMenuGrayed
var num = menu.Track( mePosMouse );
アクセラレータ
ポップアップメニューのラベルの文字列に「半角アンパサンド記号(&) + 半角英数字 (またはアスキー記号)」を付記することで、アクセラレータ(アクセスキー)を設定することができる。
ラベルの先頭に連番数字などがある場合は、アンパサンド記号を付加することで、数字をアクセラレータにするとよい。
そのさい、Shift キー付きでの入力が必要な記号は Shift キーなしで入力可能なキーのラベルと同一視される (e.g. &# で "#" 記号をアクセラレータに指定した場合、JIS 配列のキーボードでは [2] キーがアクセラレータになる)。
また、"& " で半角スペースをアクセラレータに指定したアイテムは、スペースキーがアクセスキーになる。
- "&" 記号でアクセラレータ化する文字の位置は限定されないが、最初の "&" 記号のうしろの文字がアクセラレータになる。
- 全角文字はアクセラレータにできない。
- ラベル文字列に含まれる "&" 記号はエスケープされ、ポップアップメニューに表示されないので、ラベルに "&" 記号を表示させたいときは、"&&" のように二重に記述する必要がある。
→ 不特定の文字列をラベルにする場合は、あらかじめ String.replace( /&/g, "&&" ) と記述するとよい。 - 同じキーが重複してアクセラレータに指定されていると、そのキーを押した場合、アイテム間をトグル移動する(→ [Enter] キーで決定する)。
var menu = CreatePopupMenu();
var piyo = "LOVE & PEACE & ...";
menu.Add( "アイテム1(&1)", 1 ); // [1] キーがアクセラレータ
menu.Add( "アイテム&2", 2 ); // [2] キーがアクセラレータ
menu.Add( "0&3 アイテム3", 3 ); // [3] キーがアクセラレータ
menu.Add( "&Hello World &4", 4 ); // [H] キーがアクセラレータ
menu.Add( piyo.replace( /&/g, "&&" ) + "(&5)", 5 ); // [5] キーがアクセラレータ
menu.Add( piyo + "(&6)", 6 ); // スペースキーがアクセラレータ
menu.Add( "※※※※", 0, meMenuSeparator ); // meMenuSeparator があると第一引数の文字列は無視される
menu.Add( "キャンセル & ", 0 ); // スペースキーがアクセラレータ
// 5つめのアイテムは "LOVE & PEACE & ..." と表示されるが
// 6つめのアイテムは "LOVE PEACE ..." と表示される
// ※ 5つめのアイテムと最後のアイテムでアクセラレータが重複している
var ret = menu.Track();
ラベルの整形
ポップアップメニュー(警告・確認ダイアログなどもだが)は UI フォントで表示されるので、文字列が英数字の羅列の場合には読みづらい ( …と個人的に感じている)。
文書内の文字列など不特定の文字列をラベル化する「検索ジャンプ」や「ブックマークジャンプ」、「クリップボード履歴メニュー」マクロでは、読みづらい半角アルファベットや記号を全角化させるなどしている。
/**
* ポップアップメニューに表示するラベルを整形する
*
* ・行頭空白を除去
* ・空白文字を圧縮: →「›」(U+203A) に置換
* ・文字数を切り詰め(String.slice メソッド)
* ・改行記号を可視化: →「⏎」(U+23CE)に置換
* ・削られてしまう「&」を補完
* ・「¥」(U+005C) を「∖」(U+2216) に置換
* ・特殊な空白文字を豆腐に置換: →「⊠」(U+22A0) または「▯」(U+25AF)
* ・判別しづらい ascii 記号 !"%'(),.:;@[]`{|} を全角に置換
* ・「a-z」を全角に置換
*
* ※ 不要な置換については .replace( ... ) の行を 削除/コメントアウト してよい
*/
var y = Document.Selection.GetActivePointY( mePosLogical ) // 行番号
var str = Document.GetLine( y, 0 ); // 行の文字列
var menuWidth = 55; // 切り捨ての閾値
menuKey = str.replace( /^[\t ]+/, "" )
.replace( /(?:\t|[ ]{3,}|[ ]{2,})+/g, " › " )
.slice( 0, menuWidth )
.replace( /\r?\n/g, "⏎ " )
.replace( /[&]/g, "&&" )
.replace( /[\\]/g, "∖" )
.replace( /[\u00A0\u1680\u180e\u2000-\u200A\u2028\u2029\u202F\u205F\uFEFF]/g, "▯" )
.replace( /[!"%'(),.:;@\[\]`a-z{|}]/g,
function( tmp ) {
return String.fromCharCode( tmp.charCodeAt( 0 ) + 0xFEE0 )
} );
// 文字数を切り詰めた場合は「 ...」を付加
menuKey += ( str > menuWidth ) ? " ..." : "";
// アクセラレータつきの番号を付加
menuKey = "&" + y + ": " + menuKey;
// ※ 番号の 一の位 をアクセラレータにするなら
// menuKey = String( y ).replace( /\d$/, "&" + "$&" ) + ": " + menuKey;
// ※ 連番が多い場合は「番号を空白文字でケタ埋め (右端揃え)」などの処理も追加するとよい
配列からポップアップメニューを生成
for 文などのループ処理によって配列からポップアップメニューのアイテムを生成する場合に、PopupMenu.Add() メソッド の第二引数 Id (※通常は 1 ~ )と配列のアイテムのインデックス [i] の値(※通常は 0 ~ )を一致させたいときは、配列の先頭にダミーまたは空の要素を置いておき、ループ処理の開始インデックスを 1 にする。
var a = new Array( "" ); // 先頭に空のダミー要素を入れておく
a.push( "あああ" );
a.push( "いいい" );
a.push( "ううう" );
// a = [ "", "あああ", "いいい", "ううう" ] となる
var menuA = CreatePopupMenu();
for ( var i = 1; i < a.length; i ++ ) { // 開始値を 1 にすると
menuA.Add( a[i], i ); // Id を ( i + 1 ) にする必要がない
}
var num = menuA.Track( mePosMouse );
// c.f. 空要素なしの配列 [ "あああ", "いいい", "ううう" ] をループ処理する場合
var b = [ "あああ", "いいい", "ううう" ];
var menuB = CreatePopupMenu();
for ( var i = 0; i < b.length; i ++ ) {
menuB.Add( b[i], i + 1 ); // Id を 1 ~ にするには ( i + 1 )
}
サブメニュー
- 配列やオブジェクトからポップアップメニューを生成するさいにサブメニューを利用する場合、あらかじめサブメニューのラベルや各要素の振り分け方が決まっていれば難しいことはないが、要素が不定数の配列やオブジェクトをサブメニューに振り分けるのは簡単ではない。
- 「階層化マクロメニュー」マクロなどのソースコードを参考にしてコードを組むか、組み込み関数「ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する」で一定数ごとにサブメニュー項目を自動生成して要素を放り込むしかない…。
- PopupMenu.AddPopup() メソッド では Add() メソッド の第三引数(meMenuChecked, meMenuGrayed, meMenuSeparator)は使用できない。
- サブメニュー内のすべてのアイテムが無効(グレーアウト)になる条件でも、サブメニュー見出しを無効化することはできないので、サブメニュー見出しが表示されなくなるように PopupMenu.AddPopup() 周りを if() 文で囲うしかないようだ。
- 上の「自動分割サブメニュー」の組み込み関数を制作するさい、チェックつきアイテムを含むサブメニュー見出しにもチェックを付けられるようにしたかったが、これも無理だった。
マクロの動作設定を変更可能にする
拙作マクロは、ポップアップメニューを使うものにかぎらず動作設定用の項目が多い。
ポップアップメニューマクロでないものは、通常、頻繁に動作設定を弄る必要はないが、sukemaru 好みの動作方式は一般的嗜好と合致しないであろうことから公開用のマクロにするにあたってカスタマイズ可能な「設定項目」に調整しなおすことが多い。
ポップアップメニューマクロであれば、メニュー項目から動作設定をカスタマイズできるようにコーディングすることができる。
- 動作設定の変更内容はマクロの完了時に破棄されてしまうので、連続して同じマクロを利用する場合には、ソースコードの既定値を書き換えてカスタマイズしておくとよい。
- sukemaru の場合は、「検索ジャンプ」や「ブックマークジャンプ」、「読みなおし」マクロなどで、"include 版" と称するものを作っている。
- これらにおいては、include ライブラリ の IO クラス(IO.js)の Serealize / Deserialize を利用して、変更した設定値を外部ファイル(JSON ファイル)に保持できるようにしている。
- 動作設定を同じままで再実行するのも、カスタマイズしながら再実行するのも容易にはなったが、コードが煩雑になって他のマクロに流用しづらくなってしまっている…。
- ※ 非 include 版では、masme 氏のマクロのような処理コードは入れず、動作設定の変更方法はソースコードの変数の値の書き換えのみとしている。
選択範囲の 先頭位置/末尾位置
選択範囲の 開始(キャレットなし)/終了(キャレットあり) の位置は Selection.GetAnchorPos() と Selection.GetActivePos() とで取得できるが、先頭/末尾 の位置はそれらをもとにして前後関係を割りだす必要がある。
var ancPos, actPos, topPos, endPos;
ancPos = Document.Selection.GetAnchorPos(); // 選択開始位置
actPos = Document.Selection.GetActivePos(); // 選択終了位置(キャレット位置)
topPos = Math.min( ancPos, actPos ); // 選択範囲の先頭位置
endPos = Math.max( ancPos, actPos ); // 選択範囲の末尾位置
// topPos と endPos は以下のような記述でも可
topPos = ( ancPos < actPos ) ? ancPos : actPos;
endPos = ( ancPos < actPos ) ? actPos : ancPos;
スクロール位置の調整
キャレットをジャンプさせた後のスクロール位置とキャレット位置は、移動した行数がエディタの表示領域の高さに収まるかどうか(スクロールマージンの考慮が必要)とジャンプ方向によるので安定的ではない。
以下のコードは、ジャンプ後にエディタの表示領域がスクロールした場合に、キャレットが表示領域の 先頭位置(Window.ScrollY) になるように調整するもの。
var s = Document.Selection;
var ax = s.GetActivePointX( mePosLogical ); // キャレット位置の X
var ay = s.GetActivePointY( mePosLogical ); // キャレット位置の Y
var sy = ScrollY; // エディタ表示領域の先頭行(物理行番号+スクロールマージン)
// 下方向に10行(論理行)ジャンプ
s.SetActivePoint( mePosLogical, ax, ay + 10 );
// スクロールしないならそのまま / スクロールするならキャレットは表示領域の先頭に
ScrollY = ( ScrollY == sy )
? sy
: s.GetActivePointY( mePosView );
// つねにジャンプ先の行が先頭になるようスクロールさせるなら
// ScrollY = s.GetActivePointY( mePosView );
// ※ ScrollY プロパティに値を代入するときは物理座標(表示行)の行番号で
カレントディレクトリ
カレントディレクトリは、Mery を起動したときに決定され、一定ではない。
記述の都合上で相対パスを利用するマクロにおいては特定のカレントディレクトリの指定が必要な場合もあるが、あえて「流動的なカレントディレクトリ」を利用するようなマクロがほかにある(かも知れない)ことを考慮しておいたほうがよい(…とおもう)。
var fso = new ActiveXObject( "Scripting.FileSystemObject" );
var wshShell = new ActiveXObject( "WScript.Shell" );
var meryIni = Editor.FullName.replace( /exe$/, "ini" );
if ( fso.FileExists( meryIni ) ) {
// メモ帳で Mery.ini を開く
wshShell.Run( "notepad \"" + meryIni + "\"" );
}
else {
// マクロ実行前の作業フォルダを保存
var currentDir = wshShell.CurrentDirectory;
// 相対パス解決のためにカレントディレクトリを設定 e.g. %AppData%\Mery
wshShell.CurrentDirectory = wshShell.SpecialFolders( "APPDATA" ) + "\\Mery";
wshShell.Run( "notepad " + "Mery.ini" );
// マクロ実行前の作業フォルダを復帰
wshShell.CurrentDirectory = currentDir;
}
動作要件としてのバージョンチェック
Mery ベータ版で追加されたマクロ用プロパティを利用する場合は、マクロの動作要件として Mery 本体のバージョンチェックをするコードを入れておくのが無難である。
JavaScript には特定のプロパティがオブジェクト配下に定義されているかを調べる方法が色々とあるが、専用の組み込み関数 VersionCheck() を利用すれば Mery のバージョン番号を指定してのチェックができる。
外部リソースのチェック
include ライブラリ が必要なマクロの場合、ユーザー側が include ライブラリを正しく導入していることが要求される。 ユーザー側で include ライブラリが導入されていて、マクロ側で
#include "include/IO.js"
のようなプリフィクスがソースコードの先頭で宣言されていれば問題ないのだが、include ライブラリが導入されていなくても、プリフィクスを削除(コメントアウト)すればマクロがある程度動くようにコーディングすることもできる。
// #include "include/IO.js"
if ( typeof IO == "object" ) {
/* IO.js がインクルードされているときの動作 */ ;
}
else {
/* IO.js がインクルードされていないときの動作 */ ;
}
また、GetKeyState.exe のあるなしで動作内容を分けるなら、以下のようにコードを記述すればよい。
// あらかじめ変数 ctrl に 0 を代入しておく
var ctrl = 0;
// GetKeyState.exe のパスで実行ファイルの実在確認をする
var getKeyState = editor.FullName.replace( /mery\.exe$/i , "" )
+ "Macros\\GetKeyState.exe";
if ( new ActiveXObject( "Scripting.FileSystemObject" ).FileExists( getKeyState ) ) {
// GetKeyState.exe からの戻り値(Ctrl キーの押し下げ状態)を取得する
var WshShell = new ActiveXObject( "WScript.Shell" );
ctrl = WshShell.Run( "\"" + getKeyState + "\" control", 0, true );
}
if ( ctrl == 1 ) {
/* GetKeyState.exe があり、Ctrl キーが押されているとき */ ;
}
else {
/* GetKeyState.exe がない、または Ctrl キーが押されていないとき */ ;
}
Mery.ini から設定値を取得する
include ライブラリ の MeryInfo クラス (MeryInfo.js) を利用して Mery.ini からいくつかの設定項目の値や状態を取得することはできるが、制約が非常に多い。
- 取得できる項目がきわめて限定的である
- 取得する項目が複数あると、その都度 Mery.ini 全体の読み込みが発生する(キャッシュ可)
- Mery.exe のファイル名を変更 (e.g. Mery_hoge.exe) している場合、MeryInfo.js のコードを改変しないと Mery.ini (Mery_hoge.ini) のパスを得られない。
拙作の組み込み関数 GetIniOption() と GetIniOption2() はこれらの制約を受けず、とくに後者は Mery.ini のすべての項目にアクセスして値を取得することができる。
ただし、制約がない代わりに組み込み関数自体のコードが長いことや、引数や戻り値が配列であることでコードが煩雑にならざるをえない(配列を使用することで、複数の項目を取得する場合でも Mery.ini ファイルの読み込みを1回におさえられる)。
また、Mery.ini 側の仕様として、
「オプション」など各種の設定ダイアログを [OK] ボタンで閉じたときか、エディタウインドウ本体を閉じたときにしか Mery.ini への書き込みがされないため、メニュー項目/ツールバーアイコン/ショートカットキー などで設定を変更した場合には Mery.ini に直ちに反映されない
という制約がある(Mery.ini の実体ファイルへの書き込み回数を減らすための仕様)。
エディタの表示状態をトグル切り替えするコマンド(縦書き、色の反転、各種ツールバー、全画面表示、etc. ...)については、マクロから「現在の表示状態」を取得する手段がなく、組み込み関数で Mery.ini から読み込んでも「最新の設定状態」を取得できるわけではない…。
現在の表示状態を取得してから ON/OFF を指定しての切り替えを行なうためには、include ライブラリの IO クラスを利用するなどして外部に Mery.ini とは別の設定ファイル (e.g. JSON ファイル) を利用して、切り替え実行のたびに設定ファイルを読み書きする必要がある。
この場合、外部ファイルに設定内容をあずける項目の切り替えについては必ずマクロ経由で行なわなければならず、デフォルトの メニュー項目/ツールバーアイコン/ショートカットキー などから切り替えをすると最新の設定状態とマクロの設定ファイルとのあいだに齟齬が生じてしまう。
警告・確認ダイアログとステータスバーの使い分け
マクロからユーザーにメッセージを与える手段として 警告(Window.Alert)・確認(Window.Confirm)ダイアログと ステータスバー(Window.Status)での表示などがある(ほかに アウトプットバー(OutputBar.Write)やポップアップメニューを使う方法もある)。
Mery のマクロで利用できるダイアログは、両方ともサウンドが発生し、ボタン操作で閉じるまで作業を中断させてしまうものなので、あえて作業を一時停止させる必要がある場面以外ではステータス表示を使用するのがよい。
※ ユーザー側がステータス表示を使用するイベントマクロなどを別途で導入していることを考慮すると、マクロの終了時になんらかのイベントが発生するマクロの場合、重要なメッセージはダイアログで出力させるか、マクロ内の動作設定用の変数で出力方法を選択できるようにしておくとなお良い。
Mery の Window クラスのメソッド・プロパティを使うほかにも、WSH の WshShell.Popup メソッド によるメッセージボックス利用することもできる。
ダイアログ内の左側のアイコンや [OK], [キャンセル], [はい], [いいえ] などのボタンの種類をカスタマイズでき、指定時間の経過後に自動で閉じさせることもできるが、引数の指定や戻り値の処理が煩雑なので、あまりお勧めはできない…。
エラー処理
Mery のマクロでエラーが発生した場合、ダイアログのポップアップにより中断される。
マクロの開発者側にとってはソースファイル内の例外が発生した行に速やかにアクセスできるので便利ではあるが、コードを読むのに不慣れなユーザーにおいてはソースコードを開いたところで何が解決するわけでもない。
エラーダイアログは自家用マクロのメンテナンスには有用であるが、公開用のマクロの場合はユーザーがソースコードに誤った改変を加えてしまうおそれもあり、基本的に必要性がない。
例外が発生することが予期できたり、例外が発生してもそれを無視してマクロの実行を継続したり回避用の処理に移行させられる場合は、JavaScript の [try...catch 文 を組み込むとよい。
// e.g. コピーや上書き保存のようなファイルシステムを操作するマクロは
// アクセス権限不足や読取専用ファイルへの書き込みなど
// ユーザーの実行環境により例外が発生する可能性がある
try {
/*
* 例外が発生する可能性のあるコード
* (例外が発生しなかったときはそのまま処理される)
*
* ※ このブロック内で例外が発生したとき
* 原因箇所より後ろのコードは処理されず
* catch や finally ブロックにジャンプする
*/ ;
}
catch( e ) {
/*
* 例外が発生したときにだけ実行されるコードブロック
* (例外が発生しなかったときは処理されない)
*
* エラーの内容を特定して予期できるなら
* catch( e if e == hoge ) { ... ; }
* catch( e if e == fuga ) { ... ; }
* catch( e.number == -xxxxxxxxxx ) { ... ; }
* のように列記して処理を分岐させてもよい。
* ※ if を使う場合、カッコ () や else は記述不要
*
* ・Alert(), Confirm() や Status= でメッセージを表示させたり
* 回避処理用のコードを記述したりしてもよい。
* ・Quit() だけ記述しておいて、エラーダイアログなしで
* マクロを終了させてもよい。
* ・セミコロンだけおいて {;} とすれば、エラーを無視して
* catch(e) {;} よりうしろのコードを処理させることもできる。
*/ ;
}
finally {
/*
* 例外が発生してもしなくても処理されるコード
* (例外が発生したときは catch ブロックの後に実行される)
* ※ finally{} ブロックはまるごと省略可
*
* Scripting.FileSystemObject や ADODB.Stream でファイルを開いている場合は
* ここでリソースを解放してやるとよい。
*
* try ... catch 文を関数コード function(){ ... } 内においている場合は
* return piyo;
* などで戻り値を返してやってもよい。
*
* ※ catch ブロックで Quit(); や return ***; を記述している場合は
* エラーが発生したときに finally ブロックは処理されない
*
*/ ;
}
/*
* 上で Quit(); や return ***; を記述していない場合は
* try ... catch 文のあとのコードも処理される
*/ ;
その他、拙作マクロについて
- sukemaru の Mery 運用環境はロースペックの Windows XP sp3 (32bit), JScript 5.8.20587 のノート PC です。
- ※ 制作したマクロの動作テストは、この XP 機でしかおこなっていません。
- ※ マクロの動作テストに使用している Mery のバージョンは、最新の "ベータ版" (または最新の "正式版" ver. 2.6.7) のみです。基本的に ver 2.6.7 以降のバージョンで動作するように作成していますので、ver 2.6.6 以前のバージョンでの利用を想定していません(2.6.6 以下での動作確認をしていません)。
- ※ ZIP 版の Mery でマクロを作成・運用しているので、インストーラ版では正しく動作しないマクロがあるかもしれません。
- ※ 開発環境が Windows XP なので、変数はすべて var で宣言し、JScript 5.8 の環境で実行できるようにコーディングしています。
- Mery のオプション設定で「行の表示方法=論理座標(論理行)」の状態で運用する前提でマクロを作っています。公開しているマクロでは、「表示座標(表示行)」ベースで Mery を運用している場合でも利用できるように設定項目(変数)を設けるか「行の表示方法」を自動判定するコードを追加していますが、動作が不完全になったり処理がおそくなったりすることがあります。
- ※「表示座標(表示行)」ベースでの動作テストはほとんどしていません。
- ソースコード内ではしばしば unicode 文字を使用していますので、マクロの JS ファイルは UTF-8 形式で保存する前提となっています。
- ソースコード内の変数名の検索などで「ポップアップメニューで検索先にジャンプ」マクロを利用しやすいように(個人的にタグジャンプ系のマクロに馴染めないので)、マクロのコードには半角空白を多用しています。
- 基本的に、変数名は頭文字が小文字の camelCase に、関数名は頭文字が大文字の TitleCase にしてあります。
- 「include ライブラリ (作成: ks 氏)」を利用する【include 版】と利用しない【通常版】とがあるマクロでは、include 版(←自家用)を優先的にメンテ・更新しています。
- 外部実行ファイル「GetKeyState.exe (作成: pizz 氏)」の導入が必要なものもあります。[2]
- ポップアップメニューマクロの「設定変更サブメニュー」など、複数のマクロで共通の自作関数を使用しているものがありますが、当面は「include ライブラリ」のような外部ファイルにまとめる予定なしです。
- ※ すでに公開しているマクロが多いこと、公開用と自家用とでコードの内容がちがうマクロが複数あること、それぞれのマクロごとに関数のコードに改変をくわえていることなどの理由で、関数・クラスを統一しなおして更新メンテするのが困難。
- 「マテリアルデザインっぽいアイコン」は、sukemaru の自作マクロと、sukemaru がマクロライブラリからダウンロードして利用しているマクロを対象として制作しています。
投稿した構文ファイル
- Mery MSY (uploaded: 2018/09/05)
- Mery の MSY 構文ファイル用
- Mery Macro JS (last modified: 2018/11/10)
- マクロの JS ファイル(JScript)用
- JavaScript 用構文ファイル/入力補完用辞書/スペルチェック用辞書/おまけマクロ を同梱
- ※ Web 開発向けのキーワードは未収録
- JaneStyle (正規表現用) (uploaded: 2018/08/31)
- ReplaceStr.txt / ImageViewURLReplace.dat / URLExec.dat / command.dat に対応
- ※ bregonig の正規表現のハイライト可 (基本的に onigmo の正規表現にも利用可)
スクショ
- マクロバーのアイコン化
マクロバー (1段目) にアイコンを詰めこむための sukemaru の試行錯誤の遍歴...
- 共通
- Windows XP (Classic テーマ)
- ウインドウサイズ (幅): 約 970 px
- アイコンサイズ: 中 (24px)
- アイコン:マテリアルデザインっぽいアイコン
- 標準ツールバー (2段目) のアイコン数: 28 コ
- Ver. 2.8.0(2019/06/22)
- Ver. 2.7.8(2019/06/13)
- Ver. 2.7.4 まで(2019/05/05)


