「利用者:Sukemaru」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
Sukemaru (トーク | 投稿記録)
編集の要約なし
2行目: 2行目:


== 「テキスト操作補助」 カテゴリ ==
== 「テキスト操作補助」 カテゴリ ==
*[[行頭か行末 または 選択範囲の始点か終点|行頭か行末 または 選択範囲の始点か終点 に移動]] (last modified: 2019/03/29)
* [[行頭か行末 または 選択範囲の始点か終点|行頭か行末 または 選択範囲の始点か終点 に移動]] (last modified: 2019/03/29)
*[[文書の先頭か末尾|文書の 先頭か末尾 に移動]] (last modified: 2019/03/29)
* [[文書の先頭か末尾|文書の 先頭か末尾 に移動]] (last modified: 2019/03/29)
*[[対応する括弧に移動#範囲選択の拡張|「対応する括弧に移動」の追加コード]] (last modified: 2019/05/12)
* [[対応する括弧に移動#範囲選択の拡張|「対応する括弧に移動」の追加コード]] (last modified: 2019/05/12)
*[[バイト数#バイト数と文字数・行数|バイト数と文字数・行数]] ※イベントマクロ (last modified: 2018/11/18)
* [[バイト数#バイト数と文字数・行数|バイト数と文字数・行数]] ※イベントマクロ (last modified: 2018/11/18)
*[[日付と時刻を挿入#sukemaru 版|日付と時刻を挿入]] (last modified: 2018/12/09)
* [[日付と時刻を挿入#sukemaru 版|日付と時刻を挿入]] (last modified: 2018/12/09)
*[[行を複製 (複数行可)]] (last modified: 2019/05/07)
* [[行を複製 (複数行可)]] (last modified: 2019/05/07)
*[[字下げ・字上げ#sukemaru 版|字下げ・字上げ(スペース×2 追加・削除)]] (last modified: 2019/04/07)
* [[字下げ・字上げ#sukemaru 版|字下げ・字上げ(スペース×2 追加・削除)]] (last modified: 2019/04/07)
:[[字下げ・字上げ#インデント|インデント/逆インデント]]
: [[字下げ・字上げ#インデント|インデント/逆インデント]]
*[[貼付け実行後のカーソル位置を貼付け文字列の先頭にする#sukemaru 版|貼付け実行後のカーソル位置を貼付け文字列の先頭にする]] (added: 2018/11/14)
* [[貼付け実行後のカーソル位置を貼付け文字列の先頭にする#sukemaru 版|貼付け実行後のカーソル位置を貼付け文字列の先頭にする]] (added: 2018/11/14)
*[[行の先頭に貼り付け]] (uploaded: 2018/08/24)
* [[行の先頭に貼り付け]] (uploaded: 2018/08/24)
*[[引用符/コメント]] ※ポップアップメニュー (last modified: 2019/04/07)  ※行頭の文字列操作マクロ「引用の追加」の増補改訂版
* [[引用符/コメント]] ※ポップアップメニュー (last modified: 2019/04/07)  ※行頭の文字列操作マクロ「引用の追加」の増補改訂版
*[[カッコで囲う]] ※ポップアップメニュー (last modified: 2019/04/07)
* [[カッコで囲う]] ※ポップアップメニュー (last modified: 2019/04/07)
:[[カッコで囲う#カッコで囲う (ポップアップメニューなし)|カッコで囲う (簡易版 ポップアップメニューなし)]]
: [[カッコで囲う#カッコで囲う (ポップアップメニューなし)|カッコで囲う (簡易版 ポップアップメニューなし)]]
:[[カッコで囲う#引用符を追加/削除|引用符を追加/削除]]  ※"二重引用符" の追加/削除トグル
: [[カッコで囲う#引用符を追加/削除|引用符を追加/削除]]  ※"二重引用符" の追加/削除トグル
*[[定型文を挿入|定型文を挿入 マクロ集]] (uploaded: 2018/12/03)
* [[定型文を挿入|定型文を挿入 マクロ集]] (uploaded: 2018/12/03)
<br>
<br>
<gallery heights=192px>
<gallery heights=192px>
24行目: 24行目:


== 「ファイル操作補助」 カテゴリ ==
== 「ファイル操作補助」 カテゴリ ==
*[[ファイルのプロパティ]] (uploaded: 2018/12/18)
* [[ファイルのプロパティ]] (uploaded: 2018/12/18)
*[[選択範囲のURL・パスを開く|ひらけゴマ!]] (last modified: 2019/04/07) ※選択範囲のURL・パスを開く
* [[選択範囲のURL・パスを開く|ひらけゴマ!]] (last modified: 2019/04/07) ※選択範囲のURL・パスを開く
*[[ブックマーク一覧ジャンプ#sukemaru 版|ブックマーク一覧ジャンプ]] (通常版/include版) ※ポップアップメニュー (last modified: 2019/04/16)
* [[ブックマーク一覧ジャンプ#sukemaru 版|ブックマーク一覧ジャンプ]] (通常版/include版) ※ポップアップメニュー (last modified: 2019/04/16)
*[[編集モードの自動選択]] または 「'''書き換え禁止で開く'''」 (通常版/include版) ※イベントマクロ (last modified: 2019/04/24)
* [[編集モードの自動選択]] または 「'''書き換え禁止で開く'''」 (通常版/include版) ※イベントマクロ (last modified: 2019/04/24)
*[[特定のフォルダで「ファイルを開く」ダイアログ]] (last modified: 2018/12/19)
* [[特定のフォルダで「ファイルを開く」ダイアログ]] (last modified: 2018/12/19)
*[[すべて閉じる|すべて閉じる マクロ集]] (last modified: 2019/05/03)
* [[すべて閉じる|すべて閉じる マクロ集]] (last modified: 2019/05/03)
:「他(右側/左側)のタブを閉じる」 などを追加
: 「他(右側/左側)のタブを閉じる」 などを追加
*[[ファイルを読み直す・開きなおす]] (通常版/include版) ※ポップアップメニュー (last modified: 2019/05/30)
* [[ファイルを読み直す・開きなおす]] (通常版/include版) ※ポップアップメニュー (last modified: 2019/05/30)
:エンコード指定で読み直し・読み取り専用属性の変更・編集モードの変更・プロパティを開く・さいごに閉じたファイルを開く・etc.
: エンコード指定で読み直し・読み取り専用属性の変更・編集モードの変更・プロパティを開く・さいごに閉じたファイルを開く・etc.
*[[さいごに閉じたファイルを開く]] ※ポップアップメニュー (uploaded: 2019/04/30)
* [[さいごに閉じたファイルを開く]] ※ポップアップメニュー (uploaded: 2019/04/30)
<br>
<br>
<gallery widths=200px>
<gallery widths=200px>
45行目: 45行目:


== 「変換・ソート・整形」 カテゴリ ==
== 「変換・ソート・整形」 カテゴリ ==
*[[昇順で並び替え/降順で並び替え]] トグル変換 (uploaded: 2019/06/03)
* [[昇順で並び替え/降順で並び替え]] トグル変換 (uploaded: 2019/06/03)
*[[TrueとFalse_を切り替える|YES/NO マクロ]] (last modified: 2018/11/27) ※「<span style="color:#0000c0;">True</span>」 ⇔ 「<span style="color:#c00;">False</span>」 トグル変換
* [[TrueとFalse_を切り替える|YES/NO マクロ]] (last modified: 2018/11/27) ※「<span style="color:#0000c0;">True</span>」 ⇔ 「<span style="color:#c00;">False</span>」 トグル変換
:+ 改造版「'''ToDoリストモード'''[https://www.haijin-boys.com/software/mery/mery-2-7-0#comment=2240]」 (added: 2019/05/06)
: + 改造版「'''ToDoリストモード'''[https://www.haijin-boys.com/software/mery/mery-2-7-0#comment=2240]」 (added: 2019/05/06)
*[[全角/半角 トグル変換]] (last modified: 2019/05/20) ※「ABCアイウエオ」 ⇔ 「ABCアイウエオ」
* [[全角/半角 トグル変換]] (last modified: 2019/05/20) ※「ABCアイウエオ」 ⇔ 「ABCアイウエオ」
*[[大文字/小文字/頭文字 トグル変換]] (last modified: 2019/05/20) ※「Abc」 → 「ABC」 → 「abc」 ...
* [[大文字/小文字/頭文字 トグル変換]] (last modified: 2019/05/20) ※「Abc」 → 「ABC」 → 「abc」 ...
*[[ひらがな/カタカナ変換]] (uploaded: 2019/07/06) ※「あいうえお」 → 「アイウエオ」 / 「カキクケコ」 → 「かきくけこ」
* [[ひらがな/カタカナ変換]] (uploaded: 2019/07/06) ※「あいうえお」 → 「アイウエオ」 / 「カキクケコ」 → 「かきくけこ」
*[[文字列の順番を逆に書き出す]] (uploaded: 2019/07/06) ※「あいうえお」 → 「おえういあ」
* [[文字列の順番を逆に書き出す]] (uploaded: 2019/07/06) ※「あいうえお」 → 「おえういあ」
<br>
<br>


== 「検索・置換」 カテゴリ ==
== 「検索・置換」 カテゴリ ==
*[[ポップアップメニューで検索先にジャンプ#sukemaru 版|ポップアップメニューで検索先にジャンプ]] (通常版/include版) (last modified: 2019/04/16) <br> +おまけマクロ「[[マテリアルデザインっぽいアイコンと『小マクロ集』#次の文字列を検索|次の文字列を検索]]/[[マテリアルデザインっぽいアイコンと『小マクロ集』#前の文字列を検索|前の文字列を検索]] (検索オプションをリセット&強調なし)」他
* [[ポップアップメニューで検索先にジャンプ#sukemaru 版|ポップアップメニューで検索先にジャンプ]] (通常版/include版) (last modified: 2019/04/16) <br> +おまけマクロ「[[マテリアルデザインっぽいアイコンと『小マクロ集』#次の文字列を検索|次の文字列を検索]]/[[マテリアルデザインっぽいアイコンと『小マクロ集』#前の文字列を検索|前の文字列を検索]] (検索オプションをリセット&強調なし)」他
*[[検索ヒット数表示(選択文字列)]] ※イベントマクロ (last modified: 2019/07/20)
* [[検索ヒット数表示(選択文字列)]] ※イベントマクロ (last modified: 2019/07/20)
:+ 機能強化版「[[検索ヒット数表示(選択文字列)#機能強化バージョン|文字数・行数・ヒット件数(選択文字列)]]」 ※イベントマクロ (last modified: 2019/08/28)
: + 機能強化版「[[検索ヒット数表示(選択文字列)#機能強化バージョン|文字数・行数・ヒット件数(選択文字列)]]」 ※イベントマクロ (last modified: 2019/08/28)
<br>
<br>
[[ファイル:Mery_ジャンプ_SS_2.png|240px|thumb|left|検索ジャンプ 【include版】]]
[[ファイル:Mery_ジャンプ_SS_2.png|240px|thumb|left|検索ジャンプ 【include版】]]
63行目: 63行目:


== 「プログラミング補助」 カテゴリ ==
== 「プログラミング補助」 カテゴリ ==
*[[コメントマーク付け外し#sukemaru 版|行コメント]] (last modified: 2019/04/07) ※コメントマーク付け外し
* [[コメントマーク付け外し#sukemaru 版|行コメント]] (last modified: 2019/04/07) ※コメントマーク付け外し
<br>
<br>


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


== 「その他」 カテゴリ ==
== 「その他」 カテゴリ ==
*[[折り返しトグル切り替え]] (added: 2019/02/19 ※w/ Bleat氏)
* [[折り返しトグル切り替え]] (added: 2019/02/19 ※w/ Bleat氏)
*[[Mery.iniのオプション値を取得]] ※組み込み用関数 (last modified: 2019/08/27)
* [[Mery.iniのオプション値を取得]] ※組み込み用関数 (last modified: 2019/08/27)
*[[Mery本体のバージョンチェック]] ※組み込み用関数 (uploaded: 2019/04/17)
* [[Mery本体のバージョンチェック]] ※組み込み用関数 (uploaded: 2019/04/17)
:サンプルコード: 「Begin/EndUndoGroup() メソッドを使えるのは ver 2.7.0 以降」
: サンプルコード: 「Begin/EndUndoGroup() メソッドを使えるのは ver 2.7.0 以降」
*[[IO.Serialize() の JSON を参照する]] ※組み込み用関数 (uploaded: 2019/04/17)
* [[IO.Serialize() の JSON を参照する]] ※組み込み用関数 (uploaded: 2019/04/17)
*[[ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する]] ※組み込み用関数 (uploaded: 2019/04/20)
* [[ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する]] ※組み込み用関数 (uploaded: 2019/04/20)
:サンプルコード: 「すべての論理行をポップアップメニューに表示する」
: サンプルコード: 「すべての論理行をポップアップメニューに表示する」
<br>
<br>
<gallery widths=200px>
<gallery widths=200px>
98行目: 98行目:
</gallery><br clear=all>
</gallery><br clear=all>


*[[キーアサイン集]] (last modified: 2018/10/19 ※w/ ks氏, masme氏, 有志)  
* [[キーアサイン集]] (last modified: 2018/10/19 ※w/ ks氏, masme氏, 有志)  
*[[マテリアルデザインっぽいアイコンと『小マクロ集』]] (last modified: 2019/05/01) ※アイコン収録数'''300'''コ
* [[マテリアルデザインっぽいアイコンと『小マクロ集』]] (last modified: 2019/05/01) ※アイコン収録数'''300'''コ


<gallery heights=320px>
<gallery heights=320px>
105行目: 105行目:
ファイル:Mery_小マクロ集_アウトライン.png|heights=320px|小マクロ集 アウトラインイメージ
ファイル:Mery_小マクロ集_アウトライン.png|heights=320px|小マクロ集 アウトラインイメージ
</gallery><br clear=all>
</gallery><br clear=all>
== sukemaru 自作マクロについて ==
* sukemaru の Mery 運用環境はロースペックの Windows XP sp3 (32bit), JScript 5.8.20587 のノート PC です。<br> ※ 制作したマクロの動作テストは、この XP 機でしかおこなっていません。<br> ※ マクロの動作テストに使用している Mery のバージョンは、最新の "ベータ版" (または最新の "正式版" ver. 2.6.7) のみです。基本的に ver 2.6.7 以降のバージョンで動作するように作成していますので、ver 2.6.6 以前のバージョンでの利用を想定していません(2.6.6 以下での動作確認をしていません)。<br> ※ ZIP 版の Mery でマクロを作成・運用しているので、インストーラ版では正しく動作しないマクロがあるかもしれません。<br> ※ 開発環境が Windows XP なので、変数はすべて '''''var''''' で宣言し、JScript 5.8 の環境で実行できるようにコーディングしています。
* Mery のオプション設定で「行の表示方法=論理座標(論理行)」の状態で運用する前提でマクロを作っています。公開しているマクロでは、「表示座標(表示行)」ベースで Mery を運用している場合でも利用できるように設定項目(変数)を設けるか「行の表示方法」を自動判定するコードを追加していますが、動作が不完全になったり処理がおそくなったりすることがあります。<br> ※「表示座標(表示行)」ベースでの動作テストはほとんどしていません。
* ソースコード内ではしばしば unicode 文字を使用していますので、マクロの JS ファイルは UTF-8 形式で保存する前提となっています。
* ソースコード内の変数名の検索などで「[[ポップアップメニューで検索先にジャンプ]]」マクロを利用しやすいように、コードには半角空白を多用しています。
* 変数名は頭文字が小文字の camelCase に、関数名は頭文字が大文字の TitleCase にしてあります。
* 「[[includeライブラリ|include ライブラリ]] (作成: ks 氏)」を利用する【'''include 版'''】と利用しない【'''通常版'''】とがあるマクロでは、include 版を優先的にメンテ・更新しています。
* 外部実行ファイル「[[GetKeyState.exe(キー状態取得実行ファイル)|GetKeyState.exe]] (作成: pizz 氏)」の導入が必要なものもあります。[https://www.haijin-boys.com/wiki/GetKeyState.exe(%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)#.E3.81.9D.E3.81.AE.E4.BB.96]
* ポップアップメニューマクロの「設定変更サブメニュー」など、複数のマクロで共通の自作関数を使用しているものがありますが、当面は「include ライブラリ」のような外部ファイルにまとめる予定なしです。<br> ※ すでに公開しているマクロが多いこと、公開用と自家用とでコードの内容がちがうマクロが複数あること、それぞれのマクロごとに関数のコードに改変をくわえていることなどの理由で、関数・クラスを統一しなおして更新メンテするのが困難。
* 「[[マテリアルデザインっぽいアイコンと『小マクロ集』|マテリアルデザインっぽいアイコン]]」は、sukemaru の自作マクロと、sukemaru がマクロライブラリから DL して利用しているマクロを対象として制作しています。




129行目: 116行目:
== アイコン化したマクロ ==
== アイコン化したマクロ ==
通常、フォーカスがアウトプットバーやアウトラインペイン、検索/置換ダイアログにあると、ポップアップメニューやショートカットキーからマクロを起動することはできない。<br>
通常、フォーカスがアウトプットバーやアウトラインペイン、検索/置換ダイアログにあると、ポップアップメニューやショートカットキーからマクロを起動することはできない。<br>
'''Document''' オブジェクトのかわりに '''Editor.ActiveDocument''' で記述したマクロであれば、エディタ領域にフォーカスがない場合でもツールバーアイコンやマクロメニューからマクロを起動できる。<br>
[[マクロリファレンス:Document インターフェイス|Document]] オブジェクトのかわりに [[マクロリファレンス:Editor インターフェイス#ActiveDocument プロパティ|Editor.ActiveDocument]] で記述したマクロであれば、エディタ領域にフォーカスがない場合でもツールバーアイコンやマクロメニューからマクロを起動できる。<br>
ただし、アクティブなタブ以外を操作・編集するマクロにおいては Editor.Documents.Item( dd ) などのような記述が必要。
ただし、アクティブなタブ以外を操作・編集するマクロにおいては Editor.Documents.Item( dd ) などのような記述が必要。
<br><br>
マクロをツールバー/マクロバーから使用するために [[マテリアルデザインっぽいアイコンと『小マクロ集』|アイコン]] を作ったり、マクロバーにアイコンを詰め込むために [[#スクショ|試行錯誤]] したりも…。


== ポップアップメニュー ==
== ポップアップメニュー ==
158行目: 147行目:
また、"& " で半角スペースをアクセラレータに指定したアイテムは、スペースキーがアクセスキーになる。
また、"& " で半角スペースをアクセラレータに指定したアイテムは、スペースキーがアクセスキーになる。


*<span style="color:#c00;">"'''&'''" 記号でアクセラレータ化する文字の位置は限定されないが、最初の "'''&'''" 記号のうしろの文字がアクセラレータになる。</span>
* <span style="color:#c00;">"'''&'''" 記号でアクセラレータ化する文字の位置は限定されないが、最初の "'''&'''" 記号のうしろの文字がアクセラレータになる。</span>
*<span style="color:#c00;">全角文字はアクセラレータにできない。</span>
* <span style="color:#c00;">全角文字はアクセラレータにできない。</span>
*<span style="color:#c00;">ラベル文字列に含まれる "'''&'''" 記号はエスケープされ、ポップアップメニューに表示されない。<br> ラベルに "'''&'''" 記号を表示させたいときは、"'''&&'''" のように二重に記述する必要がある。</span><br> → 不特定の文字列をラベルにする場合は、あらかじめ String.replace( /&/g, "&&" ) と記述するとよい。
* <span style="color:#c00;">ラベル文字列に含まれる "'''&'''" 記号はエスケープされ、ポップアップメニューに表示されない。<br> ラベルに "'''&'''" 記号を表示させたいときは、"'''&&'''" のように二重に記述する必要がある。</span><br> → 不特定の文字列をラベルにする場合は、あらかじめ String.replace( /&/g, "&&" ) と記述するとよい。
*<span style="color:#c00;">同じキーが重複してアクセラレータに指定されていると、そのキーを押した場合、アイテム間をトグル移動する(→ [Enter] キーで決定する)。</span>
* <span style="color:#c00;">同じキーが重複してアクセラレータに指定されていると、そのキーを押した場合、アイテム間をトグル移動する(→ [Enter] キーで決定する)。</span>
<source lang="javascript">
<source lang="javascript">
var menu = CreatePopupMenu();
var menu = CreatePopupMenu();
183行目: 172行目:


=== ラベルの整形 ===
=== ラベルの整形 ===
ポップアップメニュー(警告/確認ダイアログなどもだが)は UI フォントで表示されるので、英数字の羅列は読みづらい (…と個人的に感じている)。
ポップアップメニュー(警告/確認ダイアログなどもだが)は UI フォントで表示されるので、文字列が英数字の羅列の場合には読みづらい (…と個人的に感じている)。
文書内の文字列をラベル化する「[[ポップアップメニューで検索先にジャンプ#sukemaru 版|検索ジャンプ]]」や「[[ブックマーク一覧ジャンプ#sukemaru 版|ブックマークジャンプ]]」マクロなどでは、読みづらい半角アルファベットや記号を全角化させたりしている。
文書内の文字列をラベル化する「[[ポップアップメニューで検索先にジャンプ#sukemaru 版|検索ジャンプ]]」や「[[ブックマーク一覧ジャンプ#sukemaru 版|ブックマークジャンプ]]」マクロなどでは、読みづらい半角アルファベットや記号を全角化させたりしている。
<source lang="javascript">
<source lang="javascript">
214行目: 203行目:
menuKey = "&" + y + ": " + menuKey;
menuKey = "&" + y + ": " + menuKey;


// ※ 実際には「行番号を空白文字でケタ埋め (右端揃え)」などの追加処理もしている。
// ※ 実際には「行番号を空白文字でケタ埋め (右端揃え)」などの追加処理も追加している。
</source>
</source>


241行目: 230行目:


=== サブメニュー ===
=== サブメニュー ===
配列やオブジェクトからポップアップメニューを生成するさいに [[マクロリファレンス:PopupMenu インターフェイス#AddPopup メソッド|サブメニュー]] を利用する場合、あらかじめサブメニューのラベルや各要素の振り分け方が決まっていれば難しいことはないが、要素が不定数の配列やオブジェクトをサブメニューに振り分けるのは簡単ではない。
* 配列やオブジェクトからポップアップメニューを生成するさいにサブメニューを利用する場合、あらかじめサブメニューのラベルや各要素の振り分け方が決まっていれば難しいことはないが、要素が不定数の配列やオブジェクトをサブメニューに振り分けるのは簡単ではない。
「[[階層化マクロメニュー]]」マクロなどのソースコードを参考にしてコードを組むか、組み込み関数「[[ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する]]」で一定数ごとにサブメニュー項目を自動生成して要素を放り込むしかない…。
: 「[[階層化マクロメニュー]]」マクロなどのソースコードを参考にしてコードを組むか、組み込み関数「[[ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する]]」で一定数ごとにサブメニュー項目を自動生成して要素を放り込むしかない…。
<br>
* [[マクロリファレンス:PopupMenu インターフェイス#AddPopup メソッド|PopupMenu.AddPopup() メソッド]] では [[マクロリファレンス:PopupMenu インターフェイス#Add メソッド|Add() メソッド]] の第三引数(meMenuChecked, meMenuGrayed, meMenuSeparator)は使用できない。
: サブメニュー内のすべてのアイテムが無効(グレーアウト)になる条件でも、サブメニュー見出しを無効化することはできないので、サブメニュー見出しが表示されなくなるように PopupMenu.AddPopup() 周りを if() 文で囲うしかないようだ。
: 上の「自動分割サブメニュー」の組み込み関数を制作するさい、チェックつきアイテムを含むサブメニュー見出しにもチェックを付けられるようにしたかったが、これも無理だった。


=== マクロの動作設定を変更する ===
=== マクロの動作設定を変更可能にする ===
拙作マクロは、ポップアップメニューを使うものにかぎらず動作設定用の項目が多い。<br>
拙作マクロは、ポップアップメニューを使うものにかぎらず動作設定用の項目が多い。<br>
ポップアップメニューマクロでないものは、通常、頻繁に動作設定を弄る必要はないが、sukemaru 好みの動作方式は一般的嗜好と合致しないであろうことから公開用のマクロにするにあたってカスタマイズ可能な「設定項目」に調整しなおすことが多い。
ポップアップメニューマクロでないものは、通常、頻繁に動作設定を弄る必要はないが、sukemaru 好みの動作方式は一般的嗜好と合致しないであろうことから公開用のマクロにするにあたってカスタマイズ可能な「設定項目」に調整しなおすことが多い。
<br><br>
<br><br>
ポップアップメニューマクロであれば、メニュー項目から動作設定をカスタマイズできるようにコーディングすることができる。
ポップアップメニューマクロであれば、メニュー項目から動作設定をカスタマイズできるようにコーディングすることができる。
<br><br>
<br>
まず、[[利用者:Masme|masme]] 氏の「[[行並べ替え]]」や「[[連番を挿入]]」マクロのように do - while ループで動作設定の既定値を何度も書き換えながらポップアップメニューを再描画する方法がある。<br>
* まず、[[利用者:Masme|masme]] 氏の「[[行並べ替え]]」や「[[連番を挿入]]」マクロのように do - while() ループで動作設定の既定値を何度も書き換えながらポップアップメニューを再描画する方法がある。
動作設定の変更内容はマクロの完了時に破棄されてしまうので、連続して同じマクロを利用する場合には、ソースコードの既定値を書き換えてカスタマイズしておくとよい。
: 動作設定の変更内容はマクロの完了時に破棄されてしまうので、連続して同じマクロを利用する場合には、ソースコードの既定値を書き換えてカスタマイズしておくとよい。
<br><br>
<br>
sukemaru の場合は、「[[ポップアップメニューで検索先にジャンプ#include版|検索ジャンプ]]」や「[[ブックマーク一覧ジャンプ#include版|ブックマークジャンプ]]」、「[[ファイルを読みなおす・開きなおす#include版|読みなおし]]」マクロなどで、"include 版" と称するものを作っている。 <br>
* sukemaru の場合は、「[[ポップアップメニューで検索先にジャンプ#include版|検索ジャンプ]]」や「[[ブックマーク一覧ジャンプ#include版|ブックマークジャンプ]]」、「[[ファイルを読みなおす・開きなおす#include版|読みなおし]]」マクロなどで、"include 版" と称するものを作っている。
これらにおいては、[[includeライブラリ|include ライブラリ]] の IO クラス(IO.js)の Serealize / Deserialize を利用して、変更した設定値を外部ファイル(JSON ファイル)に保持できるようにしている。<br>
: これらにおいては、[[includeライブラリ|include ライブラリ]] の IO クラス(IO.js)の Serealize / Deserialize を利用して、変更した設定値を外部ファイル(JSON ファイル)に保持できるようにしている。
動作設定を同じままで再実行するのも、カスタマイズしながら再実行するのも容易にはなったが、コードが煩雑になって他のマクロに流用しづらくなってしまっている…。<br>
: 動作設定を同じままで再実行するのも、カスタマイズしながら再実行するのも容易にはなったが、コードが煩雑になって他のマクロに流用しづらくなってしまっている…。
非 include 版では、masme 氏のマクロのような処理コードは入れず、動作設定の変更方法はソースコードの変数の値の書き換えのみとしている。
: ※ 非 include 版では、masme 氏のマクロのような処理コードは入れず、動作設定の変更方法はソースコードの変数の値の書き換えのみとしている。


== 選択範囲の 先頭位置/末尾位置 ==
== 選択範囲の 先頭位置/末尾位置 ==
選択範囲の 開始(キャレットなし)/終了(キャレットあり) の位置は Selection.GetAnchorPos() と Selection.GetActivePos() とで取得できるが、先頭/末尾 の位置はそれらをもとにして前後関係を割りだす必要がある。
選択範囲の 開始(キャレットなし)/終了(キャレットあり) の位置は [[マクロリファレンス:Selection インターフェイス#GetAnchorPos メソッド|Selection.GetAnchorPos()]] [[マクロリファレンス:Selection インターフェイス#GetActivePos メソッド|Selection.GetActivePos()]] とで取得できるが、先頭/末尾 の位置はそれらをもとにして前後関係を割りだす必要がある。
<source lang="javascript">
<source lang="javascript">
var ancPos = Document.Selection.GetAnchorPos(); // 選択開始位置
var ancPos, actPos, topPos, endPos;
var actPos = Document.Selection.GetActivePos(); // 選択終了位置(キャレット位置)
 
ancPos = Document.Selection.GetAnchorPos(); // 選択開始位置
actPos = Document.Selection.GetActivePos(); // 選択終了位置(キャレット位置)
 
topPos = Math.min( ancPos, actPos ); // 選択範囲の先頭位置
endPos = Math.max( ancPos, actPos ); // 選択範囲の末尾位置


var topPos = Math.min( ancPos, actPos ); // 選択範囲の先頭位置
// topPos と endPos は以下のような記述でも可
var endPos = Math.max( ancPos, actPos ); // 選択範囲の末尾位置
topPos = ( ancPos < actPos ) ? ancPos : actPos;
endPos = ( ancPos < actPos ) ? actPos : ancPos;
</source>
</source>


== スクロール位置の調整 ==
== スクロール位置の調整 ==
キャレットをジャンプさせた後のスクロール位置とキャレット位置は、移動した行数がエディタの表示領域の高さに収まるかどうか(スクロールマージンの考慮が必要)とジャンプ方向によるので安定的ではない。<br>
キャレットをジャンプさせた後のスクロール位置とキャレット位置は、移動した行数がエディタの表示領域の高さに収まるかどうか(スクロールマージンの考慮が必要)とジャンプ方向によるので安定的ではない。<br>
以下のコードは、ジャンプ後にエディタの表示領域がスクロールした場合に、キャレットが表示領域の先頭位置になるように調整するもの。
以下のコードは、ジャンプ後にエディタの表示領域がスクロールした場合に、キャレットが表示領域の [[マクロリファレンス:Window インターフェイス#ScrollY プロパティ|先頭位置(Window.ScrollY)]] になるように調整するもの。
<source lang="javascript">
<source lang="javascript">
var s = Document.Selection;
var s = Document.Selection;
287行目: 286行目:
// つねにジャンプ先の行が先頭になるようスクロールさせるなら
// つねにジャンプ先の行が先頭になるようスクロールさせるなら
// ScrollY = s.GetActivePointY( mePosView );
// ScrollY = s.GetActivePointY( mePosView );
// ※ ScrollY プロパティに値を代入するときは物理座標(表示行)の行番号で
</source>
</source>


316行目: 317行目:


== 動作要件としてのバージョンチェック ==
== 動作要件としてのバージョンチェック ==
Mery ベータ版で追加されたマクロ用プロパティを利用する場合は、マクロの動作要件として Mery 本体のバージョンチェックをするのが無難である。<br>
Mery ベータ版で追加されたマクロ用プロパティを利用する場合は、マクロの動作要件として Mery 本体のバージョンチェックをするコードを入れておくのが無難である。<br>
JavaScript には特定のプロパティがオブジェクト配下に定義されているかを調べる方法が色々とあるが、専用の組み込み関数 [[Mery本体のバージョンチェック|VersionCheck()]] を利用すれば Mery のバージョン番号を指定してのチェックができる。
JavaScript には特定のプロパティがオブジェクト配下に定義されているかを調べる方法が色々とあるが、専用の組み込み関数 [[Mery本体のバージョンチェック|VersionCheck()]] を利用すれば Mery のバージョン番号を指定してのチェックができる。
<br>
<br>
360行目: 361行目:
[[includeライブラリ|include ライブラリ]] の MeryInfo クラス (MeryInfo.js) を利用して Mery.ini からいくつかの設定項目の値や状態を取得することはできるが、制約が非常に多い。
[[includeライブラリ|include ライブラリ]] の MeryInfo クラス (MeryInfo.js) を利用して Mery.ini からいくつかの設定項目の値や状態を取得することはできるが、制約が非常に多い。
* 取得できる項目がきわめて限定的である
* 取得できる項目がきわめて限定的である
* 取得する項目が複数あると、その都度 Mery.ini 全体の読み込みが発生する(キャッシュ可)
* Mery.exe のファイル名を変更 (e.g. Mery_hoge.exe) している場合、MeryInfo.js のコードを改変しないと Mery.ini (Mery_hoge.ini) のパスを得られない。
* Mery.exe のファイル名を変更 (e.g. Mery_hoge.exe) している場合、MeryInfo.js のコードを改変しないと Mery.ini (Mery_hoge.ini) のパスを得られない。
<br>
<br>
拙作の組み込み関数 [[Mery.iniのオプション値を取得#GetIniOption() 関数|GetIniOption()]] と [[Mery.iniのオプション値を取得#GetIniOption2() 関数|GetIniOption2()]] はこれらの制約を受けず、とくに後者は Mery.ini のすべての項目にアクセスして値を取得することができる。
拙作の組み込み関数 [[Mery.iniのオプション値を取得#GetIniOption() 関数|GetIniOption()]] と [[Mery.iniのオプション値を取得#GetIniOption2() 関数|GetIniOption2()]] はこれらの制約を受けず、とくに後者は Mery.ini のすべての項目にアクセスして値を取得することができる。<br>
<br><br>
ただし、制約がない代わりに組み込み関数自体のコードが長いことや、引数や戻り値が配列であることでコードが煩雑にならざるをえない(配列を使用することで、複数の項目を取得する場合でも Mery.ini ファイルの読み込みを1回におさえられる)。
ただし、制約がない代わりに組み込み関数自体のコードが長いことや、引数や戻り値が配列であることでコードが煩雑にならざるをえない。
<br><br>
<br><br>
また、Mery.ini 側の仕様として、
また、Mery.ini 側の仕様として、
: 「オプション」など各種の設定ダイアログを [OK] で閉じたときか、エディタウインドウを閉じたときにしか Mery.ini への書き込みがされないため、メニュー項目/ツールバーアイコン/ショートカットキー などで設定を変更した場合には Mery.ini に直ちに反映されない
「オプション」など各種の設定ダイアログを [OK] ボタンで閉じたときか、エディタウインドウ本体を閉じたときにしか Mery.ini への書き込みがされないため、メニュー項目/ツールバーアイコン/ショートカットキー などで設定を変更した場合には Mery.ini に直ちに反映されない
という制約がある(実体ファイルへの書き込み回数を減らすための仕様)。
という制約がある(Mery.ini の実体ファイルへの書き込み回数を減らすための仕様)。
<br><br>
<br><br>
エディタの表示状態をトグル切り替えするコマンド(縦書き、色の反転、etc. ...)については、マクロから「現在の表示状態」を取得する手段がなく、組み込み関数で Mery.ini から読み込んでも「最新の設定状態」を取得できるわけではない…。
エディタの表示状態をトグル切り替えするコマンド(縦書き、色の反転、各種ツールバー、全画面表示、etc. ...)については、マクロから「現在の表示状態」を取得する手段がなく、組み込み関数で Mery.ini から読み込んでも「最新の設定状態」を取得できるわけではない…。
<br><br>
<br><br>
現在の表示状態を取得してから ON/OFF を指定しての切り替えを行なうためには、include ライブラリの IO クラスを利用するなどして外部に Mery.ini とは別の設定ファイル (e.g. JSON ファイル) を利用して、切り替え実行のたびに設定ファイルを読み書きする必要がある。<br>
現在の表示状態を取得してから ON/OFF を指定しての切り替えを行なうためには、include ライブラリの IO クラスを利用するなどして外部に Mery.ini とは別の設定ファイル (e.g. JSON ファイル) を利用して、切り替え実行のたびに設定ファイルを読み書きする必要がある。<br>
この場合、外部ファイルに設定内容をあずける項目の切り替えについては必ずマクロ経由で行なわなければならず、デフォルトの メニュー項目/ツールバーアイコン/ショートカットキー などから切り替えをすると最新の設定状態とマクロの設定ファイルとのあいだに齟齬が生じてしまう。
この場合、外部ファイルに設定内容をあずける項目の切り替えについては必ずマクロ経由で行なわなければならず、デフォルトの メニュー項目/ツールバーアイコン/ショートカットキー などから切り替えをすると最新の設定状態とマクロの設定ファイルとのあいだに齟齬が生じてしまう。
== その他、拙作マクロについて ==
* 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 にしてあります。
<br>
* 「[[includeライブラリ|include ライブラリ]] (作成: ks 氏)」を利用する【'''include 版'''】と利用しない【'''通常版'''】とがあるマクロでは、include 版を優先的にメンテ・更新しています。
* 外部実行ファイル「[[GetKeyState.exe(キー状態取得実行ファイル)|GetKeyState.exe]] (作成: pizz 氏)」の導入が必要なものもあります。[https://www.haijin-boys.com/wiki/GetKeyState.exe(%E3%82%AD%E3%83%BC%E7%8A%B6%E6%85%8B%E5%8F%96%E5%BE%97%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)#.E3.81.9D.E3.81.AE.E4.BB.96]
* ポップアップメニューマクロの「設定変更サブメニュー」など、複数のマクロで共通の自作関数を使用しているものがありますが、当面は「include ライブラリ」のような外部ファイルにまとめる予定なしです。
: ※ すでに公開しているマクロが多いこと、公開用と自家用とでコードの内容がちがうマクロが複数あること、それぞれのマクロごとに関数のコードに改変をくわえていることなどの理由で、関数・クラスを統一しなおして更新メンテするのが困難。
<br>
* 「[[マテリアルデザインっぽいアイコンと『小マクロ集』|マテリアルデザインっぽいアイコン]]」は、sukemaru の自作マクロと、sukemaru がマクロライブラリから DL して利用しているマクロを対象として制作しています。


= 投稿した構文ファイル =
= 投稿した構文ファイル =


*[[Mery MSY]] (uploaded: 2018/09/05)
* [[Mery MSY]] (uploaded: 2018/09/05)
: Mery の MSY 構文ファイル用
: Mery の MSY 構文ファイル用
*[[Mery Macro JS]] (last modified: 2018/11/10)
* [[Mery Macro JS]] (last modified: 2018/11/10)
: マクロの JS ファイル(JScript)用
: マクロの JS ファイル(JScript)用
: JavaScript 用構文ファイル/入力補完用辞書/スペルチェック用辞書/おまけマクロ を同梱
: JavaScript 用構文ファイル/入力補完用辞書/スペルチェック用辞書/おまけマクロ を同梱
: ※ Web 開発向けのプロパティは収録していない
: ※ Web 開発向けのプロパティは収録していない
*[[JaneStyle (正規表現用)]] (uploaded: 2018/08/31)
* [[JaneStyle (正規表現用)]] (uploaded: 2018/08/31)
: ReplaceStr.txt / ImageViewURLReplace.dat / URLExec.dat / command.dat に対応
: ReplaceStr.txt / ImageViewURLReplace.dat / URLExec.dat / command.dat に対応
: ※ bregonig の正規表現のハイライト可 ( onigmo にも利用可)
: ※ bregonig の正規表現のハイライト可 ( onigmo にも利用可)
392行目: 413行目:
; マクロバーのアイコン化
; マクロバーのアイコン化
マクロバー (1段目) にアイコンを詰めこむための sukemaru の試行錯誤の遍歴...
マクロバー (1段目) にアイコンを詰めこむための sukemaru の試行錯誤の遍歴...
*'''共通'''
* '''共通'''
: Windows XP (Classic テーマ)
: Windows XP (Classic テーマ)
: ウインドウサイズ (幅): 約 970 px
: ウインドウサイズ (幅): 約 970 px
401行目: 422行目:
* [https://www.haijin-boys.com/software/mery/mery-2-8-0#4 Ver. 2.8.0](2019/06/22)
* [https://www.haijin-boys.com/software/mery/mery-2-8-0#4 Ver. 2.8.0](2019/06/22)
: マクロバーのアイコン数 28 コ、ラベルなし、セパレータあり( #begingroup=3 )
: マクロバーのアイコン数 28 コ、ラベルなし、セパレータあり( #begingroup=3 )
:[[ファイル:Mery_2.8.0_SS.png|link=https://www.haijin-boys.com/wiki/images/1/1b/Mery_2.8.0_SS.png|480px|thumb|left|Ver. 2.8.0]]<br clear=all>
: [[ファイル:Mery_2.8.0_SS.png|link=https://www.haijin-boys.com/wiki/images/1/1b/Mery_2.8.0_SS.png|480px|thumb|left|Ver. 2.8.0]]<br clear=all>


* [https://www.haijin-boys.com/software/mery/mery-2-7-5#12 Ver. 2.7.8](2019/06/13)
* [https://www.haijin-boys.com/software/mery/mery-2-7-5#12 Ver. 2.7.8](2019/06/13)
: マクロバーのアイコン数 22 コ半、ラベルなし、余白あり( #title="" )<br> ※ 3段目は外部ツールバー (アイコン 30 コ)
: マクロバーのアイコン数 22 コ半、ラベルなし、余白あり( #title="" )<br> ※ 3段目は外部ツールバー (アイコン 30 コ)
:[[ファイル:Mery_2.7.8_SS.png|link=https://www.haijin-boys.com/wiki/images/5/54/Mery_2.7.8_SS.png|480px|thumb|left|Ver. 2.7.8]]<br clear=all>
: [[ファイル:Mery_2.7.8_SS.png|link=https://www.haijin-boys.com/wiki/images/5/54/Mery_2.7.8_SS.png|480px|thumb|left|Ver. 2.7.8]]<br clear=all>


* Ver. 2.7.4 まで(2019/05/05)
* Ver. 2.7.4 まで(2019/05/05)
: マクロバーのアイテム数 16 件、ラベルあり(#title="hoge" の文字数を切りつめてやり繰り)
: マクロバーのアイテム数 16 件、ラベルあり(#title="hoge" の文字数を切りつめてやり繰り)
:[[ファイル:Mery_2.7.4_SS.png|link=https://www.haijin-boys.com/wiki/images/3/3f/Mery_2.7.4_SS.png|480px|thumb|left|Ver. 2.7.4]]<br clear=all>
: [[ファイル:Mery_2.7.4_SS.png|link=https://www.haijin-boys.com/wiki/images/3/3f/Mery_2.7.4_SS.png|480px|thumb|left|Ver. 2.7.4]]<br clear=all>
 
 
 
 
 
<!-- スクショ -->
<!-- [https://i.imgur.com/tJsZBAF.png https://i.imgur.com/tJsZBAF.png 2.8.0] -->
<!-- [https://i.imgur.com/fuu5nFy.png https://i.imgur.com/fuu5nFy.png 2.7.8] -->
<!-- [https://i.imgur.com/VizaHVo.png https://i.imgur.com/VizaHVo.png 2.7.4] -->

2019年8月29日 (木) 10:16時点における版

マクロライブラリに投稿したマクロ

「テキスト操作補助」 カテゴリ

インデント/逆インデント
カッコで囲う (簡易版 ポップアップメニューなし)
引用符を追加/削除  ※"二重引用符" の追加/削除トグル



「ファイル操作補助」 カテゴリ

「他(右側/左側)のタブを閉じる」 などを追加
エンコード指定で読み直し・読み取り専用属性の変更・編集モードの変更・プロパティを開く・さいごに閉じたファイルを開く・etc.



「変換・ソート・整形」 カテゴリ

+ 改造版「ToDoリストモード[1]」 (added: 2019/05/06)


「検索・置換」 カテゴリ

+ 機能強化版「文字数・行数・ヒット件数(選択文字列)」 ※イベントマクロ (last modified: 2019/08/28)


検索ジャンプ 【include版】


「プログラミング補助」 カテゴリ

  • 行コメント (last modified: 2019/04/07) ※コメントマーク付け外し


「実験的マクロ・練習マクロなど」 カテゴリ

サンプルコード: 「特定の条件で縦書きモードに切りかえる」(※ ver 2.6.5 - 2.7.5 用)



ブックマークを復元


「その他」 カテゴリ

サンプルコード: 「Begin/EndUndoGroup() メソッドを使えるのは ver 2.7.0 以降」
サンプルコード: 「すべての論理行をポップアップメニューに表示する」





マクロ覚え書き

リンク


拙作マクロはポップアップメニューを利用するものが多いので、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+005C) を「∖」(U+2216) に置換
 * ・判別しづらいメタ文字を全角に置換:	!"%'(),.:;@[]`{|}
 * ・「a-z」を全角に置換
 */

var y = Document.Selection.GetActivePointY( mePosLogical )
var menuKey = Document.GetLine( y, 0 );
var menuWidth = 55;

menuKey = menuKey.replace( /^[\t  ]+/, "" )
                 .replace( /(?:\t|[ ]{3,}|[ ]{2,})+/g, " › " )
                 .slice( 0, menuWidth + 1 )
                 .replace( /[&]/g, "&&" )
                 .replace( /[\\]/g, "∖" )
                 .replace( /([^∖!"',.:;`|\t  ])([∖]+)/g, "$1 $2" )
                 .replace( /[!"%'(),.:;@\[\]`a-z{|}]/g,
                   function( tmp ) {
                     return String.fromCharCode( tmp.charCodeAt( 0 ) + 0xFEE0 )
                   } );
// アクセラレータつきの連番を付加
menuKey = "&" + y + ": " + 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() 周りを if() 文で囲うしかないようだ。
上の「自動分割サブメニュー」の組み込み関数を制作するさい、チェックつきアイテムを含むサブメニュー見出しにもチェックを付けられるようにしたかったが、これも無理だった。

マクロの動作設定を変更可能にする

拙作マクロは、ポップアップメニューを使うものにかぎらず動作設定用の項目が多い。
ポップアップメニューマクロでないものは、通常、頻繁に動作設定を弄る必要はないが、sukemaru 好みの動作方式は一般的嗜好と合致しないであろうことから公開用のマクロにするにあたってカスタマイズ可能な「設定項目」に調整しなおすことが多い。

ポップアップメニューマクロであれば、メニュー項目から動作設定をカスタマイズできるようにコーディングすることができる。

  • まず、masme 氏の「行並べ替え」や「連番を挿入」マクロのように do - while() ループで動作設定の既定値を何度も書き換えながらポップアップメニューを再描画する方法がある。
動作設定の変更内容はマクロの完了時に破棄されてしまうので、連続して同じマクロを利用する場合には、ソースコードの既定値を書き換えてカスタマイズしておくとよい。


これらにおいては、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 ファイル) を利用して、切り替え実行のたびに設定ファイルを読み書きする必要がある。
この場合、外部ファイルに設定内容をあずける項目の切り替えについては必ずマクロ経由で行なわなければならず、デフォルトの メニュー項目/ツールバーアイコン/ショートカットキー などから切り替えをすると最新の設定状態とマクロの設定ファイルとのあいだに齟齬が生じてしまう。

その他、拙作マクロについて

  • 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 ライブラリ」のような外部ファイルにまとめる予定なしです。
※ すでに公開しているマクロが多いこと、公開用と自家用とでコードの内容がちがうマクロが複数あること、それぞれのマクロごとに関数のコードに改変をくわえていることなどの理由で、関数・クラスを統一しなおして更新メンテするのが困難。



投稿した構文ファイル

Mery の MSY 構文ファイル用
マクロの JS ファイル(JScript)用
JavaScript 用構文ファイル/入力補完用辞書/スペルチェック用辞書/おまけマクロ を同梱
※ Web 開発向けのプロパティは収録していない
ReplaceStr.txt / ImageViewURLReplace.dat / URLExec.dat / command.dat に対応
※ bregonig の正規表現のハイライト可 ( onigmo にも利用可)


スクショ

マクロバーのアイコン化

マクロバー (1段目) にアイコンを詰めこむための sukemaru の試行錯誤の遍歴...

  • 共通
Windows XP (Classic テーマ)
ウインドウサイズ (幅): 約 970 px
アイコンサイズ: 中 (24px)
アイコン:マテリアルデザインっぽいアイコン
標準ツールバー (2段目) のアイコン数: 28 コ


マクロバーのアイコン数 28 コ、ラベルなし、セパレータあり( #begingroup=3 )
Ver. 2.8.0

マクロバーのアイコン数 22 コ半、ラベルなし、余白あり( #title="" )
※ 3段目は外部ツールバー (アイコン 30 コ)
Ver. 2.7.8

  • Ver. 2.7.4 まで(2019/05/05)
マクロバーのアイテム数 16 件、ラベルあり(#title="hoge" の文字数を切りつめてやり繰り)
Ver. 2.7.4




スポンサーリンク