編集の要約なし |
項目の追加と移動、ウィキリンクの追加と修正 |
||
| (2人の利用者による、間の11版が非表示) | |||
| 1行目: | 1行目: | ||
== マクロライブラリに投稿したマクロ == | == マクロライブラリに投稿したマクロ == | ||
=== テキスト操作補助 === | |||
* [[行頭か行末 または 選択範囲の始点か終点]] (last_modified: 2020/06/26) | |||
== | * [[文書の先頭か末尾]] (last_modified: 2019/03/29) | ||
* [[行頭か行末 または 選択範囲の始点か終点 | |||
* [[文書の先頭か末尾 | |||
* [[対応する括弧に移動#範囲選択の拡張|「対応する括弧に移動」の追加コード]] (last_modified: 2019/12/02) | * [[対応する括弧に移動#範囲選択の拡張|「対応する括弧に移動」の追加コード]] (last_modified: 2019/12/02) | ||
* [[日付と時刻を挿入#sukemaru 版|日付と時刻を挿入]] (last_modified: 2018/12/09) | * [[日付と時刻を挿入#sukemaru 版|日付と時刻を挿入]] (last_modified: 2018/12/09) | ||
* [[行を上下に移動(Mery 2.7 用)]] (uploaded: 2019/05/07) ※ ブックマーク対応 | * [[行を上下に移動(Mery 2.7 用)]] (uploaded: 2019/05/07) ※ ブックマーク対応 | ||
* [[行を複製 (複数行可)]] (last_modified: | * [[行を複製 (複数行可)]] (last_modified: 2020/06/26) ※ ブックマーク対応 | ||
* [[字下げ・字上げ#sukemaru 版|字下げ・字上げ(スペース×2 追加・削除)]] (last_modified: | * [[字下げ・字上げ#sukemaru 版|字下げ・字上げ(スペース×2 追加・削除)]] (last_modified: 2020/06/29) ※ ブックマークを保持 | ||
** [[字下げ・字上げ#インデント|インデント/逆インデント]] (last_modified: 2020/06/29) ※ ブックマークを保持 | |||
* [[貼付け実行後のカーソル位置を貼付け文字列の先頭にする#sukemaru 版|貼付け実行後のカーソル位置を貼付け文字列の先頭にする]] (added: 2018/11/14) | * [[貼付け実行後のカーソル位置を貼付け文字列の先頭にする#sukemaru 版|貼付け実行後のカーソル位置を貼付け文字列の先頭にする]] (added: 2018/11/14) | ||
* [[行の先頭に貼り付け]] (uploaded: 2018/08/24) | * [[行の先頭に貼り付け]] (uploaded: 2018/08/24) | ||
<span id="引用符/コメント"></span> | <span id="引用符/コメント"></span> | ||
* [[引用符/コメント]] ※ポップアップメニュー (last_modified: | * [[引用符/コメント]] ※ポップアップメニュー (last_modified: 2020/06/23) ※行頭の文字列操作マクロ「引用の追加」の増補改訂版 | ||
* [[カッコで囲う]] ※ポップアップメニュー (last_modified: | * [[カッコで囲う]] ※ポップアップメニュー (last_modified: 2020/06/23) | ||
* [[ | ** [[カッコで囲う#カッコで囲う (ポップアップメニューなし)|カッコで囲う (簡易版 ポップアップメニューなし)]] | ||
* [[ | ** [[カッコで囲う#引用符を追加/削除|引用符を追加/削除]] ※"二重引用符" の追加/削除トグル | ||
* [[位置情報を保存してから「すべて選択/選択解除」(非スクロール)]] (include版) (last_modified: 2019/11/13) | ** [[カッコで囲う#カッコで囲う2(各行ごとにカッコで囲う/Mery ver 3 用)|カッコで囲う2]] ※ポップアップメニュー | ||
*[[拡張自動選択]] (uploaded: 2020/ | * [[カッコをはずす]] & [[カッコをはずす#カッコを追加/削除|カッコを追加/削除]] (include版) (last_modified: 2020/06/28) | ||
** 2020/06/28 → [[カッコをはずす#カッコを削除/追加|カッコを削除/追加 トグル]] を<b style="color:#c00;">削除</b> | |||
* [[定型文を挿入]] (uploaded: 2018/12/03) | |||
* [[位置情報を保存してから「すべて選択/選択解除」(非スクロール)]] (include版) (last_modified: 2019/11/13) | |||
** 「[[位置情報を保存してから「すべて選択/選択解除」(非スクロール)#【include 版】位置を復帰/保存|位置を復帰/保存]]」 (include版) | |||
* [[拡張自動選択]] (uploaded: 2020/07/01) ※「日付」を範囲選択、今日の日付に変換 | |||
* [[追加コピー・追加切り取り]] (uploaded: 2020/06/05) ※ Mery ver 2.8.1 以降用 | |||
* [[新規行番号入力]] (w/Takuma) (added: 2020/06/26) | |||
* [[バイト数#バイト数と文字数・行数|バイト数と文字数・行数]] ※イベントマクロ (last_modified: 2018/11/18 → '''2019/12/03 削除''') | * [[バイト数#バイト数と文字数・行数|バイト数と文字数・行数]] ※イベントマクロ (last_modified: 2018/11/18 → '''2019/12/03 削除''') | ||
* [[論理行を選択 (改行を含まない)]] (uploaded: 2021/01/20) | |||
* [[選択範囲を行に分ける・改]] (uploaded: 2021/01/20) | |||
=== | === ファイル操作補助 === | ||
* [[ファイルのプロパティ]] (uploaded: 2018/12/18) | * [[ファイルのプロパティ]] (uploaded: 2018/12/18) | ||
* [[選択範囲のURL・パスを開く | * [[選択範囲のURL・パスを開く]] (last_modified: 2019/04/07) ※選択範囲のURL・パスを開く | ||
* [[ブックマーク一覧ジャンプ#sukemaru 版|ブックマーク一覧ジャンプ]] (通常版/[[ブックマーク一覧ジャンプ#include版|include版]]) ※ポップアップメニュー (last_modified: | * [[ブックマーク一覧ジャンプ#sukemaru 版|ブックマーク一覧ジャンプ]] (通常版/[[ブックマーク一覧ジャンプ#include版|include版]]) ※ポップアップメニュー (last_modified: 2020/06/24) | ||
* [[編集モードの自動選択]] (通常版/include版) ※イベントマクロ (last_modified: 2019/04/24) ※書き換え禁止で開く | * [[編集モードの自動選択]] (通常版/include版) ※イベントマクロ (last_modified: 2019/04/24) ※書き換え禁止で開く | ||
* [[特定のフォルダで「ファイルを開く」ダイアログ]] (last_modified: 2020/05/10) | * [[特定のフォルダで「ファイルを開く」ダイアログ]] (last_modified: 2020/05/10) | ||
* [[すべて閉じる | * [[すべて閉じる]] (通常版/include版) (last_modified: 2019/05/03) | ||
* [[ファイルを読み直す・開きなおす]] (通常版/include版) ※ポップアップメニュー (last_modified: 2019/11/30) | ** 「他(右側/左側)のタブを閉じる」 などを追加 ※ポップアップメニュー版あり | ||
* [[ファイルを読み直す・開きなおす]] (通常版/include版) ※ポップアップメニュー (last_modified: 2019/11/30) | |||
** エンコード指定で読み直し・読み取り専用属性の変更・編集モードの変更・プロパティを開く・さいごに閉じたファイルを開く・etc. | |||
* [[さいごに閉じたファイルを開く]] ※ポップアップメニュー (last_modified: 2019/11/30) | * [[さいごに閉じたファイルを開く]] ※ポップアップメニュー (last_modified: 2019/11/30) | ||
* [[タブを複製する]] ( | * [[タブを複製する]] (last_modified: 2020/06/22) | ||
* [[強制的に上書き保存]] (uploaded: 2020/06/01) | * [[強制的に上書き保存]] (uploaded: 2020/06/01) | ||
* [[すべて戻す]] (uploaded: 2020/06/01) | * [[すべて戻す]] (uploaded: 2020/06/01) | ||
* [[作業フォルダの変更]] (uploaded: 2020/06/03) | |||
=== | === 変換・ソート・整形 === | ||
* [[昇順で並び替え/降順で並び替え]] トグル変換 (last_modified: 2020/05/04) | * [[昇順で並び替え/降順で並び替え]] トグル変換 (last_modified: 2020/05/04) | ||
* [[ | ** 「[[昇順で並び替え/降順で並び替え#昇順/降順トグル + 文字列反転|昇順/降順トグル + 文字列反転]]」 (added: 2020/05/04) | ||
* [[TrueとFalse を切り替える]] (last_modified: 2020/07/01) ※「<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]」 (last_modified: 2020/05/12) | |||
* [[全角/半角変換]] (last_modified: 2019/05/11) ※「ABC」→「ABC」 / 「ABC」→「ABC」 | * [[全角/半角変換]] (last_modified: 2019/05/11) ※「ABC」→「ABC」 / 「ABC」→「ABC」 | ||
* [[全角/半角 トグル変換]] (last_modified: | * [[全角/半角 トグル変換]] (last_modified: 2020/07/03) ※「ABCアイウエオ」⇔「ABCアイウエオ」 | ||
* [[大文字/小文字/頭文字 トグル変換]] (last_modified: | * [[大文字/小文字/頭文字 トグル変換]] (last_modified: 2020/07/03) ※「Abc」 → 「ABC」 → 「abc」 ... | ||
* [[ひらがな/カタカナ変換]] (last_modified: 2020/ | * [[ひらがな/カタカナ変換]] (last_modified: 2020/06/24) ※「あいうえお」 ⇔ 「アイウエオ」 | ||
* [[TAB/半角空白 トグル変換]] (last_modified: 2020/07/02) | |||
* [[文字列の順番を逆に書き出す]] (last_modified: 2020/01/03) ※「あいうえお」 ⇔ 」おえういあ「 | * [[文字列の順番を逆に書き出す]] (last_modified: 2020/01/03) ※「あいうえお」 ⇔ 」おえういあ「 | ||
* [[ | * [[マルチカーソル選択範囲の並べ替え]] (last_modified: 2020/07/04) | ||
* [[マルチカーソル用:「昇順/降順」または「逆順」で並べ替え]] (uploaded: 2020/07/04) | |||
=== | === 検索・置換 === | ||
* [[ポップアップメニューで検索先にジャンプ#sukemaru 版|ポップアップメニューで検索先にジャンプ]] ( | * [[ポップアップメニューで検索先にジャンプ#sukemaru 版|ポップアップメニューで検索先にジャンプ]] (last_modified: 2018/12/13, 2020/06/25) | ||
* [[検索ヒット数表示(選択文字列)]] ※イベントマクロ (last_modified: 2019/12/03) | ** [[検索ジャンプの include版]] (last_modified: 2019/04/16) | ||
** [[検索ジャンプの人柱版]] (last_modified: 2019/03/16) | |||
* [[検索ヒット数表示(選択文字列)]] ※イベントマクロ (last_modified: 2019/12/03) | |||
** 機能強化版「[[検索ヒット数表示(選択文字列)#機能強化バージョン|文字数・行数・バイト数・ヒット件数(選択文字列)]]」 ※イベントマクロ (last_modified: 2019/12/03) | |||
* [[次/前の文字列を検索・改]] (last_modified: 2020/05/12) ※複数行選択から『次/前の文字列を検索』 | * [[次/前の文字列を検索・改]] (last_modified: 2020/05/12) ※複数行選択から『次/前の文字列を検索』 | ||
=== | === プログラミング補助 === | ||
* [[コメントマーク付け外し#sukemaru 版|行コメント]] (last_modified: | * [[コメントマーク付け外し#sukemaru 版|行コメント]] (last_modified: 2020/06/28) ※コメントマーク付け外し ブックマークを保持 | ||
* [[JS フォーマット]] (uploaded: 2020/05/03) ※JavaScript のソースコードの整形 | * [[JS フォーマット]] (uploaded: 2020/05/03) ※JavaScript のソースコードの整形 | ||
** EmEditor 用「Format HTMl, Javascript, Css format for Emeditor」マクロ [https://www.emeditor.com/files/fhtml-jsee/] を Mery に移植するための改造用コード | |||
** 「[[テキスト整形]]」マクロ(masme 氏作成)への機能追加用コード | |||
=== | === おもしろ === | ||
* [[Yahoo!天気情報#sukemaru 版|Yahoo!天気情報]] ※ポップアップメニュー/ダイアログ (last_modified: 2020/05/12) | |||
=== 実験的マクロ・練習マクロなど === | |||
* 【自家用】 [[ファイルのフルパスをコピーして閉じる]] ※イベントマクロ (last_modified: 2019/04/14) | * 【自家用】 [[ファイルのフルパスをコピーして閉じる]] ※イベントマクロ (last_modified: 2019/04/14) | ||
* 【実験】 [[位置情報を保存してから「次の文字列を検索」]]+ 復帰 (include版) (uploaded: 2019/05/28) | * 【実験】 [[位置情報を保存してから「次の文字列を検索」]]+ 復帰 (include版) (uploaded: 2019/05/28) | ||
* 【自家用】[[行の表示方法を切り替える]] (last_modified: 2019/08/24) ※論理行/表示行 トグル切り替え | * 【自家用】[[行の表示方法を切り替える]] (last_modified: 2019/08/24) ※論理行/表示行 トグル切り替え | ||
* 【自家用】[[ | * 【自家用】[[パスを貼り付け(ポップアップメニュー)]] (uploaded: 2020/12/30) ※ Mery Ver 3.2.2 以降 [https://www.haijin-boys.com/discussions/5835#discussion-5868] | ||
* 【実験】 [[タブが「縦書き」モードかチェックする]] ※組み込み用関数 (uploaded: 2019/04/29 → '''2019/ 削除''') | |||
* 【実験】 [[タブが「縦書き」モードかチェックする]] ※組み込み用関数 (uploaded: 2019/04/29 → '''2019/ 削除''') | ** サンプルコード: 「特定の条件で縦書きモードに切りかえる」(※ ver 2.6.5 - 2.7.5 用) | ||
* 【実験】 [[ファイルへ移動(物理座標ジャンプ)]] (uploaded: 2019/05/15 → '''2019/10/27 削除''') | * 【実験】 [[ファイルへ移動(物理座標ジャンプ)]] (uploaded: 2019/05/15 → '''2019/10/27 削除''') | ||
* 【実験】 [[ブックマークを復元(Mery 2.7用)]] (last_modified: 2019/04/07 → '''2019/04/12 削除''') | * 【実験】 [[ブックマークを復元(Mery 2.7用)]] (last_modified: 2019/04/07 → '''2019/04/12 削除''') | ||
* 【自家用】[[対応する括弧に移動#sukemaru 版|対応するカッコに移動・選択]] (last_modified: 2019/12/05 → '''2019/ 削除''') | |||
* 【実験】 [[カッコで囲う2]](マルチカーソル貼り付け) (uploaded: 2020/06/06 → 2020/06/23 <b style="color:#c00;">削除</b>) ※ Mery ver 3 以降 | |||
* [[ | |||
< | |||
</ | |||
=== | === その他 === | ||
* [[折り返しトグル切り替え#3つの折り返しモードを順々にトグルする|折り返しトグル切り替え]] (include版) (last_modified: 2020/03/15) | * [[折り返しトグル切り替え#3つの折り返しモードを順々にトグルする|折り返しトグル切り替え]] (include版) (last_modified: 2020/03/15) | ||
* [[Mery.iniのオプション値を取得]] ※組み込み用関数 (last_modified: 2020/05/14) | * [[Mery.iniのオプション値を取得]] ※組み込み用関数 (last_modified: 2020/05/14) | ||
* [[Mery本体のバージョンチェック]] ※組み込み用関数 (uploaded: 2019/04/17) | * [[Mery本体のバージョンチェック]] ※組み込み用関数 (uploaded: 2019/04/17) | ||
** サンプルコード: 「Begin/EndUndoGroup() メソッドを使えるのは ver 2.7.0 以降」 | |||
* [[IO.Serialize() の JSON を参照する]] ※組み込み用関数 (uploaded: 2019/04/17) | * [[IO.Serialize() の JSON を参照する]] ※組み込み用関数 (uploaded: 2019/04/17) | ||
* [[ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する]] ※組み込み用関数 (last_modified: 2020/05/28) | * [[ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する]] ※組み込み用関数 (last_modified: 2020/05/28) | ||
** サンプルコード: 「すべての論理行をポップアップメニューに表示する」 | |||
* [[アクティブなタブのマクロを実行する]] (last_modified: 2020/04/30) | * [[アクティブなタブのマクロを実行する]] (last_modified: 2020/04/30) | ||
* [[「クリップボード履歴」メニューのマクロ化]] (include版) ※ポップアップメニュー (last_modified: | * [[「クリップボード履歴」メニューのマクロ化]] (include版) ※ポップアップメニュー (last_modified: 2020/06/27) | ||
** ※「スニペット」の機能を統合 / ※ ver 2.8.1 以降用 | |||
* [[コンパクトメニュー]] ※ポップアップメニュー (last_modified: 2020/03/29) | * [[コンパクトメニュー]] ※ポップアップメニュー (last_modified: 2020/03/29) | ||
* [[マクロメニュー]] ※ポップアップメニュー (last_modified: 2020/ | * [[マクロメニュー]] ※ポップアップメニュー (last_modified: 2020/06/03) | ||
* [[Mery.his の履歴を整理]] (uploaded: 2021/01/20) | |||
* [[ | |||
=== 開発者向け === | |||
* [[キーアサイン集]] (last_modified: 2018/10/19 ※w/ ks氏, masme氏, 有志) | * [[キーアサイン集]] (last_modified: 2018/10/19 ※w/ ks氏, masme氏, 有志) | ||
* [[マテリアルデザインっぽいアイコンと『小マクロ集』]] (last_modified: 2020/01/04) ※アイコン収録数 '''337''' コ | * [[マテリアルデザインっぽいアイコンと『小マクロ集』]] (last_modified: 2020/01/04) ※アイコン収録数 '''337''' コ | ||
* [[GetKeyState.exe(キー状態取得実行ファイル)]] の [[GetKeyState.exe(キー状態取得実行ファイル)#実装例|サンプルコード2, 3]] (2019/03/23 - 2019/12/03) | |||
* [[マクロ用 定数一覧]] (last_modified: 2021/01/27) | |||
== 外部サイトに投稿したマクロ == | == 外部サイトに投稿したマクロ == | ||
* [https://pastebin.com/5rUw36qM StrConvテキスト変換メニュー] (uploaded: 2018/08/25) | * [https://pastebin.com/5rUw36qM StrConvテキスト変換メニュー] (uploaded: 2018/08/25) | ||
* [https://pastebin.com/Bci0eEx2 gPad用 文字数・行数・ヒット数] (uploaded: 2019/08/26) | ** 山本隆 氏作成の [http://gesource.jp/soft/strconv/strconvdll.html 文字変換ライブラリ StrConvDLL] の機能をポップアップメニューにまとめたマクロ | ||
* [https://pastebin.com/Bci0eEx2 gPad用 文字数・行数・ヒット数] (uploaded: 2019/08/26) | |||
** Mery 用マクロ「[[検索ヒット数表示(選択文字列)#機能強化バージョン|文字数・行数・ヒット件数(選択文字列)]]」を [https://mfactory.me/ gPad] 用に改編したもの | |||
== 組み込み用コード・小関数 == | == 組み込み用コード・小関数 == | ||
メインコードの途中に短い [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/function 関数] を置く場合は、最初の呼び出しコードより前に変数([https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/function 関数式])として定義しておいてもよい。 | メインコードの途中に短い [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/function 関数] を置く場合は、最初の呼び出しコードより前に変数([https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/function 関数式])として定義しておいてもよい。 | ||
< | <syntaxhighlight lang="javascript"> | ||
{ | { | ||
var hoge = "hogehoge"; | var hoge = "hogehoge"; | ||
| 148行目: | 128行目: | ||
} | } | ||
} | } | ||
</ | </syntaxhighlight> | ||
ならば、以下のような記述でも同じ意味 (ただし、関数式の場合は、最初に呼び出す文よりも前に定義しておくこと)。 | ならば、以下のような記述でも同じ意味 (ただし、関数式の場合は、最初に呼び出す文よりも前に定義しておくこと)。 | ||
< | <syntaxhighlight lang="javascript"> | ||
// 関数式は最初に呼び出されるよりも前に定義すること | // 関数式は最初に呼び出されるよりも前に定義すること | ||
var HogeFuga = function( str ) { | var HogeFuga = function( str ) { | ||
| 158行目: | 138行目: | ||
document.selection.Text = HogeFuga( hoge ); | document.selection.Text = HogeFuga( hoge ); | ||
</ | </syntaxhighlight> | ||
=== メタ記号をエスケープする === | === メタ記号をエスケープする === | ||
任意の文字列を正規表現変数 <syntaxhighlight lang="javascript" inline>RegExp()</syntaxhighlight> におさめる前などにエスケープ(退避修飾)する。 | |||
* '''正規表現のメタ記号のみ''' をエスケープする方法。 | |||
* '''正規表現のメタ記号のみ''' をエスケープする方法。 | |||
: ※ ref. 『[https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping 正規表現 - JavaScript | MDN]』 | : ※ ref. 『[https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions#Escaping 正規表現 - JavaScript | MDN]』 | ||
< | <syntaxhighlight lang="javascript"> | ||
/** | /** | ||
* 関数 RegQuote( str ) | * 関数 RegQuote( str ) | ||
| 178行目: | 156行目: | ||
return str.replace( /[.*+?^=!:${}()|[\]\/\\]/g, "\\$&" ); | return str.replace( /[.*+?^=!:${}()|[\]\/\\]/g, "\\$&" ); | ||
} | } | ||
</ | </syntaxhighlight> | ||
* または、記述の簡単な方法(ただし、<q>処理対象の文字列が長大</q> な場合や <q>日本語テキスト</q> の場合には適さない)。 | * または、記述の簡単な方法(ただし、<q>処理対象の文字列が長大</q> な場合や <q>日本語テキスト</q> の場合には適さない)。 | ||
: ※ ref. 『[https://ja.wikibooks.org/wiki/JavaScript/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE#RegExp JavaScript/正規表現 - Wikibooks]』 | : ※ ref. 『[https://ja.wikibooks.org/wiki/JavaScript/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE#RegExp JavaScript/正規表現 - Wikibooks]』 | ||
< | <syntaxhighlight lang="javascript"> | ||
/** | /** | ||
* 関数 Quote( str ) | * 関数 Quote( str ) | ||
| 201行目: | 179行目: | ||
// } ); | // } ); | ||
// } | // } | ||
</ | </syntaxhighlight> | ||
: ※ JavaScript において <b style="color:#c00;"> $& </b> は "マッチした部分文字列全体" を意味する JavaScript ネイティブの [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter 特殊変数]。 | : ※ JavaScript において <b style="color:#c00;"> $& </b> は "マッチした部分文字列全体" を意味する JavaScript ネイティブの [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_string_as_a_parameter 特殊変数]。 | ||
: ※ 後述、[[#関数の「呼び出しコスト」|関数の「呼び出しコスト」]] の項に書いているように、上出のふたつの < | :: 置換関数 function() の引数がひとつの場合、その引数は <b style="color:#c00;"> $& </b> と同じ意味になるので、上の関数で '''$0''' と記述していることに特別な意味はない('''tmp''' や '''str'''、'''chr''' など任意の文字列でもよい)。 | ||
: ※ 後述、[[#関数の「呼び出しコスト」|関数の「呼び出しコスト」]] の項に書いているように、上出のふたつの <syntaxhighlight lang="javascript" inline>Quote( str )</syntaxhighlight> 関数の処理速度にはちがいが生じる。 | |||
=== 数値を3ケタ区切り(カンマ区切り)にする === | === 数値を3ケタ区切り(カンマ区切り)にする === | ||
< | <syntaxhighlight lang="javascript"> | ||
/** | /** | ||
* 関数 SeparateNum( num ) | * 関数 SeparateNum( num ) | ||
| 219行目: | 197行目: | ||
return num.toString().replace( /(\d)(?=(?:\d{3})+(?!\d))/g, "$1," ); | return num.toString().replace( /(\d)(?=(?:\d{3})+(?!\d))/g, "$1," ); | ||
} | } | ||
</ | </syntaxhighlight> | ||
小数、または半角数字を含む文字列の場合は | 小数、または半角数字を含む文字列の場合は | ||
< | <syntaxhighlight lang="javascript"> | ||
/** | /** | ||
* 関数 SeparateNum2( num ) | * 関数 SeparateNum2( num ) | ||
| 240行目: | 218行目: | ||
return a.join( "" ); | return a.join( "" ); | ||
} | } | ||
</ | </syntaxhighlight> | ||
=== 数値を小数点以下3ケタの固定長にする === | === 数値を小数点以下3ケタの固定長にする === | ||
< | <syntaxhighlight lang="javascript"> | ||
/** | /** | ||
* 関数 NumFix( num ) | * 関数 NumFix( num ) | ||
| 266行目: | 243行目: | ||
// 対象が数値( Number 型)であれば toFixed() だけでよい | // 対象が数値( Number 型)であれば toFixed() だけでよい | ||
// num = num.toFixed( 3 ); | // num = num.toFixed( 3 ); | ||
</ | </syntaxhighlight> | ||
=== 数値をケタ埋め(ゼロ埋め)する === | === 数値をケタ埋め(ゼロ埋め)する === | ||
※ 引数の型に応じた関数を使用する。 | ※ 引数の型に応じた関数を使用する。 | ||
< | <syntaxhighlight lang="javascript"> | ||
/** | /** | ||
* 関数 Pad( num ) | * 関数 Pad( num ) | ||
| 285行目: | 259行目: | ||
return num < 10 ? "0" + num : num; | return num < 10 ? "0" + num : num; | ||
} | } | ||
</ | </syntaxhighlight> | ||
< | <syntaxhighlight lang="javascript"> | ||
/** | /** | ||
* 関数 Pad2( str ) | * 関数 Pad2( str ) | ||
| 299行目: | 273行目: | ||
} ); | } ); | ||
} | } | ||
</ | </syntaxhighlight> | ||
< | <syntaxhighlight lang="javascript"> | ||
/** | /** | ||
* 関数 NumPad2( val ) | * 関数 NumPad2( val ) | ||
| 312行目: | 286行目: | ||
} ); | } ); | ||
} | } | ||
</ | </syntaxhighlight> | ||
=== 任意の文字列のくりかえしで埋める === | === 任意の文字列のくりかえしで埋める === | ||
※ Windows XP 用 | ※ Windows XP 用 | ||
< | <syntaxhighlight lang="javascript"> | ||
/** | /** | ||
* 関数 Repeat( str, count ) | * 関数 Repeat( str, count ) | ||
| 331行目: | 304行目: | ||
return ret; | return ret; | ||
} | } | ||
</ | </syntaxhighlight> | ||
=== ascii 文字に対応する全角英数記号を半角変換 / 数値専用の入力ダイアログ === | === ascii 文字に対応する全角英数記号を半角変換 / 数値専用の入力ダイアログ === | ||
※ IME: ON の状態で入力された「全角数字」も許容、「全角/半角の数字」以外の文字列は無視する入力ダイアログのサンプルコード | ※ IME: ON の状態で入力された「全角数字」も許容、「全角/半角の数字」以外の文字列は無視する入力ダイアログのサンプルコード | ||
< | <syntaxhighlight lang="javascript"> | ||
/** | /** | ||
* 関数 ToHalfWidth( str ) | * 関数 ToHalfWidth( str ) | ||
| 348行目: | 320行目: | ||
return String.fromCharCode( tmp.charCodeAt(0) - 0xFEE0 ) | return String.fromCharCode( tmp.charCodeAt(0) - 0xFEE0 ) | ||
} ) }; | } ) }; | ||
/** | /** | ||
| 365行目: | 336行目: | ||
if ( ! p ) { Status = "キャンセル"; } | if ( ! p ) { Status = "キャンセル"; } | ||
else { Alert( p ); } | else { Alert( p ); } | ||
</ | </syntaxhighlight> | ||
=== ストップウォッチ・タイマー === | === ストップウォッチ・タイマー === | ||
<syntaxhighlight lang="javascript"> | |||
< | |||
// 計測開始 ※ ソースコードの先頭付近におくこと | // 計測開始 ※ ソースコードの先頭付近におくこと | ||
var start = new Date(); | var start = new Date(); | ||
| 379行目: | 348行目: | ||
// ステータスバーに処理時間を表示 | // ステータスバーに処理時間を表示 | ||
Status = ( ( new Date() - start ) / 1000 ).toFixed( 3 ) + " 秒"; | Status = ( ( new Date() - start ) / 1000 ).toFixed( 3 ) + " 秒"; | ||
</ | </syntaxhighlight> | ||
=== Mery のバージョン情報 === | === Mery のバージョン情報 === | ||
<syntaxhighlight lang="javascript"> | |||
< | |||
/** | /** | ||
* Mery のバージョン情報 | * Mery のバージョン情報 | ||
| 391行目: | 358行目: | ||
+ editor.Version; | + editor.Version; | ||
Status = meryVersion; | Status = meryVersion; | ||
</ | </syntaxhighlight> | ||
=== JavaScript (JScript) エンジンのバージョン情報 === | === JavaScript (JScript) エンジンのバージョン情報 === | ||
※ ref. 『[https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392005%28v=msdn.10%29 ScriptEngine 関数 (JScript) | Microsoft Docs]』 | ※ ref. 『[https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392005%28v=msdn.10%29 ScriptEngine 関数 (JScript) | Microsoft Docs]』 | ||
< | <syntaxhighlight lang="javascript"> | ||
/** | /** | ||
* JavaScript (JScript) エンジンのバージョン情報 | * JavaScript (JScript) エンジンのバージョン情報 | ||
| 406行目: | 372行目: | ||
+ ScriptEngineBuildVersion(); | + ScriptEngineBuildVersion(); | ||
Status = engine; | Status = engine; | ||
</ | </syntaxhighlight> | ||
== リンク集 == | |||
'''[[メインページ|MeryWiki]] / [https://www.haijin-boys.com/ Haijin Boys Online]''' 内 | |||
'''[ | * [[マクロライブラリ#開発者向け|マクロライブラリ]] の 「[[マクロ覚え書き(開発者向け)]]」 | ||
* [[マクロライブラリ# | * 黄身氏の「[[利用者:黄身#覚え書き|覚え書き]]」 | ||
* | * MeryWiki の [[マクロリファレンス]](Mery ver 2.6.7 用) | ||
* MeryWiki の [ | * MeryWiki の [[マクロリファレンス:3]](Mery ver 3.0.0 以降用) | ||
* MeryWiki の [ | * MeryWiki の [[よくある質問]] | ||
* MeryWiki の [ | |||
* [https://www.haijin-boys.com/discussions Mery 公式フォーラム] | * [https://www.haijin-boys.com/discussions Mery 公式フォーラム] | ||
; 外部サイト | ; 外部サイト | ||
* MDN web docus(mozzila)の[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference 「JavaScript リファレンス」] | * MDN web docus(mozzila)の[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference 「JavaScript リファレンス」] | ||
* MSDN(Microsoft Docs)の[https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392483%28v=msdn.10%29 「Microsoft Windows スクリプト テクノロジ」] | * MSDN(Microsoft Docs)の[https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc392483%28v=msdn.10%29 「Microsoft Windows スクリプト テクノロジ」] | ||
* MSDN(Microsoft Docs)の[https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc409859%28v%3dmsdn.10%29 「JScript ランゲージ リファレンス」] | * MSDN(Microsoft Docs)の[https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc409859%28v%3dmsdn.10%29 「JScript ランゲージ リファレンス」] | ||
* MSDN(Microsoft Docs)の[https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc364460%28v=msdn.10%29 「WSH リファレンス」] | * MSDN(Microsoft Docs)の[https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc364460%28v=msdn.10%29 「WSH リファレンス」] | ||
* MSDN(Microsoft Docs)の[https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc427968%28v%3dmsdn.10%29 「FileSystemObject リファレンス」] | * MSDN(Microsoft Docs)の[https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc427968%28v%3dmsdn.10%29 「FileSystemObject リファレンス」] | ||
* MDN web docus(mozzila)の[https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions 「JavaScript ガイド >> 正規表現」] | * MDN web docus(mozzila)の[https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Regular_Expressions 「JavaScript ガイド >> 正規表現」] | ||
* MSDN(Microsoft Docs)の[https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc427946%28v=msdn.10%29 「JScript 正規表現の概説」] | * MSDN(Microsoft Docs)の[https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc427946%28v=msdn.10%29 「JScript 正規表現の概説」] | ||
* onigmo(鬼雲 / 鬼車・改)の[https://github.com/k-takata/Onigmo/blob/master/doc/RE.ja 「正規表現 ReadMe」] | * onigmo(鬼雲 / 鬼車・改)の[https://github.com/k-takata/Onigmo/blob/master/doc/RE.ja 「正規表現 ReadMe」] | ||
== Tips == | |||
拙作マクロはポップアップメニューを利用するものが多いので、Tips はその方面の内容に偏ってしまいますが、以下、個人的に注意していることや気付いたことなど。 | 拙作マクロはポップアップメニューを利用するものが多いので、Tips はその方面の内容に偏ってしまいますが、以下、個人的に注意していることや気付いたことなど。 | ||
=== Document と Editor.ActiveDocument === | === Document と Editor.ActiveDocument === | ||
; マクロをツールバーアイコン化する意味(?) | ; マクロをツールバーアイコン化する意味(?) | ||
大前提として [[マクロライブラリ]] の [[マクロ覚え書き(開発者向け)#window.Document と Editor.ActiveDocument の違い|マクロ覚え書き(開発者向け)]] で説明されているような違いがあるが、 [[マクロリファレンス:Editor インターフェイス#ActiveDocument プロパティ|Editor.ActiveDocument]] は、マクロ開始時点でタブにフォーカスがあろうとなかろうと [[マクロリファレンス:Document インターフェイス|window.Document]] オブジェクトを取得することができる、という違いもある。 | 大前提として [[マクロライブラリ]] の [[マクロ覚え書き(開発者向け)#window.Document と Editor.ActiveDocument の違い|マクロ覚え書き(開発者向け)]] で説明されているような違いがあるが、 [[マクロリファレンス:Editor インターフェイス#ActiveDocument プロパティ|Editor.ActiveDocument]] は、マクロ開始時点でタブにフォーカスがあろうとなかろうと [[マクロリファレンス:Document インターフェイス|window.Document]] オブジェクトを取得することができる、という違いもある。 | ||
* 通常、アウトプットバーやアウトラインペイン、検索/置換ダイアログにフォーカスがあると、ショートカットキーからはマクロを起動することはできないし、起動してもマクロ開始時点での <code>Document</code> オブジェクトが <code>undefined</code> になるので <code>Document.Selection</code> のメソッドなどが使用できなくなる。 | * 通常、アウトプットバーやアウトラインペイン、検索/置換ダイアログにフォーカスがあると、ショートカットキーからはマクロを起動することはできないし、起動してもマクロ開始時点での <code>Document</code> オブジェクトが <code>undefined</code> になるので <code>Document.Selection</code> のメソッドなどが使用できなくなる。 | ||
| 449行目: | 405行目: | ||
: ※ ただし、アクティブなタブ以外を操作・編集するマクロにおいては <code>Editor.Documents.Item(n)</code> などのような形式での記述が必要。 | : ※ ただし、アクティブなタブ以外を操作・編集するマクロにおいては <code>Editor.Documents.Item(n)</code> などのような形式での記述が必要。 | ||
マウス派・ツールバーアイコン派の sukemaru においては、マクロをツールバー/マクロバーから使用するために [[マテリアルデザインっぽいアイコンと『小マクロ集』|アイコン]] を作ったり、マクロバーに1つでも多くのアイコンを詰め込むために | マウス派・ツールバーアイコン派の sukemaru においては、マクロをツールバー/マクロバーから使用するために [[マテリアルデザインっぽいアイコンと『小マクロ集』|アイコン]] を作ったり、マクロバーに1つでも多くのアイコンを詰め込むために 試行錯誤 したり…。 | ||
※ マクロ/プラグイン/外部ツールの登録数が多かったり <code>#icon="hoge.ico"</code> でアイコン化しているマクロが多いせいか、Mery の起動がもたつくのが悩ましい… ([[#投稿した構文ファイル|自作の編集モード]] が重いのも影響しているかも) | ※ マクロ/プラグイン/外部ツールの登録数が多かったり <code>#icon="hoge.ico"</code> でアイコン化しているマクロが多いせいか、Mery の起動がもたつくのが悩ましい… ([[#投稿した構文ファイル|自作の編集モード]] が重いのも影響しているかも) | ||
=== イベントマクロ === | === イベントマクロ === | ||
| 508行目: | 462行目: | ||
|ファイルを保存する前。 | |ファイルを保存する前。 | ||
|} | |} | ||
: ※ 複数のイベントマクロで <b style="color:#c00;">各赤字イベント</b> の遅延時間の設定は共有されるので、同じイベントに複数のマクロを割りあてている場合にマクロの発動の順序を恣意的に指定することはできない。 | : ※ 複数のイベントマクロで <b style="color:#c00;">各赤字イベント</b> の遅延時間の設定は共有されるので、同じイベントに複数のマクロを割りあてている場合にマクロの発動の順序を恣意的に指定することはできない。 | ||
:: → マクロのコードを統合するか、イベントを設定するマクロをひとつだけにして [[マクロ覚え書き(開発者向け)#他のマクロの実行方法|include]] で別のマクロを発動させることができる。 | |||
: ※ イベントマクロ であっても、ショートカットキーなどから任意のタイミングで強制的に実行することもできる。 | : ※ イベントマクロ であっても、ショートカットキーなどから任意のタイミングで強制的に実行することもできる。 | ||
: ※ イベントマクロでない「マクロA」のコードでファイルを 開く または 閉じる をおこない、それ以降にも「マクロA」のコードが続いている場合は、ファイルを開いた時/閉じた時の「イベントマクロB」は発動しないことがある。 | : ※ イベントマクロでない「マクロA」のコードでファイルを 開く または 閉じる をおこない、それ以降にも「マクロA」のコードが続いている場合は、ファイルを開いた時/閉じた時の「イベントマクロB」は発動しないことがある。 | ||
* sukemaru の Mery では、「[[バイト数#バイト数と文字数・行数|バイト数]]」マクロと「[[検索ヒット数表示(選択文字列)]]」マクロの機能を統合した「[[検索ヒット数表示(選択文字列)#機能強化バージョン|文字数・行数・バイト数・ヒット件数]]」マクロに「ファイルを開いた時」「<span style="color:#c00;">選択範囲が変更された時</span>」「<span style="color:#c00;">テキストが変更された時</span>」「<span style="color:#c00;">文字が挿入された時</span>」「アクティブな文書が変更された時」イベントを設定している(<span style="color:#c00;">赤字</span> の各イベントには遅延時間を 1 秒に設定。 ロースペックな PC ゆえ、一定以上の長さのファイル/タブにおいては機能を制限してある)。 | * sukemaru の Mery では、「[[バイト数#バイト数と文字数・行数|バイト数]]」マクロと「[[検索ヒット数表示(選択文字列)]]」マクロの機能を統合した「[[検索ヒット数表示(選択文字列)#機能強化バージョン|文字数・行数・バイト数・ヒット件数]]」マクロに「ファイルを開いた時」「<span style="color:#c00;">選択範囲が変更された時</span>」「<span style="color:#c00;">テキストが変更された時</span>」「<span style="color:#c00;">文字が挿入された時</span>」「アクティブな文書が変更された時」イベントを設定している(<span style="color:#c00;">赤字</span> の各イベントには遅延時間を 1 秒に設定。 ロースペックな PC ゆえ、一定以上の長さのファイル/タブにおいては機能を制限してある)。 | ||
* また、「[[編集モードの自動選択#sukemaru 版2(include版)|編集モードの自動選択 (include版)]]」マクロを「ファイルを開いた時」「文書を閉じた時」イベントに、[[編集モードの自動選択#サブマクロ|補助マクロ]] を「ファイルを保存した時」イベントに設定して、それなりに按配よく運用できている。 | ** 遅延時間が短すぎると、"文字列や選択範囲を変更するような他のマクロの実行後に、そのマクロからのステータスメッセージが読めなくなるから"、という意味もある。 | ||
* また、「[[編集モードの自動選択#sukemaru 版2(include版)|編集モードの自動選択 (include版)]]」マクロを「ファイルを開いた時」「文書を閉じた時」イベントに、[[編集モードの自動選択#サブマクロ|補助マクロ]] を「ファイルを保存した時」イベントに設定して、それなりに按配よく運用できている。 | |||
** ([[includeライブラリ]] を利用して、複数のファイルを開いたときにもそれぞれのタブにたいして編集モードの変更や書き換え禁止を適用できるようにしてある) | |||
=== ポップアップメニュー === | === ポップアップメニュー === | ||
sukemaru の環境では、メニューに表示するアイテムが 5000 件とか 10000 件とかを超えるとポップアップメニューが表示されず(エラーメッセージも表示されず)にマクロが終了してしまうことがある…。 | sukemaru の環境では、メニューに表示するアイテムが 5000 件とか 10000 件とかを超えるとポップアップメニューが表示されず(エラーメッセージも表示されず)にマクロが終了してしまうことがある…。 | ||
「[[ポップアップメニューで検索先にジャンプ#sukemaru 版|検索ジャンプ]]」マクロの include 版で発生するのだが、ポップアップメニューを表示する直前にステータスバーに表示すべき情報を <code>ClipboardData.SetData( Status );</code> でコピーしておくと、 | |||
<code>ヒット数: 21,525 件 ( 4 件目 ) ・ 21,525 行 ( 4 行目 ) / 全体の行数: 61,001 行 [ 12. 906 秒 ]</code> | 「[[ポップアップメニューで検索先にジャンプ#sukemaru 版|検索ジャンプ]]」マクロの include 版で発生するのだが、ポップアップメニューを表示する直前にステータスバーに表示すべき情報を <code>ClipboardData.SetData( Status );</code> でコピーしておくと、 | ||
のようにデータが残ったので、前処理段階でコケたのではなくポップアップメニューの描画のさいにコケていたようだ。 | |||
また、11 万行の文書から空行を検索したとき、ステータスバーに以下のメッセージを表示して | <code>ヒット数: 21,525 件 ( 4 件目 ) ・ 21,525 行 ( 4 行目 ) / 全体の行数: 61,001 行 [ 12. 906 秒 ]</code> | ||
<code>一致: 27,814 行 / 空白行数: 27,849 行 / 全体の行数: 111,186 行 [ 6. 485 秒 ]</code> | |||
ポップアップメニューも表示されたが、実際に表示されていたアイテム数は 6000 件台で、20000 件以上のアイテムは表示されずにスポイルされてしまっていたということもあった。 | のようにデータが残ったので、前処理段階でコケたのではなくポップアップメニューの描画のさいにコケていたようだ。 | ||
また、11 万行の文書から空行を検索したとき、ステータスバーに以下のメッセージを表示して | |||
<code>一致: 27,814 行 / 空白行数: 27,849 行 / 全体の行数: 111,186 行 [ 6. 485 秒 ]</code> | |||
ポップアップメニューも表示されたが、実際に表示されていたアイテム数は 6000 件台で、20000 件以上のアイテムは表示されずにスポイルされてしまっていたということもあった。 | |||
以下の単純なコードでアイテム 10000 件のポップアップメニューを表示させようとしても、4000 件ぐらい(4000 前後で不定)までしか表示されない…。 | 以下の単純なコードでアイテム 10000 件のポップアップメニューを表示させようとしても、4000 件ぐらい(4000 前後で不定)までしか表示されない…。 | ||
< | <syntaxhighlight lang="javascript"> | ||
var m = CreatePopupMenu(); | var m = CreatePopupMenu(); | ||
for ( var i = 1; i <= 10000; i ++ ) { | for ( var i = 1; i <= 10000; i ++ ) { | ||
| 534行目: | 495行目: | ||
} | } | ||
var r = m.Track( mePosMouse ); | var r = m.Track( mePosMouse ); | ||
</ | </syntaxhighlight> | ||
環境依存の不具合かもしれないが、はて…? | 環境依存の不具合かもしれないが、はて…? | ||
==== オプションフラグ ==== | ==== オプションフラグ ==== | ||
[[マクロリファレンス:PopupMenu インターフェイス#Add メソッド|PopupMenu.Add() メソッド]] の第三引数 '''Flags''' : int を数値化すると | [[マクロリファレンス:PopupMenu インターフェイス#Add メソッド|PopupMenu.Add() メソッド]] の第三引数 '''Flags''' : int を数値化すると | ||
< | <syntaxhighlight lang="javascript"> | ||
meMenuChecked = 1 | meMenuChecked = 1 | ||
meMenuGrayed = 2 | meMenuGrayed = 2 | ||
meMenuChecked + meMenuGrayed = 3 | meMenuChecked + meMenuGrayed = 3 | ||
meMenuSeparator = 4 | meMenuSeparator = 4 | ||
</ | </syntaxhighlight> | ||
となるので、真偽値が < | となるので、真偽値が <syntaxhighlight lang="javascript" inline>true=1</syntaxhighlight> / <syntaxhighlight lang="javascript" inline>false=0</syntaxhighlight> で評価されることを利用して、真偽値を返す変数や条件式を代入することができる(ただし Number 型に変換する必要がある ← 算術演算子 <syntaxhighlight lang="javascript" inline>+</syntaxhighlight> をつけるなど)。 | ||
< | <syntaxhighlight lang="javascript"> | ||
var menu = CreatePopupMenu(); | var menu = CreatePopupMenu(); | ||
var hoge = true; | var hoge = true; | ||
| 560行目: | 520行目: | ||
} | } | ||
var num = menu.Track( mePosMouse ); | var num = menu.Track( mePosMouse ); | ||
</ | </syntaxhighlight> | ||
: ※ オプションフラグ ''meMenuGrayed'' を使用して条件付きで特定の項目をグレーアウトするだけでなく、<code>menu.Add( ... );</code> の行を [https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Control_flow_and_error_handling#if...else_statement if() 文] で囲むなどすれば、状況に応じたメニュー項目だけを表示させることもできる。 | : ※ オプションフラグ ''meMenuGrayed'' を使用して条件付きで特定の項目をグレーアウトするだけでなく、<code>menu.Add( ... );</code> の行を [https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Control_flow_and_error_handling#if...else_statement if() 文] で囲むなどすれば、状況に応じたメニュー項目だけを表示させることもできる。 | ||
==== アクセラレータ ==== | ==== アクセラレータ ==== | ||
ポップアップメニューのラベルの文字列に「半角アンパサンド記号 '''<q>&</q>''' + '''半角英数字''' (またはアスキー記号)」を付記することで、アクセラレータ(アクセスキー)を設定することができる。 | ポップアップメニューのラベルの文字列に「半角アンパサンド記号 '''<q>&</q>''' + '''半角英数字''' (またはアスキー記号)」を付記することで、アクセラレータ(アクセスキー)を設定することができる。 | ||
ラベルの先頭に連番数字などがある場合は、数字のまえにアンパサンド記号を付加して数字をアクセラレータにすることもできる。 | |||
ラベルの先頭に連番数字などがある場合は、数字のまえにアンパサンド記号を付加して数字をアクセラレータにすることもできる。 | |||
そのさい、Shift キー付きでの入力が必要な記号は Shift キーなしで入力可能なキーのラベルと同一視される (e.g. 「'''&#'''」で '''<q>#</q>''' 記号をアクセラレータに指定した場合、JIS 配列のキーボードでは <kbd>3</kbd> キーがアクセラレータになる)。 | そのさい、Shift キー付きでの入力が必要な記号は Shift キーなしで入力可能なキーのラベルと同一視される (e.g. 「'''&#'''」で '''<q>#</q>''' 記号をアクセラレータに指定した場合、JIS 配列のキーボードでは <kbd>3</kbd> キーがアクセラレータになる)。 | ||
* <span style="color:#0000c0;">'''<q>&</q>''' 記号でアクセラレータ化する文字の位置は限定されないが、<u>最初の '''<q>&</q>''' 記号のうしろの文字がアクセラレータになる</u></span>( … とおもわれる ← ポップアップメニュー内で「下線つきで表示される文字」と一致しないことがある)。 | * <span style="color:#0000c0;">'''<q>&</q>''' 記号でアクセラレータ化する文字の位置は限定されないが、<u>最初の '''<q>&</q>''' 記号のうしろの文字がアクセラレータになる</u></span>( … とおもわれる ← ポップアップメニュー内で「下線つきで表示される文字」と一致しないことがある)。 | ||
* <span style="color:#c00;">全角文字はアクセラレータにできない。</span> | * <span style="color:#c00;">全角文字はアクセラレータにできない。</span> | ||
* <span style="color:#c00;">ラベル文字列に含まれる '''<q>&</q>''' 記号はすべてエスケープされてしまい、ポップアップメニューには表示されなくなるので、ラベルに '''<q>&</q>''' 記号を表示させたいときは、'''<q>&&</q>''' のように二重に記述する必要がある。</span> | * <span style="color:#c00;">ラベル文字列に含まれる '''<q>&</q>''' 記号はすべてエスケープされてしまい、ポップアップメニューには表示されなくなるので、ラベルに '''<q>&</q>''' 記号を表示させたいときは、'''<q>&&</q>''' のように二重に記述する必要がある。</span> | ||
** → 不特定の文字列 <syntaxhighlight lang="javascript" inline>String</syntaxhighlight> (文書内から抽出したテキストなど)をラベルにする場合は、あらかじめ <syntaxhighlight lang="javascript" inline>String.replace( /&/g, "&&" )</syntaxhighlight> と記述するとよい。 | |||
: ※ '''<q>&&</q>''' の記述で表示される '''<q>&</q>''' 記号は、アクセラレータにならない。 | : ※ '''<q>&&</q>''' の記述で表示される '''<q>&</q>''' 記号は、アクセラレータにならない。 | ||
* <span style="color:#0000c0;">同じキーが重複してアクセラレータに指定されていると、そのキーを押した場合、アイテム間をトグル移動する(その場合は <kbd>Enter</kbd> キーで決定する)。</span> | * <span style="color:#0000c0;">同じキーが重複してアクセラレータに指定されていると、そのキーを押した場合、アイテム間をトグル移動する(その場合は <kbd>Enter</kbd> キーで決定する)。</span> | ||
** → アイテム数が多くなるメニューの場合、<syntaxhighlight lang="javascript" inline>menu.Add( "キャンセル & ", 0 );</syntaxhighlight> という行を 10 件とか 20 件ごとに挿入すると、スペースキーでポップアップメニュー内をスクロールさせることができる。 | |||
: ※「'''&<span style="background:#bfdfff;"> </span>'''」(半角アンパサンド+半角空白) で半角スペースをアクセラレータに指定したアイテムは、<kbd>Space</kbd> キーがアクセスキーになる。 | : ※「'''&<span style="background:#bfdfff;"> </span>'''」(半角アンパサンド+半角空白) で半角スペースをアクセラレータに指定したアイテムは、<kbd>Space</kbd> キーがアクセスキーになる。 | ||
< | <syntaxhighlight lang="javascript"> | ||
/* アクセラレータを付加する */ | /* アクセラレータを付加する */ | ||
| 597行目: | 560行目: | ||
var ret = menu.Track( 0 ); | var ret = menu.Track( 0 ); | ||
</ | </syntaxhighlight> | ||
< | <syntaxhighlight lang="javascript"> | ||
/* 10 行ごとに「キャンセル」項目を挿入し、スペースキーでスクロール可能にする */ | /* 10 行ごとに「キャンセル」項目を挿入し、スペースキーでスクロール可能にする */ | ||
| 617行目: | 580行目: | ||
document.selection.SetActivePoint( mePosLogical, 1, y ); | document.selection.SetActivePoint( mePosLogical, 1, y ); | ||
} | } | ||
</ | </syntaxhighlight> | ||
==== ラベルの整形 ==== | ==== ラベルの整形 ==== | ||
* 基本的にポップアップメニュー(警告・確認ダイアログなどもだが)は UI フォントで表示されるので、文字列が英数字の羅列の場合には読みづらい ( …と個人的に感じている @WinXP)。 | * 基本的にポップアップメニュー(警告・確認ダイアログなどもだが)は UI フォントで表示されるので、文字列が英数字の羅列の場合には読みづらい ( …と個人的に感じている @WinXP)。 | ||
: 文書内の文字列など不特定の文字列をラベル化する「[[ポップアップメニューで検索先にジャンプ#sukemaru 版|検索ジャンプ]]」や「[[ブックマーク一覧ジャンプ#sukemaru 版|ブックマークジャンプ]]」、「[[「クリップボード履歴」メニューのマクロ化 | : 文書内の文字列など不特定の文字列をラベル化する「[[ポップアップメニューで検索先にジャンプ#sukemaru 版|検索ジャンプ]]」や「[[ブックマーク一覧ジャンプ#sukemaru 版|ブックマークジャンプ]]」、「[[「クリップボード履歴」メニューのマクロ化]]」マクロでは、読みづらい半角アルファベットや記号を全角化させるなどしている。 | ||
< | <syntaxhighlight lang="javascript"> | ||
/** | /** | ||
* ポップアップメニューに表示するラベルを整形する | * ポップアップメニューに表示するラベルを整形する | ||
| 659行目: | 621行目: | ||
// 文字数を切り詰めた場合は「 ...」を付加 | // 文字数を切り詰めた場合は「 ...」を付加 | ||
menuKey += ( str.length > menuWidth ) ? " ..." : ""; | menuKey += ( str.length > menuWidth ) ? " ..." : ""; | ||
// 文字列の先頭に行番号(連番)を付加する | // 文字列の先頭に行番号(連番)を付加する | ||
| 676行目: | 637行目: | ||
var num = ( " " + y ).slice( - numWidth ).replace( /\d$/, "&$&" ); | var num = ( " " + y ).slice( - numWidth ).replace( /\d$/, "&$&" ); | ||
menuKey = num + ": " + menuKey; | menuKey = num + ": " + menuKey; | ||
</ | </syntaxhighlight> | ||
: ※ このコードでは色々と unicode 文字を使用しているので、マクロの JS ファイルは UTF-8 などの形式で保存しなければならない。 | : ※ このコードでは色々と unicode 文字を使用しているので、マクロの JS ファイルは UTF-8 などの形式で保存しなければならない。 | ||
* また、「[[#マクロライブラリに投稿したマクロ|マクロライブラリに投稿したマクロ]]」の節の画像リンク(サムネイル)のように、タブインデントや連番のケタ埋め、サブメニューの活用などの工夫で、ポップアップメニューの体裁はある程度自分好みにカスタマイズできる。 | * また、「[[#マクロライブラリに投稿したマクロ|マクロライブラリに投稿したマクロ]]」の節の画像リンク(サムネイル)のように、タブインデントや連番のケタ埋め、サブメニューの活用などの工夫で、ポップアップメニューの体裁はある程度自分好みにカスタマイズできる。 | ||
==== ステータスバーの表示 ==== | ==== ステータスバーの表示 ==== | ||
ポップアップメニューの表示と同時ににステータスバーに任意の文字列を表示する場合は、 [[マクロリファレンス:PopupMenu インターフェイス#Track メソッド|PopupMenu.Track()]] の行の直前に ''[[マクロリファレンス:Window インターフェイス#Status プロパティ|Status]] = "hoge";'' を記述する。 | ポップアップメニューの表示と同時ににステータスバーに任意の文字列を表示する場合は、 [[マクロリファレンス:PopupMenu インターフェイス#Track メソッド|PopupMenu.Track()]] の行の直前に ''[[マクロリファレンス:Window インターフェイス#Status プロパティ|Status]] = "hoge";'' を記述する。 | ||
※ <code>PopupMenu.Track()</code> が発動した時点でエディタウインドウ本体は停止するので、直後に <syntaxhighlight lang="javascript" inline>Status = "hoge";</syntaxhighlight> を記述しても、ポップアップメニューの項目を選択するかメニューをキャンセルするまで表示されない。 | ※ <code>PopupMenu.Track()</code> が発動した時点でエディタウインドウ本体は停止するので、直後に <syntaxhighlight lang="javascript" inline>Status = "hoge";</syntaxhighlight> を記述しても、ポップアップメニューの項目を選択するかメニューをキャンセルするまで表示されない。 | ||
< | <syntaxhighlight lang="javascript"> | ||
// e.g. ポップアップメニュー表示までのマクロの処理時間をステータス表示させる | // e.g. ポップアップメニュー表示までのマクロの処理時間をステータス表示させる | ||
| 716行目: | 673行目: | ||
document.selection.SetActivePoint( mePosLogical, 1, yy, false ); | document.selection.SetActivePoint( mePosLogical, 1, yy, false ); | ||
} | } | ||
</ | </syntaxhighlight> | ||
: ※ ポップアップメニューにかぎらず、[[マクロリファレンス:Window インターフェイス#Alert メソッド|警告 (Alert)]] や [[マクロリファレンス:Window インターフェイス#Confirm メソッド|確認 (Confirm)]]、 [[マクロリファレンス:Window インターフェイス#Prompt メソッド|入力 (Prompt)]] ダイアログなどモーダルなポップアップウインドウを表示させる場合も、同様に <syntaxhighlight lang="javascript" inline>Status = "hoge";</syntaxhighlight> を先に記述する必要がある。 | : ※ ポップアップメニューにかぎらず、[[マクロリファレンス:Window インターフェイス#Alert メソッド|警告 (Alert)]] や [[マクロリファレンス:Window インターフェイス#Confirm メソッド|確認 (Confirm)]]、 [[マクロリファレンス:Window インターフェイス#Prompt メソッド|入力 (Prompt)]] ダイアログなどモーダルなポップアップウインドウを表示させる場合も、同様に <syntaxhighlight lang="javascript" inline>Status = "hoge";</syntaxhighlight> を先に記述する必要がある。 | ||
: ※ Mery メインウインドウのメニューバー項目のような、マウスホバーで動的にステータス表示を変更させる制御はできない。 | : ※ Mery メインウインドウのメニューバー項目のような、マウスホバーで動的にステータス表示を変更させる制御はできない。 | ||
==== 配列からポップアップメニューを生成 ==== | ==== 配列からポップアップメニューを生成 ==== | ||
[https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Loop_Statements/for_Statement for 文] などの [https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Loop_Statements/ ループ処理] によって配列からポップアップメニューのアイテムを生成する場合に、[[マクロリファレンス:PopupMenu インターフェイス#Add メソッド|PopupMenu.Add() メソッド]] の第二引数 '''id''' (※通常は 1 ~ )と配列のアイテムのインデックス '''[ i ]''' の値(※通常は 0 ~ )を一致させたいときは、配列の先頭にダミーまたは空の要素を置いておき、ループ処理の開始インデックスを 1 にする。 | [https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Loop_Statements/for_Statement for 文] などの [https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Loop_Statements/ ループ処理] によって配列からポップアップメニューのアイテムを生成する場合に、[[マクロリファレンス:PopupMenu インターフェイス#Add メソッド|PopupMenu.Add() メソッド]] の第二引数 '''id''' (※通常は 1 ~ )と配列のアイテムのインデックス '''[ i ]''' の値(※通常は 0 ~ )を一致させたいときは、配列の先頭にダミーまたは空の要素を置いておき、ループ処理の開始インデックスを 1 にする。 | ||
< | <syntaxhighlight lang="javascript"> | ||
var a = new Array( "" ); // 先頭に空のダミー要素を入れておく | var a = new Array( "" ); // 先頭に空のダミー要素を入れておく | ||
a.push( "あああ" ); | a.push( "あああ" ); | ||
a.push( "いいい" ); | a.push( "いいい" ); | ||
| 734行目: | 689行目: | ||
var menuA = CreatePopupMenu(); | var menuA = CreatePopupMenu(); | ||
for ( var i = 1; i < a.length; i ++ ) { // 開始値を 1 にすると | for ( var i = 1; i < a.length; i ++ ) { // 開始値を var i = 1 にすると | ||
menuA.Add( a[i], i ); // Id を ( i + 1 ) にする必要がない | menuA.Add( a[i], i ); // Id を ( i + 1 ) にする必要がない | ||
} | } | ||
| 746行目: | 701行目: | ||
} | } | ||
var numB = menuB.Track( mePosMouse ); | var numB = menuB.Track( mePosMouse ); | ||
</ | </syntaxhighlight> | ||
==== サブメニュー ==== | |||
サブメニューを組みこむ場合、通常はそれぞれの PopupMenu オブジェクトをあらかじめ宣言しておくものだが、[[マクロリファレンス:PopupMenu インターフェイス#AddPopup メソッド|PopupMenu.AddPopup() メソッド]] 内の第二引数で定義することもできる。 | |||
[[マクロリファレンス:PopupMenu インターフェイス#Add メソッド|PopupMenu.Add() メソッド]] が大量に並んでいる項目群の一部をサブメニュー化して整理したくなったときなどに、サブメニューオブジェクトの宣言行を用意しなくて済むので便利である。 | |||
サブメニューを多重に含むコードの場合、字下げ(インデント)を活用することで、メニューの階層構造を把握しやすくできる。 | サブメニューを多重に含むコードの場合、字下げ(インデント)を活用することで、メニューの階層構造を把握しやすくできる。 | ||
< | <syntaxhighlight lang="javascript"> | ||
var mainMenu = CreatePopupMenu(); | var mainMenu = CreatePopupMenu(); | ||
mainMenu.Add( "アイテム1", 1 ); | mainMenu.Add( "アイテム1", 1 ); | ||
| 764行目: | 720行目: | ||
var r = mainMenu.Track( 0 ); | var r = mainMenu.Track( 0 ); | ||
Alert( r > 0 ? mainMenu.GetText( r ) : "キャンセル" ); | Alert( r > 0 ? mainMenu.GetText( r ) : "キャンセル" ); | ||
</ | </syntaxhighlight> | ||
* 配列やオブジェクトからポップアップメニューの生成をするときにサブメニューを利用する場合、あらかじめサブメニューのラベルや各要素の振り分け方が決まっていれば難しいことはないが、<span style="color:#c00;">要素が不定数の配列やオブジェクトを複数のサブメニューに振り分けるのは簡単ではない…。</span> | * 配列やオブジェクトからポップアップメニューの生成をするときにサブメニューを利用する場合、あらかじめサブメニューのラベルや各要素の振り分け方が決まっていれば難しいことはないが、<span style="color:#c00;">要素が不定数の配列やオブジェクトを複数のサブメニューに振り分けるのは簡単ではない…。</span> | ||
: → 組み込み関数「[[ポップアップメニューを手軽に扱う]]」や「[[階層化マクロメニュー]]」マクロなどのソースコードを参考にして自力でコードを組むか、組み込み関数「[[ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する]]」で一定数ごとにサブメニュー項目を自動生成して要素を放り込むしかない。 | : → 組み込み関数「[[ポップアップメニューを手軽に扱う]]」や「[[階層化マクロメニュー]]」マクロなどのソースコードを参考にして自力でコードを組むか、組み込み関数「[[ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する]]」で一定数ごとにサブメニュー項目を自動生成して要素を放り込むしかない。 | ||
: ※ 自動分割サブメニューのページに「[[ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する#サンプルコード2|サンプルコード2]] (簡易版)」を追加した。 | : ※ 自動分割サブメニューのページに「[[ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する#サンプルコード2|サンプルコード2]] (簡易版)」を追加した。 | ||
: 「[[ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する|サンプルコード1]]」の組み込み関数ではサブメニューオブジェクト専用の配列 smArray を用意して <code>smArray.push( CreatePopupMenu() );</code> → <code>menu.AddPopup( label, smArray[ smId ] );</code> としているが、サンプルコード2のようにループ処理内で <code>subMenu = CreatePopupMenu();</code> を使いまわしするだけでも新規のサブメニューアイテムを生成できるようだ。 | : 「[[ポップアップメニューを「n*十件ずつ」のサブメニューに自動分割する#サンプルコード1|サンプルコード1]]」の組み込み関数ではサブメニューオブジェクト専用の配列 smArray を用意して <code>smArray.push( CreatePopupMenu() );</code> → <code>menu.AddPopup( label, smArray[ smId ] );</code> としているが、サンプルコード2のようにループ処理内で <code>subMenu = CreatePopupMenu();</code> を使いまわしするだけでも新規のサブメニューアイテムを生成できるようだ。 | ||
* [[マクロリファレンス:PopupMenu インターフェイス#AddPopup メソッド|PopupMenu.AddPopup() メソッド]] では [[マクロリファレンス:PopupMenu インターフェイス#Add メソッド|Add() メソッド]] の第三引数(''meMenuChecked, meMenuGrayed, meMenuSeparator'')は使用できない。 | * [[マクロリファレンス:PopupMenu インターフェイス#AddPopup メソッド|PopupMenu.AddPopup() メソッド]] では [[マクロリファレンス:PopupMenu インターフェイス#Add メソッド|Add() メソッド]] の第三引数(''meMenuChecked, meMenuGrayed, meMenuSeparator'')は使用できない。 | ||
: サブメニュー内のすべてのアイテムが無効(グレーアウト)になる条件でも、サブメニュー見出しを無効化することはできないので、サブメニュー見出しが表示されなくなるように(またはグレーアウトされるように) <code>PopupMenu.AddPopup()</code> 周りを [https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Control_flow_and_error_handling#if...else_statement if() 文] で囲うしかない(※ メニューの階層構造が複雑な場合に、ソースコードが見づらくなってしまうが…)。 | : サブメニュー内のすべてのアイテムが無効(グレーアウト)になる条件でも、サブメニュー見出しを無効化することはできないので、サブメニュー見出しが表示されなくなるように(またはグレーアウトされるように) <code>PopupMenu.AddPopup()</code> 周りを [https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Control_flow_and_error_handling#if...else_statement if() 文] で囲うしかない(※ メニューの階層構造が複雑な場合に、ソースコードが見づらくなってしまうが…)。 | ||
< | <syntaxhighlight lang="javascript"> | ||
// e.g. 編集モードが Text ならサブメニューを表示する | // e.g. 編集モードが Text ならサブメニューを表示する | ||
// ※ Text 以外ならグレーアウトさせた "サブメニュー" アイテムを表示 | // ※ Text 以外ならグレーアウトさせた "サブメニュー" アイテムを表示 | ||
| 792行目: | 747行目: | ||
var r = menu1.Track( mePosMouse ); | var r = menu1.Track( mePosMouse ); | ||
</ | </syntaxhighlight> | ||
: また、上出の「自動分割サブメニュー」の組み込み関数を制作するさい、チェックつきアイテムを含むサブメニュー見出しにもチェックを付けられるようにしたかったが、これも無理だった。 | : また、上出の「自動分割サブメニュー」の組み込み関数を制作するさい、チェックつきアイテムを含むサブメニュー見出しにもチェックを付けられるようにしたかったが、これも無理だった。 | ||
:: → サブメニューオブジェクトを <code>AddPopup()</code> する前に孫アイテムを <code>Add()</code> しておき、チェックつきアイテムを含むかどうかの条件文でサブメニューオブジェクトのラベルを生成(サブメニューラベルの先頭に "'''*'''\t" や "'''✔'''" などを付加)してから <code>AddPopup()</code> することはできるが、 ''meMenuChecked'' とおなじチェックマークをつけられるわけではないので、コードが煩雑になるわりにあまり報われない努力となる…。 | |||
==== マクロの動作設定を変更可能にする ==== | ==== マクロの動作設定を変更可能にする ==== | ||
拙作マクロは、ポップアップメニューを使うものにかぎらず動作設定用の項目が多い。 | 拙作マクロは、ポップアップメニューを使うものにかぎらず動作設定用の項目が多い。 | ||
ポップアップメニューマクロでないものは、通常、頻繁に動作設定を弄る必要はないが、sukemaru 好みの動作方式は一般的嗜好と合致しないであろうことから公開用のマクロにするにあたってカスタマイズ可能な「設定項目 (変数)」にして調整しなおすことが多い…。 | ポップアップメニューマクロでないものは、通常、頻繁に動作設定を弄る必要はないが、sukemaru 好みの動作方式は一般的嗜好と合致しないであろうことから公開用のマクロにするにあたってカスタマイズ可能な「設定項目 (変数)」にして調整しなおすことが多い…。 | ||
<span style="color:#0000c0;"> ポップアップメニューマクロであれば、メニュー項目から動作設定をカスタマイズできるようにコーディングすることができる。</span> | <span style="color:#0000c0;"> ポップアップメニューマクロであれば、メニュー項目から動作設定をカスタマイズできるようにコーディングすることができる。</span> | ||
* まず、[[利用者:Masme|masme]] 氏の「[[行並べ替え]]」や「[[連番を挿入]]」マクロのように、[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/do...while do ... while() 文] によるループを利用して、動作設定の既定値を何度も書き換えながらポップアップメニューを再描画する方法がある。 | * まず、[[利用者:Masme|masme]] 氏の「[[行並べ替え]]」や「[[連番を挿入]]」マクロのように、[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/do...while do ... while() 文] によるループを利用して、動作設定の既定値を何度も書き換えながらポップアップメニューを再描画する方法がある。 | ||
: <s>動作設定の変更内容はマクロの完了時に破棄されてしまうので、</s> 同じマクロを連続して利用することが多いならば、マクロメニューの [[ヘルプ:マクロ#編集|編集]] コマンドからソースコードを開いて、初期設定項目(変数)の既定値を書き換えておくとよい。 | : <s>動作設定の変更内容はマクロの完了時に破棄されてしまうので、</s> 同じマクロを連続して利用することが多いならば、マクロメニューの [[ヘルプ:マクロ#編集|編集]] コマンドからソースコードを開いて、初期設定項目(変数)の既定値を書き換えておくとよい。 | ||
* sukemaru の場合は、「[[ポップアップメニューで検索先にジャンプ#include版|検索ジャンプ]]」「[[ブックマーク一覧ジャンプ#include版|ブックマークジャンプ]]」や「[[ファイルを読み直す・開きなおす#include版|読みなおし]]」マクロなどで、【include 版】と称するものを作っている。 | * sukemaru の場合は、「[[ポップアップメニューで検索先にジャンプ#include版|検索ジャンプ]]」「[[ブックマーク一覧ジャンプ#include版|ブックマークジャンプ]]」や「[[ファイルを読み直す・開きなおす#include版|読みなおし]]」マクロなどで、【include 版】と称するものを作っている。 | ||
: これらにおいては、[[includeライブラリ | : これらにおいては、[[includeライブラリ]] の IO クラス(IO.js)の関数メソッド <code>IO.Serialize() / IO.Deserialize()</code> を利用して、ポップアップメニュー内の「設定変更」サブメニューから変更した [[#外部ファイルにマクロの設定などを書き出す|設定値を外部ファイル(JSON ファイル)に保持]] できるようにしている。 | ||
: カスタマイズしながら実行するのも、カスタマイズした動作設定を維持したままでままで再実行するのも容易にはなったが、コードが煩雑になって他のマクロに流用しづらくなってしまっている…。 | : カスタマイズしながら実行するのも、カスタマイズした動作設定を維持したままでままで再実行するのも容易にはなったが、コードが煩雑になって他のマクロに流用しづらくなってしまっている…。 | ||
: ※ 非 include 版では、「設定変更」サブメニューや masme 氏のマクロのような処理コードは入れず、動作設定の変更方法はソースコードの変数の値の書き換えのみとしている。 | : ※ 非 include 版では、「設定変更」サブメニューや masme 氏のマクロのような処理コードは入れず、動作設定の変更方法はソースコードの変数の値の書き換えのみとしている。 | ||
==== GetKeyState.exe の活用 ==== | ==== GetKeyState.exe の活用 ==== | ||
pizz 氏作成の「[[GetKeyState.exe(キー状態取得実行ファイル)]]」を使うと、マクロ実行(開始)時の修飾キーの押し下げ状態でポップアップメニューに表示する項目を変化させたり、メニュー内のアイテムを選択(クリック)するときの修飾キーの押し下げ状態で実行するコマンドを変化させることができる。 | pizz 氏作成の「[[GetKeyState.exe(キー状態取得実行ファイル)]]」を使うと、マクロ実行(開始)時の修飾キーの押し下げ状態でポップアップメニューに表示する項目を変化させたり、メニュー内のアイテムを選択(クリック)するときの修飾キーの押し下げ状態で実行するコマンドを変化させることができる。 | ||
マクロ開始時に仕込むとショートカットキーの割りあて方が制限されたり、メニュー表示までにタイムラグが生じてしまうこともあるが、アイテム選択後のコマンド実行時に仕込めばあまり問題にならない。 | |||
マクロ開始時に仕込むとショートカットキーの割りあて方が制限されたり、メニュー表示までにタイムラグが生じてしまうこともあるが、アイテム選択後のコマンド実行時に仕込めばあまり問題にならない。 | |||
※ ただし、Mery のポップアップメニューは <kbd>Alt</kbd> キーでキャンセルされてしまうので、ポップアップメニュー内のコマンド実行用に仕込めるのは <kbd>Ctrl</kbd> か <kbd>Shift</kbd> キーにかぎられる。 | ※ ただし、Mery のポップアップメニューは <kbd>Alt</kbd> キーでキャンセルされてしまうので、ポップアップメニュー内のコマンド実行用に仕込めるのは <kbd>Ctrl</kbd> か <kbd>Shift</kbd> キーにかぎられる。 | ||
: ref. [[GetKeyState.exe(キー状態取得実行ファイル)#実装例|GetKeyState.exe の実装例: サンプルコード3]] | : ref. [[GetKeyState.exe(キー状態取得実行ファイル)#実装例|GetKeyState.exe の実装例: サンプルコード3]] | ||
=== 配列 === | === 配列 === | ||
< | <syntaxhighlight lang="javascript"> | ||
var arr1 = []; | var arr1 = []; | ||
arr1[arr1.length] = "hoge"; | arr1[arr1.length] = "hoge"; | ||
| 828行目: | 782行目: | ||
arr1[arr1.length] = "piyo"; | arr1[arr1.length] = "piyo"; | ||
... ; | ... ; | ||
</ | </syntaxhighlight> | ||
個人的な所感であるが、配列の要素を羅列して定義するさいに、上のような書き方は好きではない。以下のような書き方のほうが、スッキリしていてよい。 | 個人的な所感であるが、配列の要素を羅列して定義するさいに、上のような書き方は好きではない。以下のような書き方のほうが、スッキリしていてよい。 | ||
< | <syntaxhighlight lang="javascript"> | ||
var arr2 = []; | var arr2 = []; | ||
arr2.push( "Hoge" ); | arr2.push( "Hoge" ); | ||
| 836行目: | 790行目: | ||
arr2.push( "Piyo" ); | arr2.push( "Piyo" ); | ||
... ; | ... ; | ||
</ | </syntaxhighlight> | ||
< | <syntaxhighlight lang="javascript"> | ||
var arr3 = [ | var arr3 = [ | ||
"HogeHoge", | "HogeHoge", | ||
| 845行目: | 799行目: | ||
]; | ]; | ||
// ※ カンマの位置は、前でも後ろでも | // ※ カンマの位置は、前でも後ろでも | ||
</ | </syntaxhighlight> | ||
=== 複数行の論理行を範囲選択(末尾改行を含まない) === | === 複数行の論理行を範囲選択(末尾改行を含まない) === | ||
文字列操作のマクロでしばしば必要になる処理。 | 文字列操作のマクロでしばしば必要になる処理。 | ||
※ 行番号のクリックやドラッグによる行単位の範囲選択をしたときや [[マクロリファレンス:Selection インターフェイス#SelectLine メソッド|Selection.SelectLine()]] のあとなど、選択範囲末尾の改行(次行の先頭)を除外するときに必要。 | ※ 行番号のクリックやドラッグによる行単位の範囲選択をしたときや [[マクロリファレンス:Selection インターフェイス#SelectLine メソッド|Selection.SelectLine()]] のあとなど、選択範囲末尾の改行(次行の先頭)を除外するときに必要。 | ||
※ 以下のふたつのコードは、左下(行頭位置)から右上に矩形選択した状態から実行したときの結果が異なる。 | ※ 以下のふたつのコードは、左下(行頭位置)から右上に矩形選択した状態から実行したときの結果が異なる。 | ||
< | <syntaxhighlight lang="javascript"> | ||
var s = document.selection; | var s = document.selection; | ||
// もとの選択範囲の座標を取得 | // もとの選択範囲の座標を取得 | ||
| 865行目: | 819行目: | ||
s.EndOfLine( false, mePosLogical ); | s.EndOfLine( false, mePosLogical ); | ||
s.SetAnchorPoint( mePosLogical, 1, ty ); | s.SetAnchorPoint( mePosLogical, 1, ty ); | ||
</ | </syntaxhighlight> | ||
< | <syntaxhighlight lang="javascript"> | ||
// または masme 氏作成の「コメントマーク付け外し」マクロより | // または masme 氏作成の「コメントマーク付け外し」マクロより | ||
// ※ 左下(行頭位置)から右上に矩形選択した場合も考慮したコード | // ※ 左下(行頭位置)から右上に矩形選択した場合も考慮したコード | ||
| 878行目: | 832行目: | ||
s.EndOfLine( false, mePosLogical ); | s.EndOfLine( false, mePosLogical ); | ||
s.SetAnchorPoint( mePosLogical, 1, ty ); | s.SetAnchorPoint( mePosLogical, 1, ty ); | ||
</ | </syntaxhighlight> | ||
: ref. Mery 公式フォーラム 『[https://www.haijin-boys.com/discussions/4431 マクロについてアドバイスお願いします]』 | : ref. Mery 公式フォーラム 『[https://www.haijin-boys.com/discussions/4431 マクロについてアドバイスお願いします]』 | ||
=== 選択範囲の 先頭位置/末尾位置 === | === 選択範囲の 先頭位置/末尾位置 === | ||
選択範囲の 開始(キャレットなし)/終了(キャレットあり) の位置は [[マクロリファレンス:Selection インターフェイス#GetAnchorPos メソッド|Selection.GetAnchorPos()]] と [[マクロリファレンス:Selection インターフェイス#GetActivePos メソッド|Selection.GetActivePos()]] とで取得できるが、先頭/末尾 の位置はそれらをもとにして前後関係を割りだす必要がある。 | 選択範囲の 開始(キャレットなし)/終了(キャレットあり) の位置は [[マクロリファレンス:Selection インターフェイス#GetAnchorPos メソッド|Selection.GetAnchorPos()]] と [[マクロリファレンス:Selection インターフェイス#GetActivePos メソッド|Selection.GetActivePos()]] とで取得できるが、先頭/末尾 の位置はそれらをもとにして前後関係を割りだす必要がある。 | ||
<span style="color:#c00;">※ '''GetTopPos()''' や '''GetBottomPos()''' というメソッドはない。 </span | <span style="color:#c00;">※ '''GetTopPos()''' や '''GetBottomPos()''' というメソッドはない。 </span> | ||
< | <syntaxhighlight lang="javascript"> | ||
var ancPos, actPos, topPos, endPos; | var ancPos, actPos, topPos, endPos; | ||
| 898行目: | 851行目: | ||
topPos = ( ancPos < actPos ) ? ancPos : actPos; | topPos = ( ancPos < actPos ) ? ancPos : actPos; | ||
endPos = ( ancPos < actPos ) ? actPos : ancPos; | endPos = ( ancPos < actPos ) ? actPos : ancPos; | ||
</ | </syntaxhighlight> | ||
=== 変換・挿入した文字列を範囲選択するとき === | === 変換・挿入した文字列を範囲選択するとき === | ||
< | <syntaxhighlight lang="javascript"> | ||
var str = "hoge"; | var str = "hoge"; | ||
document.Write( str ); // または document.selection.text = str; | document.Write( str ); // または document.selection.text = str; | ||
</ | </syntaxhighlight> | ||
のあとで文字列 '''hoge''' を範囲選択したい場合は、< | のあとで文字列 '''hoge''' を範囲選択したい場合は、<syntaxhighlight lang="javascript" inline>document.selection.CharLeft( str.length, true );</syntaxhighlight> ではなく | ||
< | <syntaxhighlight lang="javascript"> | ||
// キャレットは選択範囲の末尾位置 | // キャレットは選択範囲の末尾位置 | ||
document.selection.SetAnchorPos( document.selection.GetActivePos() - str.length ); | document.selection.SetAnchorPos( document.selection.GetActivePos() - str.length ); | ||
| 913行目: | 865行目: | ||
// または(キャレットは選択範囲の先頭位置) | // または(キャレットは選択範囲の先頭位置) | ||
document.selectionSetActivePos( document.selection.GetActivePos() - str.length, true ); | document.selectionSetActivePos( document.selection.GetActivePos() - str.length, true ); | ||
</ | </syntaxhighlight> | ||
と記述すること。 | と記述すること。 | ||
※ ''[[マクロリファレンス:Selection インターフェイス#CharLeft メソッド|Selection.CharLeft]]( str.length, true )'' の場合、文字列 ''str'' が「折り返し」にかかってしまったときに想定どおりの選択範囲にならない。 | ※ ''[[マクロリファレンス:Selection インターフェイス#CharLeft メソッド|Selection.CharLeft]]( str.length, true )'' の場合、文字列 ''str'' が「折り返し」にかかってしまったときに想定どおりの選択範囲にならない。 | ||
: ref. Mery 公式フォーラム 『[https://www.haijin-boys.com/discussions/3740 "折り返し表示" での CharRight( document.selection.Text.length - 1 ) について]』 | : ref. Mery 公式フォーラム 『[https://www.haijin-boys.com/discussions/3740 "折り返し表示" での CharRight( document.selection.Text.length - 1 ) について]』 | ||
=== Mery のマクロの定数 === | === Mery のマクロの定数 === | ||
| 926行目: | 875行目: | ||
Alert( <b style="color:#408040;">meFindNext</b> ); | Alert( <b style="color:#408040;">meFindNext</b> ); | ||
のような1行マクロで調べることができる。 | のような1行マクロで調べることができる。 | ||
=== Document.Selection オブジェクトの各種メソッドについて === | === Document.Selection オブジェクトの各種メソッドについて === | ||
==== ChangeCase() メソッド ==== | ==== ChangeCase() メソッド ==== | ||
[[マクロリファレンス:Selection インターフェイス#ChangeCase メソッド|Selection.ChangeCase() メソッド]] は | [[マクロリファレンス:Selection インターフェイス#ChangeCase メソッド|Selection.ChangeCase() メソッド]] は | ||
| 936行目: | 883行目: | ||
: ''ref.'' [[#文字列操作が空振りしたときは undo 履歴に残さない|文字列操作が空振りしたときは undo 履歴に残さない]] | : ''ref.'' [[#文字列操作が空振りしたときは undo 履歴に残さない|文字列操作が空振りしたときは undo 履歴に残さない]] | ||
: ''ref.'' 拙作「[[大文字/小文字/頭文字 トグル変換]]」マクロ | : ''ref.'' 拙作「[[大文字/小文字/頭文字 トグル変換]]」マクロ | ||
==== ChangeWidth() メソッド ==== | ==== ChangeWidth() メソッド ==== | ||
[[マクロリファレンス:Selection インターフェイス#ChangeWidth メソッド|Selection.ChangeWidth() メソッド]] は | [[マクロリファレンス:Selection インターフェイス#ChangeWidth メソッド|Selection.ChangeWidth() メソッド]] は | ||
| 942行目: | 889行目: | ||
: ''ref.'' [[#文字列操作が空振りしたときは undo 履歴に残さない|文字列操作が空振りしたときは undo 履歴に残さない]] | : ''ref.'' [[#文字列操作が空振りしたときは undo 履歴に残さない|文字列操作が空振りしたときは undo 履歴に残さない]] | ||
: ''ref.'' 拙作「[[全角/半角 トグル変換]]」マクロ | : ''ref.'' 拙作「[[全角/半角 トグル変換]]」マクロ | ||
==== Collapse() メソッド ==== | ==== Collapse() メソッド ==== | ||
[[マクロリファレンス:Selection インターフェイス#Collapse メソッド|Selection.Collapse() メソッド]] で引数 '''''meCollapseEnd''''' を指定した場合は | [[マクロリファレンス:Selection インターフェイス#Collapse メソッド|Selection.Collapse() メソッド]] で引数 '''''meCollapseEnd''''' を指定した場合は | ||
<code>document.selection.SetActivePos( Selection.GetActivePos() ) </code> | |||
'''''meCollapseStart''''' を指定した場合は | <code>document.selection.SetActivePos( Selection.GetActivePos() ) </code> | ||
<code>document.selection.SetActivePos( Selection.SetAnchorPos() )</code> | |||
'''''meCollapseStart''''' を指定した場合は | |||
<code>document.selection.SetActivePos( Selection.SetAnchorPos() )</code> | |||
* 引数を省略した場合は ''meCollapseStart'' として動作する。 | |||
* ''meCollapseStart / meCollapseEnd'' はそれぞれ「選択開始位置」と「選択終了位置 (キャレット位置)」を指し、「選択範囲の 先頭/末尾」ではない。 | |||
* [[マクロリファレンス:Selection インターフェイス#SelectLine メソッド|Selection.SelectLine()]] や [[マクロリファレンス:Selection インターフェイス#SelectWord メソッド|Selection.SelectWord()]] メソッドなどでの範囲選択では「キャレット位置=選択範囲の末尾」となり、[[マクロリファレンス:Selection インターフェイス#Find メソッド|Selection.Find()]] や [[マクロリファレンス:Selection インターフェイス#FindRepeat メソッド|Selection.FindRepeat()]] メソッドでの範囲選択では「キャレット位置=選択範囲の先頭」なので、つづけて Collapse() メソッドを使用するときは注意が必要 (…というほどのことでもないか?)。 | |||
==== DuplicateLine() メソッド ==== | ==== DuplicateLine() メソッド ==== | ||
[[マクロリファレンス:Selection インターフェイス#DuplicateLine メソッド|Selection.DuplicateLine() メソッド]] は | [[マクロリファレンス:Selection インターフェイス#DuplicateLine メソッド|Selection.DuplicateLine() メソッド]] は | ||
| 959行目: | 908行目: | ||
* 行を複製したあとのキャレットの位置(桁)が、メソッド実行前の ActivePointX ではなく AnchorPointX になる。 | * 行を複製したあとのキャレットの位置(桁)が、メソッド実行前の ActivePointX ではなく AnchorPointX になる。 | ||
⇒ 複数行選択状態や、行番号クリックでの行選択状態から実行した後のキャレット位置が不自然なかんじになる。 | ⇒ 複数行選択状態や、行番号クリックでの行選択状態から実行した後のキャレット位置が不自然なかんじになる。 | ||
じっさいのマクロのコーディングでは行全体の文字列を | じっさいのマクロのコーディングでは行全体の文字列を | ||
< | <syntaxhighlight lang="javascript"> | ||
// 1行選択 | // 1行選択 | ||
document.selection.StartOfLine( mePosLogical ); | document.selection.StartOfLine( mePosLogical ); | ||
document.selection.EndOfLine( mePosLogical, true ); | document.selection.EndOfLine( mePosLogical, true ); | ||
</ | </syntaxhighlight> | ||
または [[#複数行の論理行を範囲選択(末尾改行を含まない)|複数行の論理行を範囲選択(末尾改行を含まない)]] のようなコードで範囲選択状態にしてから「行を複製」することが多いので、< | または [[#複数行の論理行を範囲選択(末尾改行を含まない)|複数行の論理行を範囲選択(末尾改行を含まない)]] のようなコードで範囲選択状態にしてから「行を複製」することが多いので、<syntaxhighlight lang="javascript" inline>document.selection.Text = document.selection.Text + "\n" + document.selection.Text;</syntaxhighlight> とすれば「複製」後のキャレット位置が曖昧になることはない。 | ||
: ''ref.'' 拙作「[[行を複製 (複数行可)]]」マクロ | : ''ref.'' 拙作「[[行を複製 (複数行可)]]」マクロ | ||
==== Indent/Unindent() メソッド ==== | ==== Indent/Unindent() メソッド ==== | ||
[[マクロリファレンス:Selection インターフェイス#Indent メソッド|Selection.Indent() メソッド]] / [[マクロリファレンス:Selection インターフェイス#Unindent メソッド|Selection.Unindent() メソッド]] は | [[マクロリファレンス:Selection インターフェイス#Indent メソッド|Selection.Indent() メソッド]] / [[マクロリファレンス:Selection インターフェイス#Unindent メソッド|Selection.Unindent() メソッド]] は | ||
* 「選択範囲のテキスト」ではなく、「選択範囲をふくむ論理行全体」が操作対象。 | * 「選択範囲のテキスト」ではなく、「選択範囲をふくむ論理行全体」が操作対象。 | ||
* 選択範囲が表示行での1行全体に達していないと空振りするので、事前に行全体を範囲選択する(''e.g.'' < | * 選択範囲が表示行での1行全体に達していないと空振りするので、事前に行全体を範囲選択する(''e.g.'' <syntaxhighlight lang="javascript" inline>document.selection.SelectLine(); // または SelectLine( true );</syntaxhighlight> )や [[#複数行の論理行を範囲選択(末尾改行を含まない)|複数行の論理行を範囲選択(末尾改行を含まない)]] のようなコードが必要。 | ||
* 実行可能条件を満たしてから実行すると、「もとの選択範囲をふくむ論理行全体 (<span style="color:#0000c0;">末尾改行を'''ふくむ'''</span>)」が範囲選択された状態で残る。 | * 実行可能条件を満たしてから実行すると、「もとの選択範囲をふくむ論理行全体 (<span style="color:#0000c0;">末尾改行を'''ふくむ'''</span>)」が範囲選択された状態で残る。 | ||
* 引数に 1 以上の数値を渡して実行すると、「元に戻す」さいには <code>document.selection.Indent(n)</code> や <code>document.selection.Unindent(n)</code> での引数の値とおなじ回数の [[マクロリファレンス:Document インターフェイス#Undo メソッド|<code>document.Undo()</code>]] や Ctrl+Z の操作が必要。 | * 引数に 1 以上の数値を渡して実行すると、「元に戻す」さいには <code>document.selection.Indent(n)</code> や <code>document.selection.Unindent(n)</code> での引数の値とおなじ回数の [[マクロリファレンス:Document インターフェイス#Undo メソッド|<code>document.Undo()</code>]] や Ctrl+Z の操作が必要。 | ||
: ''ref.'' 「[[非選択状態でも逆インデント]]」「[[字下げ・字上げ]]」など、標準のインデント/逆インデント機能の代替マクロがマクロライブラリにある。 | : ''ref.'' 「[[非選択状態でも逆インデント]]」「[[字下げ・字上げ]]」など、標準のインデント/逆インデント機能の代替マクロがマクロライブラリにある。 | ||
==== NewLine() メソッド ==== | ==== NewLine() メソッド ==== | ||
[[マクロリファレンス:Selection インターフェイス#NewLine メソッド|Selection.NewLine() メソッド]] は | [[マクロリファレンス:Selection インターフェイス#NewLine メソッド|Selection.NewLine() メソッド]] は | ||
* 引数に 1 以上の数値を渡して実行したばあい、「元に戻す」さいには <code>document.selection.NewLine(n)</code> での引数の数値とおなじ回数の [[マクロリファレンス:Document インターフェイス#Undo メソッド|<code>document.Undo()</code>]] や Ctrl+Z の操作が必要。 | * 引数に 1 以上の数値を渡して実行したばあい、「元に戻す」さいには <code>document.selection.NewLine(n)</code> での引数の数値とおなじ回数の [[マクロリファレンス:Document インターフェイス#Undo メソッド|<code>document.Undo()</code>]] や Ctrl+Z の操作が必要。 | ||
==== Tabify/Untabify() メソッド ==== | ==== Tabify/Untabify() メソッド ==== | ||
[[マクロリファレンス:Selection インターフェイス#Tabify メソッド|Selection.Tabify() メソッド]] / [[マクロリファレンス:Selection インターフェイス#Untabify メソッド|Selection.Untabify() メソッド]] は | [[マクロリファレンス:Selection インターフェイス#Tabify メソッド|Selection.Tabify() メソッド]] / [[マクロリファレンス:Selection インターフェイス#Untabify メソッド|Selection.Untabify() メソッド]] は | ||
| 989行目: | 938行目: | ||
: ''ref.'' [[#文字列操作が空振りしたときは undo 履歴に残さない|文字列操作が空振りしたときは undo 履歴に残さない]] | : ''ref.'' [[#文字列操作が空振りしたときは undo 履歴に残さない|文字列操作が空振りしたときは undo 履歴に残さない]] | ||
: ''ref.'' 拙作「[[TAB/半角空白 トグル変換]]」マクロ | : ''ref.'' 拙作「[[TAB/半角空白 トグル変換]]」マクロ | ||
==== SelectLine() メソッド ==== | ==== SelectLine() メソッド ==== | ||
[[マクロリファレンス:Selection インターフェイス#SelectLine メソッド|Selection.SelectLine() メソッド]] は | [[マクロリファレンス:Selection インターフェイス#SelectLine メソッド|Selection.SelectLine() メソッド]] は | ||
* 「論理行」全体の選択のみで、「表示行」の選択には非対応。 | * 「論理行」全体の選択のみで、「表示行」の選択には非対応。 | ||
: ※ エディタ内でのトリプルクリック操作に相当し、行末改行も選択範囲にふくまれる。 | : ※ エディタ内でのトリプルクリック操作に相当し、行末改行も選択範囲にふくまれる。 | ||
* 引数に < | * 引数に <syntaxhighlight lang="javascript" inline>true</syntaxhighlight> を渡すと複数行選択が可能。 | ||
* トリプルクリックや行番号のクリック(またはドラッグ)で論理行全体が範囲選択された状態から実行すると、もとの選択範囲末尾改行のつぎの行まで範囲選択されてしまう。 | * トリプルクリックや行番号のクリック(またはドラッグ)で論理行全体が範囲選択された状態から実行すると、もとの選択範囲末尾改行のつぎの行まで範囲選択されてしまう。 | ||
: ''c.f.'' [[#複数行の論理行を範囲選択(末尾改行を含まない)|複数行の論理行を範囲選択(末尾改行を含まない)]] | : ''c.f.'' [[#複数行の論理行を範囲選択(末尾改行を含まない)|複数行の論理行を範囲選択(末尾改行を含まない)]] | ||
=== 検索/置換 === | === 検索/置換 === | ||
===== Find() メソッド ===== | ===== Find() メソッド ===== | ||
* 定数 | * 定数 | ||
| 1,014行目: | 959行目: | ||
 8: meFindAround 文書の末尾まで検索したら先頭から検索を開始します |  8: meFindAround 文書の末尾まで検索したら先頭から検索を開始します | ||
16: meFindReplaceRegExp 正規表現で検索します | 16: meFindReplaceRegExp 正規表現で検索します | ||
※ document.selection.'''[[マクロリファレンス:Selection インターフェイス#Replace メソッド|Replace()]]''' メソッド専用の定数 | ※ document.selection.'''[[マクロリファレンス:Selection インターフェイス#Replace メソッド|Replace()]]''' メソッド専用の定数 | ||
<span style="color:#808080;">32: meReplaceSelOnly 選択した範囲のみ置換します</span> | <span style="color:#808080;">32: meReplaceSelOnly 選択した範囲のみ置換します</span> | ||
<span style="color:#808080;">64: meReplaceAll すべて置換します</span> | <span style="color:#808080;">64: meReplaceAll すべて置換します</span> | ||
| 1,032行目: | 977行目: | ||
<span style="color:#808080;"> 8192: meFindNotEOL 選択範囲の終端を行頭とみなさず置換します</span> | <span style="color:#808080;"> 8192: meFindNotEOL 選択範囲の終端を行頭とみなさず置換します</span> | ||
16384: meFindKeepOptions 検索ダイアログの文字列、オプション項目を維持します | 16384: meFindKeepOptions 検索ダイアログの文字列、オプション項目を維持します | ||
* <span style="color:#c00;">「検索/置換」ダイアログのオプションフラグをすべて OFF にする方法</span> として | * <span style="color:#c00;">「検索/置換」ダイアログのオプションフラグをすべて OFF にする方法</span> として | ||
: < | : <syntaxhighlight lang="javascript" inline>document.selection.Find( "", 0 ); // 空文字列の検索でオプションフラグを解除する</syntaxhighlight> | ||
: というコードを挟み込む手法がある(第二引数には 0 または 1 を指定する)。 | : というコードを挟み込む手法がある(第二引数には 0 または 1 を指定する)。 | ||
:: ref. Mery 公式フォーラム 『[https://www.haijin-boys.com/discussions/3398 空検索の動作、など]』 | :: ref. Mery 公式フォーラム 『[https://www.haijin-boys.com/discussions/3398 空検索の動作、など]』 | ||
| 1,041行目: | 986行目: | ||
: ※ ただし、「終了したら閉じる」と、[https://www.haijin-boys.com/software/mery/mery-2-6-10#1 ベータ版 2.6.10] で追加された「インクリメンタルサーチ」のオプションフラグはマクロから解除することができない。 | : ※ ただし、「終了したら閉じる」と、[https://www.haijin-boys.com/software/mery/mery-2-6-10#1 ベータ版 2.6.10] で追加された「インクリメンタルサーチ」のオプションフラグはマクロから解除することができない。 | ||
* ''meFindReplaceOnlyWord'' と ''meFindReplaceRegExp'' は排他関係なので、<span style="color:#c00;">同時に使用した場合 ''meFindReplaceRegExp'' は適用されるが ''meFindReplaceOnlyWord'' は無視される</span> | * ''meFindReplaceOnlyWord'' と ''meFindReplaceRegExp'' は排他関係なので、<span style="color:#c00;">同時に使用した場合 ''meFindReplaceRegExp'' は適用されるが ''meFindReplaceOnlyWord'' は無視される</span> | ||
: (検索ダイアログで「正規表現」オプションを有効化したときに「単語のみ」オプションが無効になるのと同様)。 | : (検索ダイアログで「正規表現」オプションを有効化したときに「単語のみ」オプションが無効になるのと同様)。 | ||
* [https://www.haijin-boys.com/software/mery/mery-2-8-3#13 ベータ版 2.8.3] で追加された ''meFindMigemo'' と従来からの ''meFindReplaceRegExp'' も排他関係で、''meFindMigemo'' が優先される。 | * [https://www.haijin-boys.com/software/mery/mery-2-8-3#13 ベータ版 2.8.3] で追加された ''meFindMigemo'' と従来からの ''meFindReplaceRegExp'' も排他関係で、''meFindMigemo'' が優先される。 | ||
* [https://www.haijin-boys.com/software/mery/mery-3-0-0#13 Mery ver 3.0.1] での定数 ''meFindKeepOptions'' の追加にともない、マクロで <code>Find()</code> メソッドを使用したあとに「検索/置換」ダイアログ内の「Migemo を使用する」オプションの状態もリセットされるようになった (''meFindMigemo'' の有無で Migemo の ON/OFF が切り替わる)ようなので、<syntaxhighlight lang="javascript" inline>document.selection.Find( "", 0 );</syntaxhighlight> を使用すると「Migemo を使用する」オプションは OFF (無効) になる。 | |||
* [https://www.haijin-boys.com/software/mery/mery-3-0-0#13 Mery ver 3.0.1] での定数 ''meFindKeepOptions'' の追加にともない、マクロで <code>Find()</code> メソッドを使用したあとに「検索/置換」ダイアログ内の「Migemo を使用する」オプションの状態もリセットされるようになった (''meFindMigemo'' の有無で Migemo の ON/OFF が切り替わる)ようなので、< | |||
: ※「検索/置換」ダイアログの検索文字列欄に <q>HOGE</q> が入力されたまま閉じて、マクロで < | : ※「検索/置換」ダイアログの検索文字列欄に <q>HOGE</q> が入力されたまま閉じて、マクロで <syntaxhighlight lang="javascript" inline>document.selection..Find( "FUGA", meFindKeepOptions );</syntaxhighlight> を実行すると、検索ハイライトされた文字列と「検索/置換」ダイアログ内の検索文字列に齟齬が生じることになる | ||
:: ( ⇒ 「次/前を検索(F3/Shift+F3)」コマンドでは <q>HOGE</q> が再検索される)。 | |||
: たとえば「[[検索(SJIS以外)]]」マクロのような長大な正規表現を使用するマクロで ''meFindKeepOptions'' を適用すると、マクロ実行後に [Shift+F3] キーによる上方向への再検索はできなくなるので、長大な検索文字列を検索履歴に残したくない特殊な検索(置換)マクロの場合での扱いはむずかしい (検索マクロに「[[GetKeyState.exe(キー状態取得実行ファイル)]]」を導入して、''meFindNext''/''meFindPrevious'' を切り替える、または ''meFindKeepOptions'' の有無を切り替えるなどの対応をするか、検索方向(次/前)の差分で検索マクロを2件登録するか…)。 | : たとえば「[[検索(SJIS以外)]]」マクロのような長大な正規表現を使用するマクロで ''meFindKeepOptions'' を適用すると、マクロ実行後に [Shift+F3] キーによる上方向への再検索はできなくなるので、長大な検索文字列を検索履歴に残したくない特殊な検索(置換)マクロの場合での扱いはむずかしい (検索マクロに「[[GetKeyState.exe(キー状態取得実行ファイル)]]」を導入して、''meFindNext''/''meFindPrevious'' を切り替える、または ''meFindKeepOptions'' の有無を切り替えるなどの対応をするか、検索方向(次/前)の差分で検索マクロを2件登録するか…)。 | ||
===== FindRepeat() メソッド ===== | ===== FindRepeat() メソッド ===== | ||
| 1,057行目: | 1,001行目: | ||
前回検索した文字列を検索します。 | 前回検索した文字列を検索します。 | ||
 0: |  0: meFindRepeatPrevious カーソル位置から前を検索します。 | ||
 1: |  1: meFindRepeatNext カーソル位置から次を検索します。 | ||
 2: meFindRepeatWord 選択範囲が空の場合はカーソル位置の単語を検索します。 |  2: meFindRepeatWord 選択範囲が空の場合はカーソル位置の単語を検索します。 | ||
: <code>FindRepeat()</code> メソッドでは定数 ''meFindReplaceCase'' や ''meFindReplaceOnlyWord , meFindAround , meFindReplaceRegExp'' が使用できず、 <span style="color:#0000c0;">'''直前''' の「検索/置換」コマンドや <code>Find()</code> / <code>Replace()</code> メソッドで使用したこれらのオプションのうち ''meFindReplaceRegExp'' 以外の三つの ON/OFF 状態が '''継承''' される。</span> | : <code>FindRepeat()</code> メソッドでは定数 ''meFindReplaceCase'' や ''meFindReplaceOnlyWord , meFindAround , meFindReplaceRegExp'' が使用できず、 <span style="color:#0000c0;">'''直前''' の「検索/置換」コマンドや <code>Find()</code> / <code>Replace()</code> メソッドで使用したこれらのオプションのうち ''meFindReplaceRegExp'' 以外の三つの ON/OFF 状態が '''継承''' される。</span> | ||
* <code>FindRepeat()</code> メソッドで ''meFindReplaceCase'' や ''meFindReplaceOnlyWord , meFindAround'' を適用した検索をしたいばあいは、以下のように記述する。 | * <code>FindRepeat()</code> メソッドで ''meFindReplaceCase'' や ''meFindReplaceOnlyWord , meFindAround'' を適用した検索をしたいばあいは、以下のように記述する。 | ||
: ※ ''meFindReplaceRegExp'' があっても <code>FindRepeat()</code> の実行時には無視される。 | : ※ ''meFindReplaceRegExp'' があっても <code>FindRepeat()</code> の実行時には無視される。 | ||
< | <syntaxhighlight lang="javascript"> | ||
// FindRepeat() で使用したいフラグ | // FindRepeat() で使用したいフラグ | ||
var flags = meFindReplaceCase + meFindAround; | var flags = meFindReplaceCase + meFindAround; | ||
| 1,073行目: | 1,017行目: | ||
// ➁「前回検索した文字列を検索」または キャレット位置の単語で「次の文字列を検索」 | // ➁「前回検索した文字列を検索」または キャレット位置の単語で「次の文字列を検索」 | ||
document.selection.FindRepeat( | document.selection.FindRepeat( meFindRepeatNext + meFindRepeatWord ); | ||
// -------------------------------------------------- // | // -------------------------------------------------- // | ||
| 1,079行目: | 1,023行目: | ||
// ➂ 最後にオプションフラグを解除しておきたいなら | // ➂ 最後にオプションフラグを解除しておきたいなら | ||
document.selection.Find( "", 0 ); | document.selection.Find( "", 0 ); | ||
</ | </syntaxhighlight> | ||
: ※ ➂ の行のコードを最後に使用した場合、「検索/置換」ダイアログのオプションフラグも解除される。 | : ※ ➂ の行のコードを最後に使用した場合、「検索/置換」ダイアログのオプションフラグも解除される。 | ||
: [https://www.haijin-boys.com/software/mery/mery-3-0-0#13 Mery ver 3.0.1] で <code>Find()</code> メソッドなどで利用できる定数が追加されたが、<code>FindRepeat()</code> メソッドの仕様は変わっていないので検索フラグを適用する方法はうえのサンプルコードのようにしなければならないことに変わりはない。 | : [https://www.haijin-boys.com/software/mery/mery-3-0-0#13 Mery ver 3.0.1] で <code>Find()</code> メソッドなどで利用できる定数が追加されたが、<code>FindRepeat()</code> メソッドの仕様は変わっていないので検索フラグを適用する方法はうえのサンプルコードのようにしなければならないことに変わりはない。 | ||
: ※ <span style="color:#c00;">サンプルコードの「➀」で ''meFindKeepOptions'' 定数を追加すると「➁」の <code>FindRepeat()</code> メソッドに「➀」で設定したフラグが適用されなくなり、「検索/置換」ダイアログ内のオプションフラグのチェック状態が適用されてしまうので '''要注意'''。</span> | : ※ <span style="color:#c00;">サンプルコードの「➀」で ''meFindKeepOptions'' 定数を追加すると「➁」の <code>FindRepeat()</code> メソッドに「➀」で設定したフラグが適用されなくなり、「検索/置換」ダイアログ内のオプションフラグのチェック状態が適用されてしまうので '''要注意'''。</span> | ||
: マクロ独自のフラグ設定状態で <code>FindRepeat()</code> メソッド(次/前の文字列を検索)使用したいばあいには、「検索/置換」ダイアログ内のオプションフラグをクリア/リセットしなければならないままである。 | : マクロ独自のフラグ設定状態で <code>FindRepeat()</code> メソッド(次/前の文字列を検索)使用したいばあいには、「検索/置換」ダイアログ内のオプションフラグをクリア/リセットしなければならないままである。 | ||
==== Mery ver 3.0.1 以降でオプションフラグを維持したまま「置換」を行うサンプルコード ==== | ==== Mery ver 3.0.1 以降でオプションフラグを維持したまま「置換」を行うサンプルコード ==== | ||
実行前になんらかの文字列を検索していて "検索マーカーが表示されている場合" を考慮すると、なかなか面倒な部分が多い…。 | 実行前になんらかの文字列を検索していて "検索マーカーが表示されている場合" を考慮すると、なかなか面倒な部分が多い…。 | ||
< | <syntaxhighlight lang="javascript"> | ||
/** | /** | ||
* 「スペース×2削除」マクロの Mery v3 対応テスト | * 「スペース×2削除」マクロの Mery v3 対応テスト | ||
| 1,142行目: | 1,085行目: | ||
} | } | ||
} | } | ||
</ | </syntaxhighlight> | ||
* ちなみに、sukemaru は検索ダイアログの履歴に残るマクロや、検索ハイライトが残るマクロが好きではないので、なるべく <code>Selection.Find()</code> や <code>Selection.Replace()</code> を使わずに JavaScript ネイティブの [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf String.indexOf( searchValue, fromIndex )] / [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/search String.search( regexp ) メソッド] や [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace String.replace( regexp ) メソッド] で検索/置換を行なったり、あるいは [[マクロリファレンス:Document インターフェイス#HighlightFind プロパティ|Document.HighlightFind = false]] で最終的に検索マーカーを消すなどする自作マクロが多い ([https://www.haijin-boys.com/software/mery/mery-2-6-0#3 自動マーカー] でハイライトさせる設定にしているから「検索ハイライト」はいらなくて…)。 | * ちなみに、sukemaru は検索ダイアログの履歴に残るマクロや、検索ハイライトが残るマクロが好きではないので、なるべく <code>Selection.Find()</code> や <code>Selection.Replace()</code> を使わずに JavaScript ネイティブの [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf String.indexOf( searchValue, fromIndex )] / [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/search String.search( regexp ) メソッド] や [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace String.replace( regexp ) メソッド] で検索/置換を行なったり、あるいは [[マクロリファレンス:Document インターフェイス#HighlightFind プロパティ|Document.HighlightFind = false]] で最終的に検索マーカーを消すなどする自作マクロが多い ([https://www.haijin-boys.com/software/mery/mery-2-6-0#3 自動マーカー] でハイライトさせる設定にしているから「検索ハイライト」はいらなくて…)。 | ||
: [ [https://www.haijin-boys.com/software/mery/mery-tips#2 Ctrl+Shift+↑ / ↓] ] の機能も「[[次/前の文字列を検索・改]]」マクロに置きかえてしまったので、検索ダイアログを開くのは正規表現で検索するときぐらいかも。 | : [ [https://www.haijin-boys.com/software/mery/mery-tips#2 Ctrl+Shift+↑ / ↓] ] の機能も「[[次/前の文字列を検索・改]]」マクロに置きかえてしまったので、検索ダイアログを開くのは正規表現で検索するときぐらいかも。 | ||
=== 文字列操作が空振りしたときは undo 履歴に残さない === | === 文字列操作が空振りしたときは undo 履歴に残さない === | ||
* 条件付きで文字列操作(挿入・置換など)するマクロが空振りしたとき | * 条件付きで文字列操作(挿入・置換など)するマクロが空振りしたとき | ||
< | <syntaxhighlight lang="javascript"> | ||
// e.g. 選択範囲に「hoge」が含まれていれば「fuga」に置換する | // e.g. 選択範囲に「hoge」が含まれていれば「fuga」に置換する | ||
var fuga = document.selection.Text.replace( /hoge/g, "fuga" ); | var fuga = document.selection.Text.replace( /hoge/g, "fuga" ); | ||
document.selection.Text = fuga; | document.selection.Text = fuga; | ||
</ | </syntaxhighlight> | ||
: 上のようなコードの場合は '''undo''' 履歴に無駄に残ったり、文書に「'''未保存 *'''」のフラグが付加されたりする。 | : 上のようなコードの場合は '''undo''' 履歴に無駄に残ったり、文書に「'''未保存 *'''」のフラグが付加されたりする。 | ||
: 以下のように「文字列操作の前後で "変化なし" なら undo 履歴には残さない」記述にすると、[https://www.haijin-boys.com/software/mery/mery-2-6-9#4 変更行の強調表示] なども無用に付かなくなる。 | : 以下のように「文字列操作の前後で "変化なし" なら undo 履歴には残さない」記述にすると、[https://www.haijin-boys.com/software/mery/mery-2-6-9#4 変更行の強調表示] なども無用に付かなくなる。 | ||
< | <syntaxhighlight lang="javascript"> | ||
// e.g. 選択範囲に「hoge」が含まれなければ置換しない | // e.g. 選択範囲に「hoge」が含まれなければ置換しない | ||
var st = document.selection.Text; | var st = document.selection.Text; | ||
| 1,168行目: | 1,108行目: | ||
document.selection.Text = piyo; | document.selection.Text = piyo; | ||
} | } | ||
</ | </syntaxhighlight> | ||
* 大文字/小文字変換の [[マクロリファレンス:Selection インターフェイス#ChangeCase メソッド|Selection.ChangeCase() メソッド]] や、全角/半角変換の [[マクロリファレンス:Selection インターフェイス#ChangeWidth メソッド|Selection.ChangeWidth() メソッド]] なども、日本語文などで空振りしたときに undo 履歴に残るが、上のサンプルコードのようなかたち <syntaxhighlight lang="javascript" inline>var temp = document.selection.ChangeCase( meCaseLowerCase );</syntaxhighlight> で変数に格納することはできない。 | |||
* 大文字/小文字変換の [[マクロリファレンス:Selection インターフェイス#ChangeCase メソッド|Selection.ChangeCase() メソッド]] や、全角/半角変換の [[マクロリファレンス:Selection インターフェイス#ChangeWidth メソッド|Selection.ChangeWidth() メソッド]] なども、日本語文などで空振りしたときに undo 履歴に残るが、上のサンプルコードのようなかたち <syntaxhighlight lang="javascript" inline>var temp = document.selection.ChangeCase( meCaseLowerCase );</syntaxhighlight> で変数に格納することはできない。 | |||
: [[マクロリファレンス:Selection インターフェイス|Document.Selection クラス]] の文字列操作メソッドの場合は、以下のように記述することで「<span style="color:#0000c0;">変換なしなら undo 履歴を巻き戻し</span>」できる。 | : [[マクロリファレンス:Selection インターフェイス|Document.Selection クラス]] の文字列操作メソッドの場合は、以下のように記述することで「<span style="color:#0000c0;">変換なしなら undo 履歴を巻き戻し</span>」できる。 | ||
< | <syntaxhighlight lang="javascript"> | ||
// 変換前の文字列 と 保存済み/未保存 の状態を取得 | // 変換前の文字列 と 保存済み/未保存 の状態を取得 | ||
var st = document.selection.Text; | var st = document.selection.Text; | ||
| 1,190行目: | 1,129行目: | ||
} | } | ||
} | } | ||
</ | </syntaxhighlight> | ||
: ※ ただし、厳密にいえば undo 履歴には残っているので、'''redo''' (やり直し: Ctrl+Y) することができる。 | : ※ ただし、厳密にいえば undo 履歴には残っているので、'''redo''' (やり直し: Ctrl+Y) することができる。 | ||
=== スクロール位置の調整 === | === スクロール位置の調整 === | ||
| 1,200行目: | 1,136行目: | ||
* 同様に、<code>ActiveDocument</code> 以外の <code>Document</code> にたいして <code>Selection.StartOFDocument()</code> 等のキャレット移動をともなうメソッドを実行しても、スクロール位置は移動しない。 | * 同様に、<code>ActiveDocument</code> 以外の <code>Document</code> にたいして <code>Selection.StartOFDocument()</code> 等のキャレット移動をともなうメソッドを実行しても、スクロール位置は移動しない。 | ||
: ※ いずれも、操作対象のウインドウ/タブを明示的にアクティブ化(<code>Editors.Item(m).Documents.Item(n).Activate();</code>)してからなら意図的なスクロール操作ができるが、もとのタブをアクティブ状態に戻すならコードの最後に <code>Document.Activate();</code> による復帰操作が必要(ほかのエディタウインドウのドキュメントの操作のばあいは、自他のエディタウインドウの <code>Editors.Item(m)</code> のインデックスの取得が必要)。 | : ※ いずれも、操作対象のウインドウ/タブを明示的にアクティブ化(<code>Editors.Item(m).Documents.Item(n).Activate();</code>)してからなら意図的なスクロール操作ができるが、もとのタブをアクティブ状態に戻すならコードの最後に <code>Document.Activate();</code> による復帰操作が必要(ほかのエディタウインドウのドキュメントの操作のばあいは、自他のエディタウインドウの <code>Editors.Item(m)</code> のインデックスの取得が必要)。 | ||
* キャレットをジャンプさせた後のスクロール位置とキャレット位置は、移動先の行(表示座標での行番号)がエディタの表示領域の高さに収まるかどうかとジャンプ方向によるので安定的ではない(スクロールマージンの考慮も必要)。 | * キャレットをジャンプさせた後のスクロール位置とキャレット位置は、移動先の行(表示座標での行番号)がエディタの表示領域の高さに収まるかどうかとジャンプ方向によるので安定的ではない(スクロールマージンの考慮も必要)。 | ||
: 以下は、ジャンプしてスクロールが発生した場合に、キャレットが表示領域の先頭位置になるようにスクロール状態(<code>window.ScrollY</code>)を調整するコード。 | : 以下は、ジャンプしてスクロールが発生した場合に、キャレットが表示領域の先頭位置になるようにスクロール状態(<code>window.ScrollY</code>)を調整するコード。 | ||
< | <syntaxhighlight lang="javascript"> | ||
var s = Document.Selection; | var s = Document.Selection; | ||
var ax = s.GetActivePointX( mePosLogical ); // キャレット位置の X | var ax = s.GetActivePointX( mePosLogical ); // キャレット位置の X | ||
| 1,222行目: | 1,158行目: | ||
// ※ ScrollY プロパティに値を代入するときは物理座標(表示行)の行番号で | // ※ ScrollY プロパティに値を代入するときは物理座標(表示行)の行番号で | ||
</ | </syntaxhighlight> | ||
※ スクロールマージンは [https://www.haijin-boys.com/software/mery/mery-2-7-0#2 ベータ版 2.7.0] より「オプション」ダイアログの「スクロール」のページ内で変更できるようになっている。[https://www.haijin-boys.com/weblog/assets/uploads/2019/04/mery-2-7-0-4.png?20190417] | ※ スクロールマージンは [https://www.haijin-boys.com/software/mery/mery-2-7-0#2 ベータ版 2.7.0] より「オプション」ダイアログの「スクロール」のページ内で変更できるようになっている。[https://www.haijin-boys.com/weblog/assets/uploads/2019/04/mery-2-7-0-4.png?20190417] | ||
=== OutputBar オブジェクト === | === OutputBar オブジェクト === | ||
[[マクロリファレンス:OutputBar インターフェイス|OutputBar オブジェクト]] も [[マクロリファレンス:Window インターフェイス#プロパティ|<code>Window</code> オブジェクト直下のプロパティ]] に属するため、アウトプットバー操作の各メソッドやプロパティは、複数ウインドウ状態のときに非アクティブウインドウのアウトプットバーを操作することができない。 | [[マクロリファレンス:OutputBar インターフェイス|OutputBar オブジェクト]] も [[マクロリファレンス:Window インターフェイス#プロパティ|<code>Window</code> オブジェクト直下のプロパティ]] に属するため、アウトプットバー操作の各メソッドやプロパティは、複数ウインドウ状態のときに非アクティブウインドウのアウトプットバーを操作することができない。 | ||
※ <code>Editors.Item(m).Documents.Item(0).Activate();</code> してからなら、OutputBar 操作可。 | ※ <code>Editors.Item(m).Documents.Item(0).Activate();</code> してからなら、OutputBar 操作可。 | ||
=== Window オブジェクト === | === Window オブジェクト === | ||
通常はソースコード内で [[マクロリファレンス:Window インターフェイス|Window オブジェクト]] を明示的に記述する必要はないが、[[#動作要件としてのバージョンチェック|バージョンチェック]] の節の「例4」のように <span style="color:#c00;"> 実際に記述する場合には <code>Window</code> ではなく < | 通常はソースコード内で [[マクロリファレンス:Window インターフェイス|Window オブジェクト]] を明示的に記述する必要はないが、[[#動作要件としてのバージョンチェック|バージョンチェック]] の節の「例4」のように <span style="color:#c00;"> 実際に記述する場合には <code>Window</code> ではなく <syntaxhighlight lang="javascript" inline>window</syntaxhighlight> でないと宣言されていない変数・オブジェクトあつかいのエラーになる。</span> | ||
※ <code>Document</code> や <code>Selection</code>、<code>Alert</code> など他の主要なプロパティは「大文字/小文字/頭文字のみ大文字」の区別なしに同一のプロパティとしてあつかわれる。 | ※ <code>Document</code> や <code>Selection</code>、<code>Alert</code> など他の主要なプロパティは「大文字/小文字/頭文字のみ大文字」の区別なしに同一のプロパティとしてあつかわれる。 | ||
=== カレントディレクトリ === | === カレントディレクトリ === | ||
カレントディレクトリ(作業フォルダ)は、Mery を起動したときに決定され、一定ではない。 | カレントディレクトリ(作業フォルダ)は、Mery を起動したときに決定され、一定ではない。 | ||
記述の都合上で相対パスを利用するために特定のカレントディレクトリを指定するマクロもあるが、「あえて流動的なカレントディレクトリを利用する」ようなコードが続く場合は、カレントディレクトリを書きもどす必要がある。 | 記述の都合上で相対パスを利用するために特定のカレントディレクトリを指定するマクロもあるが、「あえて流動的なカレントディレクトリを利用する」ようなコードが続く場合は、カレントディレクトリを書きもどす必要がある。 | ||
:※ マクロでカレントディレクトリを変更すると、実行中の Mery のプロセスの作業フォルダも変更されるため、あとから他のマクロを実行するさいのカレントディレクトリにも影響する。 | :※ マクロでカレントディレクトリを変更すると、実行中の Mery のプロセスの作業フォルダも変更されるため、あとから他のマクロを実行するさいのカレントディレクトリにも影響する。 | ||
< | <syntaxhighlight lang="javascript"> | ||
// マクロ実行前の作業フォルダを保存する | // マクロ実行前の作業フォルダを保存する | ||
var wshShell = new ActiveXObject( "WScript.Shell" ); | var wshShell = new ActiveXObject( "WScript.Shell" ); | ||
| 1,257行目: | 1,191行目: | ||
// 最終的にマクロ実行前の作業フォルダを復帰する | // 最終的にマクロ実行前の作業フォルダを復帰する | ||
wshShell.CurrentDirectory = currentDir; | wshShell.CurrentDirectory = currentDir; | ||
</ | </syntaxhighlight> | ||
* システムの関連付けを利用してテキストファイルなどのダブルクリックから Mery を起動した場合、そのファイルの親フォルダが Mery のプロセスの作業フォルダとなり、Windows OS の仕様により Mery のプロセスを終了するまでそのフォルダはロックされた状態になる(フォルダの移動や削除ができなくなる)が、マクロでカレントディレクトリを変更するとフォルダのロックを解除できる。 | * システムの関連付けを利用してテキストファイルなどのダブルクリックから Mery を起動した場合、そのファイルの親フォルダが Mery のプロセスの作業フォルダとなり、Windows OS の仕様により Mery のプロセスを終了するまでそのフォルダはロックされた状態になる(フォルダの移動や削除ができなくなる)が、マクロでカレントディレクトリを変更するとフォルダのロックを解除できる。 | ||
=== 動作要件としてのバージョンチェック === | === 動作要件としてのバージョンチェック === | ||
公開するマクロに Mery ベータ版で追加されたマクロ用プロパティ・定数を利用する場合は、マクロの動作要件として Mery 本体のバージョンをチェックするコードを入れておくのが無難である。 | 公開するマクロに Mery ベータ版で追加されたマクロ用プロパティ・定数を利用する場合は、マクロの動作要件として Mery 本体のバージョンをチェックするコードを入れておくのが無難である。 | ||
* 拙作の '''組み込み関数''' [[Mery本体のバージョンチェック|VersionCheck()]] を利用すれば、Mery のバージョン番号を指定して動作要件のチェックができるが、あらかじめプロパティや定数が導入された Mery のバージョン番号を調べておく必要がある( ← Mery.txt か CHNGELOG.txt に記載されているはず)。 | * 拙作の '''組み込み関数''' [[Mery本体のバージョンチェック|VersionCheck()]] を利用すれば、Mery のバージョン番号を指定して動作要件のチェックができるが、あらかじめプロパティや定数が導入された Mery のバージョン番号を調べておく必要がある( ← Mery.txt か CHNGELOG.txt に記載されているはず)。 | ||
* JavaScript には特定のプロパティがオブジェクト配下に定義されているかを調べる方法も色々とあるが、親オブジェクトのタイプやプロパティ・定数のタイプ、JavaScript(JScript)のバージョンによる互換性などへの考慮が必要になる。 [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/typeof][https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/in][https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty] | * JavaScript には特定のプロパティがオブジェクト配下に定義されているかを調べる方法も色々とあるが、親オブジェクトのタイプやプロパティ・定数のタイプ、JavaScript(JScript)のバージョンによる互換性などへの考慮が必要になる。 [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/typeof][https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/in][https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty] | ||
: ベータバージョンで追加された定数やプロパティが有効かどうかを調べる程度であれば、シンプルな記述で済む。 | : ベータバージョンで追加された定数やプロパティが有効かどうかを調べる程度であれば、シンプルな記述で済む。 | ||
< | <syntaxhighlight lang="javascript"> | ||
// ▼ ChangeCase() メソッドで定数 meCaseCapitalize を使えるのは ver 2.6.10 以降 | // ▼ ChangeCase() メソッドで定数 meCaseCapitalize を使えるのは ver 2.6.10 以降 | ||
| 1,302行目: | 1,233行目: | ||
Status = "小文字…。"; | Status = "小文字…。"; | ||
} | } | ||
</ | </syntaxhighlight> | ||
< | <syntaxhighlight lang="javascript"> | ||
// ▼ BeginUndoGroup() メソッドを使えるのは ver 2.7.0 以降 | // ▼ BeginUndoGroup() メソッドを使えるのは ver 2.7.0 以降 | ||
| 1,321行目: | 1,252行目: | ||
BeginUndoGroup(); | BeginUndoGroup(); | ||
} | } | ||
</ | </syntaxhighlight> | ||
=== 外部リソースのチェック === | === 外部リソースのチェック === | ||
「includeライブラリ」や「GetKeyState.exe」のような外部リソースを必要とする前提のマクロでも、それらのリソースがない場合にもある程度マクロが動くようにコーディングすることができる。 | |||
* [[includeライブラリ | * [[includeライブラリ]] が必要なマクロの場合、ユーザー側が includeライブラリを正しく導入していることが要求される。 | ||
: ユーザー側で | : ユーザー側で includeライブラリを導入していて、マクロ側で <syntaxhighlight lang="javascript" inline>#include "include/IO.js"</syntaxhighlight> のようなプリプロセッサがソースコードの先頭で宣言されていれば問題ないのだが、includeライブラリが導入されていなくても、プリプロセッサを削除(コメントアウト)すればマクロがある程度動くようにコーディングすることもできる。 | ||
< | <syntaxhighlight lang="javascript"> | ||
// #include "include/IO.js" | // #include "include/IO.js" | ||
| 1,338行目: | 1,268行目: | ||
/* IO.js がインクルードされていないときの代替動作 */ ; | /* IO.js がインクルードされていないときの代替動作 */ ; | ||
} | } | ||
</ | </syntaxhighlight> | ||
* また、[[GetKeyState.exe(キー状態取得実行ファイル)]] のあるなしで動作内容を分けるなら、以下のようにコードを記述すればよい。 | * また、[[GetKeyState.exe(キー状態取得実行ファイル)]] のあるなしで動作内容を分けるなら、以下のようにコードを記述すればよい。 | ||
< | <syntaxhighlight lang="javascript"> | ||
// あらかじめ変数 ctrl に 0 を代入しておく | // あらかじめ変数 ctrl に 0 を代入しておく | ||
var ctrl = 0; | var ctrl = 0; | ||
| 1,362行目: | 1,292行目: | ||
/* GetKeyState.exe がない、または Ctrl キーが押されていないとき */ ; | /* GetKeyState.exe がない、または Ctrl キーが押されていないとき */ ; | ||
} | } | ||
</ | </syntaxhighlight> | ||
=== Mery.ini から設定値を取得する === | === Mery.ini から設定値を取得する === | ||
[[includeライブラリ | [[includeライブラリ]] の MeryInfo クラス (<code>#include "include/MeryInfo.js"</code>) を利用して Mery.ini からいくつかの設定項目の値や状態を取得することはできるが、制約が非常に多い。 | ||
* 取得できる項目がきわめて限定的である | * 取得できる項目がきわめて限定的である | ||
* 取得したい項目が複数あると、その都度 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) のパスを得られず、設定値を取得できない。 | ||
==== GetIniOption() 関数 ==== | ==== GetIniOption() 関数 ==== | ||
拙作の '''組み込み関数''' [[Mery.iniのオプション値を取得#関数|GetIniOption()]] と [[Mery.iniのオプション値を取得#GetIniOption2() 関数|GetIniOption2()]] はこれらの制約を受けず、とくに後者は <span style="color:#0000c0;"> Mery.ini のすべての項目にアクセスして値を取得することができる。</span> | 拙作の '''組み込み関数''' [[Mery.iniのオプション値を取得#関数|GetIniOption()]] と [[Mery.iniのオプション値を取得#GetIniOption2() 関数|GetIniOption2()]] はこれらの制約を受けず、とくに後者は <span style="color:#0000c0;"> Mery.ini のすべての項目にアクセスして値を取得することができる。</span> | ||
ただし、制約がない代わりに組み込み関数自体のコードが長いことや、引数や戻り値が配列であることでコードが煩雑にならざるをえない( ⇔ 配列を使用することで、複数の項目を取得する場合でも Mery.ini ファイルの読み込みを1回におさえられる)。 | ただし、制約がない代わりに組み込み関数自体のコードが長いことや、引数や戻り値が配列であることでコードが煩雑にならざるをえない( ⇔ 配列を使用することで、複数の項目を取得する場合でも Mery.ini ファイルの読み込みを1回におさえられる)。 | ||
※ [[#Mery.ini を読みこむ|IO.LoadFromFile() 関数で Mery.ini を読みこむ]] という方法もある。 | ※ [[#Mery.ini を読みこむ|IO.LoadFromFile() 関数で Mery.ini を読みこむ]] という方法もある。 | ||
また、Mery.ini 側の仕様として、 | また、Mery.ini 側の仕様として、 | ||
「オプション」など各種の設定ダイアログを [ '''OK''' ] ボタンで閉じたときか、 | 「オプション」など各種の設定ダイアログを [ '''OK''' ] ボタンで閉じたときか、 | ||
| 1,385行目: | 1,313行目: | ||
Mery.ini に直ちに反映されない | Mery.ini に直ちに反映されない | ||
という制約がある(Mery.ini の実体ファイルへの書き込み回数を減らすための仕様)。 | という制約がある(Mery.ini の実体ファイルへの書き込み回数を減らすための仕様)。 | ||
<span style="color:#c00;">エディタの表示状態をトグル切り替えするコマンド(縦書き、色の反転、全画面表示、etc. ...)については、マクロ用の標準メソッド/プロパティから「現在の表示状態」を取得する手段がなく、'''組み込み関数 GetIniOption2() で Mery.ini を読み込んでも、必ずしも「最新の設定状態」を取得できるわけではない'''…。</span> | <span style="color:#c00;">エディタの表示状態をトグル切り替えするコマンド(縦書き、色の反転、全画面表示、etc. ...)については、マクロ用の標準メソッド/プロパティから「現在の表示状態」を取得する手段がなく、'''組み込み関数 GetIniOption2() で Mery.ini を読み込んでも、必ずしも「最新の設定状態」を取得できるわけではない'''…。</span> | ||
※ 「現在の表示状態」を取得してから ON/OFF | ※ 「現在の表示状態」を取得してから ON/OFF を指定しての切り替えを行なうためには、includeライブラリの IO クラスを利用するなどして外部に Mery.ini とは別の設定ファイル (e.g. JSON ファイル) を用意し、切り替え実行のたびに設定ファイルを読み書きする必要がある。 | ||
ただし、この方法をとる場合は、外部ファイルに設定内容をあずける項目(コマンド)の切り替えについては必ずマクロ経由で行なわなければならず、デフォルトの メニュー項目/ツールバーアイコン/ショートカットキー による通常操作でその項目の状態の変更をすると、最新の設定状態(現在の表示状態)と外部ファイルが保持している設定内容とのあいだに齟齬が生じてしまう。 | ただし、この方法をとる場合は、外部ファイルに設定内容をあずける項目(コマンド)の切り替えについては必ずマクロ経由で行なわなければならず、デフォルトの メニュー項目/ツールバーアイコン/ショートカットキー による通常操作でその項目の状態の変更をすると、最新の設定状態(現在の表示状態)と外部ファイルが保持している設定内容とのあいだに齟齬が生じてしまう。 | ||
: → e.g. 「[[折り返しトグル切り替え#3つの折り返しモードを順々にトグルする|折り返しトグル切り替え]]」マクロ | : → e.g. 「[[折り返しトグル切り替え#3つの折り返しモードを順々にトグルする|折り返しトグル切り替え]]」マクロ | ||
==== Mery.ini からさまざまな情報を読み込んで利用するマクロ ==== | ==== Mery.ini からさまざまな情報を読み込んで利用するマクロ ==== | ||
組み込み関数 GetIniOption / GetIniOption2 を利用(必用に応じてカスタマイズ)した拙作マクロ | 組み込み関数 GetIniOption / GetIniOption2 を利用(必用に応じてカスタマイズ)した拙作マクロ | ||
| 1,397行目: | 1,326行目: | ||
* 「[[ファイルを読み直す・開きなおす]]」: 自動保存・バックアップの設定状態、タブの閉じるボタンの表示設定などを取得して動作コードの条件分岐に利用。 編集モード名の一覧取得してポップアップメニューから切り替える。 | * 「[[ファイルを読み直す・開きなおす]]」: 自動保存・バックアップの設定状態、タブの閉じるボタンの表示設定などを取得して動作コードの条件分岐に利用。 編集モード名の一覧取得してポップアップメニューから切り替える。 | ||
* 「[[マクロメニュー]]」: [[ヘルプ:マクロ#カスタマイズ|マクロのカスタマイズ]] に登録済みのマクロの一覧をポップアップメニューに表示して、選択したマクロを実行または Mery で開く(編集)。 | * 「[[マクロメニュー]]」: [[ヘルプ:マクロ#カスタマイズ|マクロのカスタマイズ]] に登録済みのマクロの一覧をポップアップメニューに表示して、選択したマクロを実行または Mery で開く(編集)。 | ||
* 「[[コンパクトメニュー]]」: 登録されている編集モード名の一覧、マクロ(Mery.exe からの相対パス)の一覧、プラグイン(Mery.exe からの相対パス)の一覧、外部ツール名の一覧、およびそれぞれの登録された並び順を取得して、ポップアップメニュー化。 通常では表示されないような機能もほぼ全てメニュー化する。 | * 「[[コンパクトメニュー]]」: 登録されている編集モード名の一覧、マクロ(Mery.exe からの相対パス)の一覧、プラグイン(Mery.exe からの相対パス)の一覧、外部ツール名の一覧、およびそれぞれの登録された並び順を取得して、ポップアップメニュー化。 通常では表示されないような機能もほぼ全てメニュー化する。 | ||
** ※ [[コンパクトメニュー#制限事項|制限事項]] にマクロから できること/できないこと についての説明あり。 | |||
==== Mery.ini からは「最新の状態」を取得できない設定項目 ==== | ==== Mery.ini からは「最新の状態」を取得できない設定項目 ==== | ||
* [[ヘルプ:ファイル#最近のファイル|最近開いたファイルの一覧]]、検索履歴、[ [[ヘルプ:表示#フォント|フォントの履歴]] ] とフォントのサイズ、標準ツールバーの [ [[ヘルプ:表示|表示]] ] メニューや [ [[ヘルプ:ウィンドウ|ウインドウ]] ] メニュー内から ON/OFF の切り替えが可能な項目、[[ヘルプ:ツール#プラグイン|プラグイン]] の ON/OFF の状態、現在のウインドウサイズや位置、etc. ...。 | * [[ヘルプ:ファイル#最近のファイル|最近開いたファイルの一覧]]、検索履歴、[ [[ヘルプ:表示#フォント|フォントの履歴]] ] とフォントのサイズ、標準ツールバーの [ [[ヘルプ:表示|表示]] ] メニューや [ [[ヘルプ:ウィンドウ|ウインドウ]] ] メニュー内から ON/OFF の切り替えが可能な項目、[[ヘルプ:ツール#プラグイン|プラグイン]] の ON/OFF の状態、現在のウインドウサイズや位置、etc. ...。 | ||
※ メニューバーから設定状態を変更できる項目は、即時 Mery.ini の内容が更新されるわけではないので、マクロから「最新の状態」を取得することはできない。 検索履歴も同様。 | ※ メニューバーから設定状態を変更できる項目は、即時 Mery.ini の内容が更新されるわけではないので、マクロから「最新の状態」を取得することはできない。 検索履歴も同様。 | ||
※ フォントの使用履歴の取得は可能だが、[ 表示 ] メニューから切り替えたさいの「最新の状態」は取得できない。 また、マクロからフォントを変更する手段がない (履歴内の並び順を取得できないので <code>wshShell.SendKeys()</code> などのキーストロークエミュレーションでも不可)。 フォントサイズを 大きく/小さく するだけならマクロからでも変更可能。 | ※ フォントの使用履歴の取得は可能だが、[ 表示 ] メニューから切り替えたさいの「最新の状態」は取得できない。 また、マクロからフォントを変更する手段がない (履歴内の並び順を取得できないので <code>wshShell.SendKeys()</code> などのキーストロークエミュレーションでも不可)。 フォントサイズを 大きく/小さく するだけならマクロからでも変更可能。 | ||
=== 外部ファイルにマクロの設定などを書き出す === | === 外部ファイルにマクロの設定などを書き出す === | ||
マクロの設定情報を保存して次回の実行時にそれを参照して使いたい場合、[[includeライブラリ | マクロの設定情報を保存して次回の実行時にそれを参照して使いたい場合、[[includeライブラリ]] の IO クラス (IO.js) の <code>IO.Serialize()</code> と <code>IO.Deserialize()</code> を利用するのがもっとも簡単な方法だとおもわれる。 | ||
* [[マクロライブラリ]] では「[[折り返しトグル切り替え]]」マクロ(Bleat 版 / sukemaru 版)や ks 氏の「[[スマートインデント(C 構文)]]」マクロの SwitchSmartIndent.js のコードが、 <code>IO.Serialize()</code> / <code>IO.Deserialize()</code> を利用したマクロの雛形として利用しやすい。 | * [[マクロライブラリ]] では「[[折り返しトグル切り替え]]」マクロ(Bleat 版 / sukemaru 版)や ks 氏の「[[スマートインデント(C 構文)]]」マクロの SwitchSmartIndent.js のコードが、 <code>IO.Serialize()</code> / <code>IO.Deserialize()</code> を利用したマクロの雛形として利用しやすい。 | ||
* 複数の設定値を保存/参照する複雑なものとしては、ks 氏の「[[階層化マクロメニュー]]」マクロや、拙作「[[ポップアップメニューで検索先にジャンプ#include版|検索ジャンプ]]」「[[ブックマーク一覧ジャンプ#include版|ブックマークジャンプ]]」や「[[ファイルを読み直す・開きなおす#include版|読みなおし]]」マクロなどもあるが、メイン部分の動作コード自体が長く煩雑なので参考にしづらいとおもわれる…。 | * 複数の設定値を保存/参照する複雑なものとしては、ks 氏の「[[階層化マクロメニュー]]」マクロや、拙作「[[ポップアップメニューで検索先にジャンプ#include版|検索ジャンプ]]」「[[ブックマーク一覧ジャンプ#include版|ブックマークジャンプ]]」や「[[ファイルを読み直す・開きなおす#include版|読みなおし]]」マクロなどもあるが、メイン部分の動作コード自体が長く煩雑なので参考にしづらいとおもわれる…。 | ||
* 「マクロA」で書き込んだ外部ファイル(JSON)を別の「マクロB」で読み込んで利用する例として、ks 氏の「[[スマートインデント(C 構文)]]」、拙作「[[位置情報を保存してから「すべて選択/選択解除」(非スクロール)]]」。 | * 「マクロA」で書き込んだ外部ファイル(JSON)を別の「マクロB」で読み込んで利用する例として、ks 氏の「[[スマートインデント(C 構文)]]」、拙作「[[位置情報を保存してから「すべて選択/選択解除」(非スクロール)]]」。 | ||
※ ただし、マクロの実行ごとに外部ファイル(設定ファイル.JSON と includeライブラリの IO.js および json2.js)を読みこむことになるので、環境によってはマクロの動作のもたつきや [[#エラー処理|エラー]] が生じてしまう可能性がある。 | |||
以下、「[[折り返しトグル切り替え#3つの折り返しモードを順々にトグルする|折り返しトグル切り替え]]」マクロを例に <code>IO.Serialize()</code> / <code>Deserialize()</code> の利用方法の簡単な説明。 | 以下、「[[折り返しトグル切り替え#3つの折り返しモードを順々にトグルする|折り返しトグル切り替え]]」マクロを例に <code>IO.Serialize()</code> / <code>Deserialize()</code> の利用方法の簡単な説明。 | ||
< | <syntaxhighlight lang="javascript"> | ||
#include "include/IO.js" | #include "include/IO.js" | ||
// \Macros\include\IO.js をインクルードする | // \Macros\include\IO.js をインクルードする | ||
| 1,476行目: | 1,404行目: | ||
// setting オブジェクトの変更内容を保存する | // setting オブジェクトの変更内容を保存する | ||
IO.Serialize( setting, jsonName ); | IO.Serialize( setting, jsonName ); | ||
</ | </syntaxhighlight> | ||
==== Tag プロパティ ==== | ==== Tag プロパティ ==== | ||
[https://www.haijin-boys.com/software/mery/mery-3-0-0 ベータ版 ver 3.0.0] で追加された <code>Tag</code> プロパティを活用することで、外部ファイルにマクロの設定を書き出す必用がなくなる場面もでてくるとおもわれる。 | [https://www.haijin-boys.com/software/mery/mery-3-0-0 ベータ版 ver 3.0.0] で追加された <code>Tag</code> プロパティを活用することで、外部ファイルにマクロの設定を書き出す必用がなくなる場面もでてくるとおもわれる。 | ||
: ref. [[マクロリファレンス:3:Document_オブジェクト#Tag_プロパティ|Document.Tag プロパティ]]、[[マクロリファレンス:3:Editor_オブジェクト#Tag_プロパティ|Editor.Tag プロパティ]]、[[マクロリファレンス:3:Window=オブジェクト#Tag_プロパティ|Window.Tag プロパティ]](@[[マクロリファレンス:3]]) | : ref. [[マクロリファレンス:3:Document_オブジェクト#Tag_プロパティ|Document.Tag プロパティ]]、[[マクロリファレンス:3:Editor_オブジェクト#Tag_プロパティ|Editor.Tag プロパティ]]、[[マクロリファレンス:3:Window=オブジェクト#Tag_プロパティ|Window.Tag プロパティ]](@[[マクロリファレンス:3]]) | ||
外部ファイルへのアクセスの必用がなくなり、マクロの実行コードのスリム化(「includeライブラリ」も利用せずに済む)や安定性の向上、動作の高速化などが期待できるが、<code>Tag</code> プロパティへの書き込みは <span style="color:#c00;">最長でも Mery.exe のプロセスが終了するまでの "一時保存/一時利用"</span> にとどまるので、マクロのデフォルト動作の設定を保存したい場合には外部ファイルを利用するほうがよさそうである。 | |||
* 拙作マクロで外部ファイルの利用から <code>Tag</code> プロパティの利用に切り替えたのは、現時点では上出の「[[折り返しトグル切り替え#3つの折り返しモードを順々にトグルする|折り返しトグル切り替え]]」マクロだけである。 | * 拙作マクロで外部ファイルの利用から <code>Tag</code> プロパティの利用に切り替えたのは、現時点では上出の「[[折り返しトグル切り替え#3つの折り返しモードを順々にトグルする|折り返しトグル切り替え]]」マクロだけである。 | ||
: ※「[[位置情報を保存してから「すべて選択/選択解除」(非スクロール)]]」マクロ (include版) や「[[位置情報を保存してから「すべて選択/選択解除」(非スクロール)#【include 版】位置を復帰/保存|位置を復帰/保存]]」マクロ (include版)、「[[カッコをはずす#カッコを追加/削除|カッコを追加/削除]]」マクロ (include版) も <code>Tag</code> プロパティへの移行を検討中 (いまのところ、ベータ版 ver 3.0.0 で追加された '''マルチカーソル''' 機能 [https://www.haijin-boys.com/software/mery/mery-3-0-0#4] に対応する目処が立っていないので、公開版の更新は保留)。 | : ※「[[位置情報を保存してから「すべて選択/選択解除」(非スクロール)]]」マクロ (include版) や「[[位置情報を保存してから「すべて選択/選択解除」(非スクロール)#【include 版】位置を復帰/保存|位置を復帰/保存]]」マクロ (include版)、「[[カッコをはずす#カッコを追加/削除|カッコを追加/削除]]」マクロ (include版) も <code>Tag</code> プロパティへの移行を検討中 (いまのところ、ベータ版 ver 3.0.0 で追加された '''マルチカーソル''' 機能 [https://www.haijin-boys.com/software/mery/mery-3-0-0#4] に対応する目処が立っていないので、公開版の更新は保留)。 | ||
* ポップアップメニュー内の「設定変更サブメニュー」で動作設定を変更するタイプの拙作【include版】マクロは、外部ファイルを利用する仕様のままにする予定。 | * ポップアップメニュー内の「設定変更サブメニュー」で動作設定を変更するタイプの拙作【include版】マクロは、外部ファイルを利用する仕様のままにする予定。 | ||
=== 関数の「呼び出しコスト」 === | === 関数の「呼び出しコスト」 === | ||
ユーザー関数は、呼び出し元から参照可能な位置に記述すれば、ソースコードの任意の位置に配置することができる。 | ユーザー関数は、呼び出し元から参照可能な位置に記述すれば、ソースコードの任意の位置に配置することができる。 | ||
'''e.g. [[#メタ記号をエスケープする|半角英数字以外を「¥」でエスケープ処理する]]''' | 繰り返し何度も呼び出して使用する関数の場合に「呼び出しコスト」を気にする人もいるらしいが、Mery で使用するマクロ程度のソースコードであればあまり気にする必要はないようにおもわれる。 | ||
'''e.g. [[#メタ記号をエスケープする|半角英数字以外を「¥」でエスケープ処理する]]''' | |||
※ あえて '''ループ処理で1行ずつエスケープ''' してみる ([[#その他、拙作マクロについて|@ロースペの XP ノート]]) | ※ あえて '''ループ処理で1行ずつエスケープ''' してみる ([[#その他、拙作マクロについて|@ロースペの XP ノート]]) | ||
< | <syntaxhighlight lang="javascript"> | ||
/* 関数バージョン */ | /* 関数バージョン */ | ||
| 1,514行目: | 1,443行目: | ||
} | } | ||
document.Text = a.join( "\n" ); | document.Text = a.join( "\n" ); | ||
</ | </syntaxhighlight> | ||
< | <syntaxhighlight lang="javascript" inline>function Quote( str )</syntaxhighlight> でも <syntaxhighlight lang="javascript" inline>var Quote = function( str )</syntaxhighlight> でも、約 9500 行の日本語テキスト(約 33 万文字)にたいして 1.1 秒台の処理時間がかかり有意な差はみられなかった。 | ||
関数を使用しない以下のようなベタ書きのコードの場合でも、ほぼ同じ程度の処理時間がかかった (@ロースペの XP ノート)。 | 関数を使用しない以下のようなベタ書きのコードの場合でも、ほぼ同じ程度の処理時間がかかった (@ロースペの XP ノート)。 | ||
< | <syntaxhighlight lang="javascript"> | ||
/* 非関数バージョン */ | /* 非関数バージョン */ | ||
| 1,529行目: | 1,458行目: | ||
} | } | ||
document.Text = a.join( "\n" ); | document.Text = a.join( "\n" ); | ||
</ | </syntaxhighlight> | ||
※ ループ文の中で関数を定義した場合は、やや遅くなって 1.3 秒台。 | ※ ループ文の中で関数を定義した場合は、やや遅くなって 1.3 秒台。 | ||
< | <syntaxhighlight lang="javascript"> | ||
BeginUndoGroup(); | BeginUndoGroup(); | ||
var lines = document.GetLines( 0 ); | var lines = document.GetLines( 0 ); | ||
| 1,543行目: | 1,472行目: | ||
} | } | ||
document.Text = a.join( "\n" ); | document.Text = a.join( "\n" ); | ||
</ | </syntaxhighlight> | ||
※ 行ごとのループ処理ではなく、文書全体の '''一括処理''' にすると速くなる。 | |||
上とおなじ <code>Quote()</code> 関数を使用しての文書全体の一括処理でも… | 上とおなじ <code>Quote()</code> 関数を使用しての文書全体の一括処理でも… | ||
< | <syntaxhighlight lang="javascript"> | ||
function Quote( str ) { | function Quote( str ) { | ||
return str.replace( /\W/g, "\\$&" ); | return str.replace( /\W/g, "\\$&" ); | ||
| 1,554行目: | 1,483行目: | ||
document.Text = Quote( document.Text ); | document.Text = Quote( document.Text ); | ||
</ | </syntaxhighlight> | ||
関数を使用しないベタ書きの一括処理でも… | 関数を使用しないベタ書きの一括処理でも… | ||
< | <syntaxhighlight lang="javascript"> | ||
document.Text = document.Text.replace( /\W/g, "\\$&" ); | document.Text = document.Text.replace( /\W/g, "\\$&" ); | ||
</ | </syntaxhighlight> | ||
…処理時間はほぼ同じで、約 0.7 ~ 0.8 秒だった。 | …処理時間はほぼ同じで、約 0.7 ~ 0.8 秒だった。 | ||
現行 OS の [https://ja.wikipedia.org/wiki/Chakra#%E6%AD%B4%E5%8F%B2 Chakra エンジン (jscript9.dll) であれば約 20 倍] の速度が出るらしいので、数メガバイトとか数万行とかのよほど長大な文書の処理をする場合でもなければ、「関数の呼び出しコスト」を気にする必要はあまりなさそう。 | 現行 OS の [https://ja.wikipedia.org/wiki/Chakra#%E6%AD%B4%E5%8F%B2 Chakra エンジン (jscript9.dll) であれば約 20 倍] の速度が出るらしいので、数メガバイトとか数万行とかのよほど長大な文書の処理をする場合でもなければ、「関数の呼び出しコスト」を気にする必要はあまりなさそう。 | ||
それよりも、 | それよりも、 | ||
* 文字列操作や検索/置換にさいして、なるべくキャレットの移動をともなうメソッドを使用しない | * 文字列操作や検索/置換にさいして、なるべくキャレットの移動をともなうメソッドを使用しない | ||
| 1,571行目: | 1,500行目: | ||
* ループ処理などから繰りかえして呼び出す必要のある関数の場合は、なるべくなら関数定義文を呼び出し元のコードよりも先に記述しておく | * ループ処理などから繰りかえして呼び出す必要のある関数の場合は、なるべくなら関数定義文を呼び出し元のコードよりも先に記述しておく | ||
などで、ソースコードの最適化をはかるほうが良いはず。(… sukemaru 自身はこのルールをあまり守っていない) | などで、ソースコードの最適化をはかるほうが良いはず。(… sukemaru 自身はこのルールをあまり守っていない) | ||
※ ちなみに、<code>Quote()</code> 関数を以下のように記述した場合、上のようなループ処理コードでの所要時間は 3 倍(3 秒台)。 | ※ ちなみに、<code>Quote()</code> 関数を以下のように記述した場合、上のようなループ処理コードでの所要時間は 3 倍(3 秒台)。 | ||
< | <syntaxhighlight lang="javascript"> | ||
function Quote( str ) { | function Quote( str ) { | ||
return str.replace( /\W/g, function( $0 ) { | return str.replace( /\W/g, function( $0 ) { | ||
| 1,579行目: | 1,508行目: | ||
} ); | } ); | ||
} | } | ||
</ | </syntaxhighlight> | ||
以下のような記述だと、ループ処理した場合の所要時間は 4 倍以上(4 ~ 5 秒台)になる。 | 以下のような記述だと、ループ処理した場合の所要時間は 4 倍以上(4 ~ 5 秒台)になる。 | ||
< | <syntaxhighlight lang="javascript"> | ||
function Quote( str ) { | function Quote( str ) { | ||
return str.replace( /\W/g, Escape ); | return str.replace( /\W/g, Escape ); | ||
| 1,588行目: | 1,517行目: | ||
return "\\" + matched; | return "\\" + matched; | ||
} | } | ||
</ | </syntaxhighlight> | ||
…ループ処理から参照する関数のネストや二重参照は、ループ文内で関数を定義する場合以上に鬼門のようだ。 | …ループ処理から参照する関数のネストや二重参照は、ループ文内で関数を定義する場合以上に鬼門のようだ。 | ||
=== FileSystemObject と WScript.Shell でファイルパスを引数にするとき === | === FileSystemObject と WScript.Shell でファイルパスを引数にするとき === | ||
| 1,598行目: | 1,524行目: | ||
* [https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc409800(v=msdn.10) FileSystemObject] ではパスをダブルクオートなどの <b style="color:#0000c0;">引用符で囲う必要がない</b> | * [https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc409800(v=msdn.10) FileSystemObject] ではパスをダブルクオートなどの <b style="color:#0000c0;">引用符で囲う必要がない</b> | ||
* [https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc364436%28v%3dmsdn.10%29 WScript.Shell] などの WSH コードではパスをダブルクオートなどの <b style="color:#c00;">引用符で囲う必要がある</b> | * [https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc364436%28v%3dmsdn.10%29 WScript.Shell] などの WSH コードではパスをダブルクオートなどの <b style="color:#c00;">引用符で囲う必要がある</b> | ||
< | よって、[https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc364421%28v%3dmsdn.10%29 WshShell.Run() コマンド] などで不特定のパス(または任意のパス)を指定するときは <syntaxhighlight lang="javascript" inline>WshShell.Run( "\"" + path + "\"" )</syntaxhighlight> または <syntaxhighlight lang="javascript" inline>WshShell.Run( '"' + path + '"' )</syntaxhighlight> のように記述しておき、パスに半角空白がふくまれていてもエラーにならないように備えておくとよい。 | ||
<syntaxhighlight lang="javascript"> | |||
// 半角空白を含むパス | // 半角空白を含むパス | ||
var path = "C:\\Hoge hoge\\Fuga fuga\\Piyo piyo.txt"; | var path = "C:\\Hoge hoge\\Fuga fuga\\Piyo piyo.txt"; | ||
| 1,611行目: | 1,537行目: | ||
wshShell.Run( "\"" + path + "\"" ); // 引用符で囲う必要がある | wshShell.Run( "\"" + path + "\"" ); // 引用符で囲う必要がある | ||
} | } | ||
</ | </syntaxhighlight> | ||
=== 警告・確認ダイアログとステータスバーの使い分け === | === 警告・確認ダイアログとステータスバーの使い分け === | ||
マクロからユーザーにメッセージを与える手段として '''警告'''([[マクロリファレンス:Window インターフェイス#Alert メソッド|window.Alert]])・'''確認'''([[マクロリファレンス:Window インターフェイス#Confirm メソッド|window.Confirm]])ダイアログと '''ステータスバー'''([[マクロリファレンス:Window インターフェイス#Status プロパティ|window.Status]])への表示などがある(ほかに '''アウトプットバー'''([[マクロリファレンス:OutputBar インターフェイス#Write メソッド|OutputBar.Write]])や '''ポップアップメニュー''' を使う方法もある)。 | マクロからユーザーにメッセージを与える手段として '''警告'''([[マクロリファレンス:Window インターフェイス#Alert メソッド|window.Alert]])・'''確認'''([[マクロリファレンス:Window インターフェイス#Confirm メソッド|window.Confirm]])ダイアログと '''ステータスバー'''([[マクロリファレンス:Window インターフェイス#Status プロパティ|window.Status]])への表示などがある(ほかに '''アウトプットバー'''([[マクロリファレンス:OutputBar インターフェイス#Write メソッド|OutputBar.Write]])や '''ポップアップメニュー''' を使う方法もある)。 | ||
< | <syntaxhighlight lang="javascript"> | ||
// e.g. ポップアップメニューを「ポップアップヒント」として使用する | // e.g. ポップアップメニューを「ポップアップヒント」として使用する | ||
| 1,624行目: | 1,549行目: | ||
var r = m.Track( 1 ); | var r = m.Track( 1 ); | ||
} | } | ||
</ | </syntaxhighlight> | ||
基本的に、Mery のマクロで利用できるポップアップダイアログ(警告、確認)はどちらもシステムサウンドをともない、ボタン操作で閉じるまで作業を中断させてしまうので、あえて作業を一時停止させる必要がある場面以外ではステータス表示を使用するのがよい。 | 基本的に、Mery のマクロで利用できるポップアップダイアログ(警告、確認)はどちらもシステムサウンドをともない、ボタン操作で閉じるまで作業を中断させてしまうので、あえて作業を一時停止させる必要がある場面以外ではステータス表示を使用するのがよい。 | ||
※ ユーザー側がステータス表示を使用するイベントマクロなどを別途で導入していることを考慮すると、マクロの終了時になんらかのイベントが発生するマクロの場合、重要なメッセージはダイアログで出力させるか、マクロ内の動作設定用の変数で出力方法を選択できるようにしておくとなおよい。 | ※ ユーザー側がステータス表示を使用するイベントマクロなどを別途で導入していることを考慮すると、マクロの終了時になんらかのイベントが発生するマクロの場合、重要なメッセージはダイアログで出力させるか、マクロ内の動作設定用の変数で出力方法を選択できるようにしておくとなおよい。 | ||
また、Mery の Window クラスのメソッド・プロパティを使うほかにも、WSH の [https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc364428(v=msdn.10) WshShell.Popup() メソッド] によるメッセージボックスを利用することもできる。 | |||
ダイアログ内の左側のアイコンの種類や <kbd>OK</kbd> <kbd>キャンセル</kbd> <kbd>はい</kbd> <kbd>いいえ</kbd> などのボタンの種類をカスタマイズでき、指定時間の経過後に自動で閉じさせることもできるが、引数の指定や戻り値の処理が煩雑なので、 <kbd>はい</kbd> <kbd>いいえ</kbd> <kbd>キャンセル</kbd> の3ボタンが必要な場合でもなければお勧めはしない…。 | |||
< | |||
< | |||
< | |||
/ | |||
※ アイコンなしにすれば、システムのサウンドなしでダイアログを表示できる。 | |||
※ <code>WshShell.Popup()</code> メソッドならばメッセージボックスが表示されたままの状態でもエディタの編集操作が可能な場合もあるが、メッセージボックスが表示されているあいだは別のマクロを起動することはできない (ショートカットキーなどから別のマクロを起動しようとすると、Mery 本体のプロセスが不安定になることがある)。 | |||
< | |||
</ | |||
=== その他、拙作マクロについて === | === その他、拙作マクロについて === | ||
Kuro 氏の [[#引用符/コメント|「引用を追加」マクロのカスタマイズ]] をきっかけとしてマクロの改造に手を染め、 [[#アイコン|マクロのアイコン化のためにアイコンを量産]] していくうちにマクロの自作も始めて、マクロ制作のための補助的マクロの自作とか「タマゴ? ニワトリ?」状態になったりしています。 | Kuro 氏の [[#引用符/コメント|「引用を追加」マクロのカスタマイズ]] をきっかけとしてマクロの改造に手を染め、 [[#アイコン|マクロのアイコン化のためにアイコンを量産]] していくうちにマクロの自作も始めて、マクロ制作のための補助的マクロの自作とか「タマゴ? ニワトリ?」状態になったりしています。 | ||
'''マウス派''' として Mery を便利に扱えるようにするつもりでマクロを作っていますが、マニアックな個人的要求(欲求)を自己解決していくうちに | |||
'''マウス派''' として Mery を便利に扱えるようにするつもりでマクロを作っていますが、マニアックな個人的要求(欲求)を自己解決していくうちに Mery の外観 が本来の姿からかけ離れてしまっているという…。 | |||
* sukemaru の Mery 運用環境はロースペックの '''Windows XP sp3 (32bit), JScript 5.8.20587''' のノート PC (CPU: Atom 1.7GHz, 1 コア, 2 スレッド) です。 | * sukemaru の Mery 運用環境はロースペックの '''Windows XP sp3 (32bit), JScript 5.8.20587''' のノート PC (CPU: Atom 1.7GHz, 1 コア, 2 スレッド) です。 | ||
: ※ 制作したマクロの動作テストは、この XP 機でしかおこなっていません。 | : ※ 制作したマクロの動作テストは、この XP 機でしかおこなっていません。 | ||
: ※ マクロの動作テストに使用している Mery のバージョンは、"最新のベータ版" (および "最新の正式版" ver. 2.6.7 ) のみです。 基本的に ver 2.6.7 以降のバージョンで動作するように作成していますが、ver 2.6.6 以前のバージョンでの利用を想定していません( ver 2.6.6 以下での動作確認はしていません)。 | : ※ マクロの動作テストに使用している Mery のバージョンは、"最新のベータ版" (および "最新の正式版" ver. 2.6.7 ) のみです。 基本的に ver 2.6.7 以降のバージョンで動作するように作成していますが、ver 2.6.6 以前のバージョンでの利用を想定していません( ver 2.6.6 以下での動作確認はしていません)。 | ||
: ※ とくに「[[ | : ※ とくに「[[#実験的マクロ・練習マクロなど|実験的マクロ・練習マクロなど]]」カテゴリに投稿した【自家用】/【実験】マクロにおいては、よその環境を考慮した動作テストをしていません。 | ||
: ※ マクロの動作速度のテストは [https://www.aozora.gr.jp/ 青空文庫] からダウンロードした『[https://www.aozora.gr.jp/cards/000148/card789.html 吾輩は猫である]』のルビを削除して1文ごとに改行させたテキストファイル(約 33 万文字/約 9500 行)でおこなっています。 1 メガバイト超のファイルでのテストはしていません ( ロースペ PC なので 2000 行を超えるあたりから動作速度が気になりだすのですが… [https://www.haijin-boys.com/discussions/4395])。 | : ※ マクロの動作速度のテストは [https://www.aozora.gr.jp/ 青空文庫] からダウンロードした『[https://www.aozora.gr.jp/cards/000148/card789.html 吾輩は猫である]』のルビを削除して1文ごとに改行させたテキストファイル(約 33 万文字/約 9500 行)でおこなっています。 1 メガバイト超のファイルでのテストはしていません ( ロースペ PC なので 2000 行を超えるあたりから動作速度が気になりだすのですが… [https://www.haijin-boys.com/discussions/4395])。 | ||
: ※ ZIP 版の Mery でマクロを作成・運用しているので、インストーラ版では正しく動作しないマクロがあるかもしれません。 | : ※ ZIP 版の Mery でマクロを作成・運用しているので、インストーラ版では正しく動作しないマクロがあるかもしれません。 | ||
* 開発環境が Windows XP なので、拙作マクロは基本的に JavaScript(JScript)マクロです。 | * 開発環境が Windows XP なので、拙作マクロは基本的に JavaScript(JScript)マクロです。 | ||
: ※ 変数はすべて < | : ※ 変数はすべて <syntaxhighlight lang="javascript" inline>var</syntaxhighlight> で宣言し、JScript 5.8 の環境で実行できるようにコーディングしています。 | ||
* Mery のオプション設定で「行の表示方法=論理座標 (論理行)」の状態で運用する前提でマクロを作っています。 公開しているマクロでは、「表示座標 (表示行)」ベースで Mery を運用している場合でも利用できるように設定項目(変数)を設けるか「行の表示方法」を自動判定するコードを追加していますが、動作が不完全になったり処理がおそくなったりすることがあります。 | * Mery のオプション設定で「行の表示方法=論理座標 (論理行)」の状態で運用する前提でマクロを作っています。 公開しているマクロでは、「表示座標 (表示行)」ベースで Mery を運用している場合でも利用できるように設定項目(変数)を設けるか「行の表示方法」を自動判定するコードを追加していますが、動作が不完全になったり処理がおそくなったりすることがあります。 | ||
: <span style="color:#c00;"> ※「表示座標 (表示行)」ベースでの動作テストはほとんどしていません。</span> | : <span style="color:#c00;"> ※「表示座標 (表示行)」ベースでの動作テストはほとんどしていません。</span> | ||
* ソースコード内ではしばしば unicode 文字を使用していますので、マクロの JS ファイルは UTF-8 形式で保存する前提となっています。 | * ソースコード内ではしばしば unicode 文字を使用していますので、マクロの JS ファイルは UTF-8 形式で保存する前提となっています。 | ||
* ソースコード内の変数名の検索などで「[[ポップアップメニューで検索先にジャンプ | * ソースコード内の変数名の検索などで「[[ポップアップメニューで検索先にジャンプ]]」マクロを利用しやすいように(個人的にタグジャンプ系のマクロに馴染めないので)、マクロのコードには半角空白を多用しています。 | ||
* 基本的に、変数名は頭文字が小文字の '''camelCase''' に、関数名は頭文字が大文字の '''TitleCase''' にしてあります。 | * 基本的に、変数名は頭文字が小文字の '''camelCase''' に、関数名は頭文字が大文字の '''TitleCase''' にしてあります。 | ||
* 「[[includeライブラリ]]」(作成: ks 氏) を利用する【'''include 版'''】と利用しない【'''通常版'''】とがあるマクロでは、include 版を優先的にメンテ・更新しています(←自家用)。 | |||
* 「[[includeライブラリ | * 外部実行ファイル「[[GetKeyState.exe(キー状態取得実行ファイル)]]」(作成: pizz 氏) の導入が必要なものもあります。 | ||
* 外部実行ファイル「[[GetKeyState.exe(キー状態取得実行ファイル) | |||
* | * ポップアップメニューマクロの「設定変更サブメニュー」など、複数のマクロで共通の自作関数を使用しているものがありますが、当面は「includeライブラリ」のような外部ファイルにまとめる予定なしです。 | ||
: ∴ すでに公開しているマクロが多いこと、公開用と自家用とでコードの内容がちがうマクロが複数あること、それぞれのマクロごとに自作関数のコードに改変をくわえていることなどの理由で、もはや関数・クラスを統一しなおして更新メンテするのが困難。 | : ∴ すでに公開しているマクロが多いこと、公開用と自家用とでコードの内容がちがうマクロが複数あること、それぞれのマクロごとに自作関数のコードに改変をくわえていることなどの理由で、もはや関数・クラスを統一しなおして更新メンテするのが困難。 | ||
: <span id="Mery.ini を読みこむ"></span>∴ | : <span id="Mery.ini を読みこむ"></span>∴ 「includeライブラリ」のように独自クラスでまとめたものをインクルードして利用するよりも、必要な関数だけをソースコード内にコピペして使用するほうが、マクロの処理速度的には僅かながらも有利?(な気がする… @ロースペ XP)。 | ||
:: →念のため確認してみたら、やはり差は僅かだった。 | |||
: ※「includeライブラリ」の MeryInfo.js と [[マクロ覚え書き(開発者向け)#includeライブラリの IO クラスを利用する|IO.js をインクルード]] したマクロで Mery.ini ( 31 万文字超/約 5600 行、約 320 kB ) から「行の表示方法 (LineColumnView キー)」を取得すると、平均 0.125 秒。 | |||
: | <syntaxhighlight lang="javascript"> | ||
< | |||
#include "include/IO.js" | #include "include/IO.js" | ||
#include "include/MeryInfo.js" | #include "include/MeryInfo.js" | ||
| 1,762行目: | 1,601行目: | ||
Alert( "行の表示方法: " + ( lineColumnView ? "表示行" : "論理行" ) | Alert( "行の表示方法: " + ( lineColumnView ? "表示行" : "論理行" ) | ||
+ "\n\n" + ( ( new Date() - start ) / 1000 ).toFixed( 3 ) + " 秒" ); | + "\n\n" + ( ( new Date() - start ) / 1000 ).toFixed( 3 ) + " 秒" ); | ||
</ | </syntaxhighlight> | ||
: ※ [[Mery.iniのオプション値を取得#GetIniOption2() 関数|組み込み関数 GetIniOption2()]] を利用したマクロで「行の表示方法」を取得すると、平均 0.095 秒。 | : ※ [[Mery.iniのオプション値を取得#GetIniOption2() 関数|組み込み関数 GetIniOption2()]] を利用したマクロで「行の表示方法」を取得すると、平均 0.095 秒。 | ||
< | <syntaxhighlight lang="javascript"> | ||
var start = new Date(); | var start = new Date(); | ||
// 関数の戻り値 iniOption[0][2] が LineColumnView キーの値 | // 関数の戻り値 iniOption[0][2] が LineColumnView キーの値 | ||
| 1,779行目: | 1,618行目: | ||
} | } | ||
// ---------- ▲ 組み込み関数 ココまで ▲ ---------- | // ---------- ▲ 組み込み関数 ココまで ▲ ---------- | ||
</ | </syntaxhighlight> | ||
: GetIniOption2() 関数は、<code>IO.LoadFromFile()</code> と <code>MeryInfo.GetIniPath()</code> のコードを翻案して作ったものなので、Mery.ini のパスを解決して [[マクロ覚え書き(開発者向け)#ADODB.Stream を利用する|ADODB.Stream で読みこむ]] 処理の部分はほぼ同じ。 Mery.ini のテキストデータから LineColumnView | : GetIniOption2() 関数は、<code>IO.LoadFromFile()</code> と <code>MeryInfo.GetIniPath()</code> のコードを翻案して作ったものなので、Mery.ini のパスを解決して [[マクロ覚え書き(開発者向け)#ADODB.Stream を利用する|ADODB.Stream で読みこむ]] 処理の部分はほぼ同じ。 Mery.ini のテキストデータから LineColumnView キーの値を検索する方法は異なるが、その部分は「includeライブラリ」を使用したコードの [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec RegExp.exec( str ) メソッド] のほうが速いはず。 | ||
: … | :: ※ GetIniOption2() 関数は [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/search String.search( regexp ) メソッド] と、[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf String.indexOf( searchValue, fromIndex ) メソッド] ×3回でキーの値を取得する。 | ||
: … とはいえど、「includeライブラリ」は多種多様な各クラス同士でのプロパティ(関数)の相互参照により高度に効率化されていて、おいそれとアレンジできない部分がたくさんあるため、素直にインクルードして利用するほうがよいのかも。 | |||
== 投稿した構文ファイル == | == 投稿した構文ファイル == | ||
* [[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 に対応 | ||
| 1,799行目: | 1,635行目: | ||
: Mery の MSY 構文ファイル用 | : Mery の MSY 構文ファイル用 | ||
* [[Mery Macro JS]] (last_modified: | * [[Mery Macro JS]] (last_modified: 2020/06/02) | ||
: マクロの JS ファイル(JScript)用 | : マクロの JS ファイル(JScript)用 | ||
: JavaScript 用構文ファイル/入力補完用辞書/スペルチェック用辞書/おまけマクロ を同梱 | : JavaScript 用構文ファイル/入力補完用辞書/スペルチェック用辞書/おまけマクロ を同梱 | ||
: <span style="color:#c00;"> ※ Web 開発向けのキーワードは未収録 </span> | : <span style="color:#c00;"> ※ Web 開発向けのキーワードは未収録 </span> | ||
: ref. Mery 公式フォーラム 『 [https://www.haijin-boys.com/discussions/3655#discussion-3951 デフォルトの構文定義の拡充について]』 | : ref. Mery 公式フォーラム 『 [https://www.haijin-boys.com/discussions/3655#discussion-3951 デフォルトの構文定義の拡充について]』 | ||
== | == メモ == | ||
=== マーカー設定 === | |||
正規表現でマーカーに登録するさいは、 | |||
<code>ラベル |正規表現</code> | |||
のように並列演算子 <q>|</q> の左側に「題名+全角空白」、右側に正規表現としておくと、マーカーバーが見やすくなる(パフォーマンス的にはよくないかも)。 | |||
* | * いわゆる「プログラミング用フォント」を導入していないので、ゼロ <q>0</q> と '''オー <q>O</q>''' や、イチ <q>1</q> と '''アイ <q>I</q>''' と エル <q>l</q> と バー <q>|</q> を区別できるよう、アイ と オー にマーカーを設定。 | ||
** '''円マーク <q>¥</q>''' (U+00A5) や '''波ダーシ <q>〜</q>''' (U+301C) 他、見分けづらい文字も追加。 | |||
<u> ☑ 大文字小文字を区別 ☑ 正規表現 </u> | |||
< | |||
<code>[OOII]|[¥∖╲〜☓×〇➀-➉]</code> | <code>[OOII]|[¥∖╲〜☓×〇➀-➉]</code> | ||
: ※「半角数字」には、 [ オプション ] の [ 表示 ] 設定でカスタム文字色を設定。 | : ※「半角数字」には、 [ オプション ] の [ 表示 ] 設定でカスタム文字色を設定。 | ||
: ※ 半角バーチカルバー (パイプ) <q>|</q> は、必要に応じて [ 編集モード ] の強調文字列に設定。 | : ※ 半角バーチカルバー (パイプ) <q>|</q> は、必要に応じて [ 編集モード ] の強調文字列に設定。 | ||
: ※ 小文字エル <q>l</q> は、出現頻度が高く、編集モードの登録単語にふくまれていることも多いので強調なし。 | : ※ 小文字エル <q>l</q> は、出現頻度が高く、編集モードの登録単語にふくまれていることも多いので強調なし。 | ||
* 特殊な空白文字用 | * 特殊な空白文字用 | ||
<u> ☑ 大文字小文字を区別 ☑ 正規表現 </u> | ** 「MeiryoKe_Gothic」 フォントで通常の全角/半角空白と区別できない <q>特殊な空白文字</q> と、<q>ゼロ幅空白文字</q>。 | ||
<u> ☑ 大文字小文字を区別 ☑ 正規表現 </u> | |||
<code>特殊な空白文字 |[\x{00A0}\x{2000}-\x{200A}\x{2028}\x{1680}\x{180E}]</code> | <code>特殊な空白文字 |[\x{00A0}\x{2000}-\x{200A}\x{2028}\x{1680}\x{180E}]</code> | ||
<code>ゼロ幅空白文字 |\g<blank>\g<chara>|(?<chara>[\n\s\S])(?<blank>[\x{200B}-\x{200E}\x{2029}\x{202C}\x{202F}\x{205F}\x{2062}\x{2063}\x{FEFF}])</code> | <code>ゼロ幅空白文字 |\g<blank>\g<chara>|(?<chara>[\n\s\S])(?<blank>[\x{200B}-\x{200E}\x{2029}\x{202C}\x{202F}\x{205F}\x{2062}\x{2063}\x{FEFF}])</code> | ||
: ※ 「MeiryoKe_Gothic」 フォントで文字化けして中黒 <q>・</q> で表示されるものや、ゼロ幅結合子は含めていない。 | : ※ 「MeiryoKe_Gothic」 フォントで文字化けして中黒 <q>・</q> で表示されるものや、ゼロ幅結合子は含めていない。 | ||
* /JavaScript の正規表現リテラル用/ | * /JavaScript の正規表現リテラル用/ | ||
<u> ☑ 大文字小文字を区別 ☑ 正規表現 </u> | <u> ☑ 大文字小文字を区別 ☑ 正規表現 </u> | ||
<code>正規表現リテラル |(?<=^|[{(\[= \t])\/(?![*+?|/)\]])[^\r\n\t]*\/[gmi]{0,3}(?=\s*(?:[.,:;})\]]|//|/\*|$))</code> | <code>正規表現リテラル |(?<=^|[{(\[= \t])\/(?![*+?|/)\]])[^\r\n\t]*\/[gmi]{0,3}(?=\s*(?:[.,:;})\]]|//|/\*|$))</code> | ||
: ※ ある程度の誤爆はやむなし。 | : ※ ある程度の誤爆はやむなし。 | ||
スポンサーリンク