利用者:Sukemaru

提供: MeryWiki
2019年8月27日 (火) 17:00時点におけるSukemaru (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

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

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

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



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

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



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

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


「検索・置換」 カテゴリ

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


検索ジャンプ 【include版】


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

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


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

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



ブックマークを復元


「その他」 カテゴリ

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




sukemaru 自作マクロについて

  • sukemaru の Mery 運用環境はロースペックの Windows XP sp3 (32bit), JScript 5.8.20587 のノート PC です。
    ※ 制作したマクロの動作テストは、この XP 機でしかおこなっていません。
    ※ マクロの動作テストに使用している Mery のバージョンは、最新の "ベータ版" (または最新の "正式版" ver. 2.6.7) のみです。基本的に ver 2.6.7 以降のバージョンで動作するように作成していますので、ver 2.6.6 以前のバージョンでの利用を想定していません(2.6.6 以下での動作確認をしていません)。
    ※ ZIP 版の Mery でマクロを作成・運用しているので、インストーラ版では正しく動作しないマクロがあるかもしれません。
    ※ 開発環境が Windows XP なので、変数はすべて var で宣言し、JScript 5.8 の環境で実行できるようにコーディングしています。
  • Mery のオプション設定で「行の表示方法=論理座標(論理行)」の状態で運用する前提でマクロを作っています。公開しているマクロでは、「表示座標(表示行)」ベースで Mery を運用している場合でも利用できるように設定項目(変数)を設けるか「行の表示方法」を自動判定するコードを追加していますが、動作が不完全になったり処理がおそくなったりすることがあります。
    ※「表示座標(表示行)」ベースでの動作テストはほとんどしていません。
  • ソースコード内ではしばしば unicode 文字を使用していますので、マクロの JS ファイルは UTF-8 形式で保存する前提となっています。
  • ソースコード内の変数名の検索などで「ポップアップメニューで検索先にジャンプ」マクロを利用しやすいように、コードには半角空白を多用しています。
  • 変数名は頭文字が小文字の camelCase に、関数名は頭文字が大文字の TitleCase にしてあります。
  • include ライブラリ (作成: ks 氏)」を利用する【include 版】と利用しない【通常版】とがあるマクロでは、include 版を優先的にメンテ・更新しています。
  • 外部実行ファイル「GetKeyState.exe (作成: pizz 氏)」の導入が必要なものもあります。[2]
  • ポップアップメニューマクロの「設定変更サブメニュー」など、複数のマクロで共通の自作関数を使用しているものがありますが、当面は「include ライブラリ」のような外部ファイルにまとめる予定なしです。
    ※ すでに公開しているマクロが多いこと、公開用と自家用とでコードの内容がちがうマクロが複数あること、それぞれのマクロごとに関数のコードに改変をくわえていることなどの理由で、関数・クラスを統一しなおして更新メンテするのが困難。


マクロ覚え書き

リンク

アイコン化したマクロ

通常、フォーカスがアウトプットバーやアウトラインペイン、検索/置換ダイアログにあると、ポップアップメニューやショートカットキーからマクロを起動することはできない。
Document オブジェクトのかわりに Editor.ActiveDocument で記述したマクロであれば、エディタ領域にフォーカスがない場合でもツールバーアイコンやマクロメニューからマクロを起動できる。
ただし、アクティブなタブ以外を操作・編集するマクロにおいては Editor.Documents.Item( dd ) などのような記述が必要。

ポップアップメニュー

  • PopupMenu.Add() メソッドの第三引数 Flags : int を数値化すると
meMenuChecked	= 1
meMenuGrayed	= 2
meMenuChecked + meMenuGrayed = 3
meMenuSeparator	= 4
となるので、真偽値が true=1 / false=0 で評価されることを利用して、真偽値を返す変数や条件式を代入することができる(ただし Number 型に変換する必要がある)。
var menu = CreatePopupMenu();
var hoge = true;
var fuga = false;

menu.Add( "Hoge", 1, + hoge );		// "+" を付けて数値化すると meMenuChecked
menu.Add( "Fuga", 2, !fuga * 2 );	// (!fuga = 1) *2 なので meMenuGrayed
var num = menu.Track( mePosMouse );
  • for 文などのループ処理によって配列からポップアップメニューのアイテムを生成する場合に、 PopupMenu.Add() メソッドの第二引数 Id (※通常は 1 ~ )と配列のアイテムのインデックス [i] の値(※通常は 0 ~ )を一致させたいときは、配列の先頭にダミーまたは空の要素を置いておき、ループ処理の開始インデックスを 1 にする。
var a = new Array( "" );		// 先頭に空のダミー要素を入れておく
a.push( "あああ" );
a.push( "いいい" );
a.push( "ううう" );
// a = [ "", "あああ", "いいい", "ううう" ] となる

var menuA = CreatePopupMenu();
for ( var i = 1; i < a.length; i ++ ) {	// 開始値を 1 にすると
  menuA.Add( a[i], i );					// Id を ( i + 1 ) にする必要がない
}
var num = menuA.Track( mePosMouse );

// c.f. 空要素なしの配列 [ "あああ", "いいい", "ううう" ] をループ処理する場合
var b = [ "あああ", "いいい", "ううう" ];
var menuB = CreatePopupMenu();
for ( var i = 0; i < b.length; i ++ ) {
  menuB.Add( b[i], i + 1 );				// Id を 1 ~ にするには ( i + 1 )
}

選択範囲の 先頭位置/末尾位置

選択範囲の 開始(キャレットなし)/終了(キャレットあり) の位置は Selection.GetAnchorPos() と Selection.GetActivePos() とで取得できるが、先頭/末尾 の位置はそれらをもとにして前後関係を割りだす必要がある。

var ancPos = Document.Selection.GetAnchorPos();	// 選択開始位置
var actPos = Document.Selection.GetActivePos();	// 選択終了位置(キャレット位置)

var topPos = Math.min( ancPos, actPos );		// 選択範囲の先頭位置
var endPos = Math.max( ancPos, actPos );		// 選択範囲の末尾位置

スクロール位置の調整

キャレットをジャンプさせた後のスクロール位置とキャレット位置は、移動した行数がエディタの表示領域の高さに収まるかどうか(スクロールマージンの考慮が必要)とジャンプ方向によるので安定的ではない。
以下のコードは、ジャンプ後にエディタの表示領域がスクロールした場合に、キャレットが表示領域の先頭位置になるように調整するもの。

var s = Document.Selection;
var ax = s.GetActivePointX( mePosLogical );		// キャレット位置の X
var ay = s.GetActivePointY( mePosLogical );		// キャレット位置の Y
var sy = ScrollY;	// エディタ表示領域の先頭行(物理行番号+スクロールマージン)

// 下方向に10行(論理行)ジャンプ
s.SetActivePoint( mePosLogical, ax, ay + 10 );

// スクロールしないならそのまま / スクロールするならキャレットは表示領域の先頭に
ScrollY = ( ScrollY == sy )
            ? sy
            : s.GetActivePointY( mePosView );

// つねにジャンプ先の行が先頭になるようスクロールさせるなら
// ScrollY = s.GetActivePointY( mePosView );

カレントディレクトリ

カレントディレクトリは、Mery を起動したときに決定され、一定ではない。
記述の都合上で相対パスを利用するマクロにおいては特定のカレントディレクトリの指定が必要な場合もあるが、あえて「流動的なカレントディレクトリ」を利用するようなマクロがほかにある(かも知れない)ことを考慮しておいたほうがよい(…とおもう)。

var fso = new ActiveXObject( "Scripting.FileSystemObject" );
var wshShell = new ActiveXObject( "WScript.Shell" );

var meryIni = Editor.FullName.replace( /exe$/, "ini" );

if ( fso.FileExists( meryIni ) ) {
  // メモ帳で Mery.ini を開く
  wshShell.Run( "notepad \"" + meryIni + "\"" );
}
else {
  // マクロ実行前の作業フォルダを保存
  var currentDir = wshShell.CurrentDirectory;

  // 相対パス解決のためにカレントディレクトリを設定		e.g. %AppData%\Mery
  wshShell.CurrentDirectory = wshShell.SpecialFolders( "APPDATA" ) + "\\Mery";
  wshShell.Run( "notepad " + "Mery.ini" );
  
  // マクロ実行前の作業フォルダを復帰
  wshShell.CurrentDirectory = currentDir;
}

バージョンチェック

Mery ベータ版で追加されたマクロ用プロパティを利用する場合は、マクロの動作要件として Mery 本体のバージョンチェックをするのが無難である。
JavaScript には特定のプロパティがオブジェクト配下に定義されているかを調べる方法が色々とあるが、専用の組み込み関数 VersionCheck() を利用すれば Mery のバージョン番号を指定してのチェックができる。

外部リソースのチェック

#include "include/IO.js"

のようなプリフィクスがソースコードの先頭で宣言されていれば問題ないが、include ライブラリ がなくても、プリフィクスを削除(コメントアウト)すればマクロがある程度動くようにコーディングすることもできる。

if ( typeof IO == "object" ) {
  /* IO.js がインクルードされているときの動作 */ ;
}
else {
  /* IO.js がインクルードされていないときの動作 */ ;
}

また、GetKeyState.exe のあるなしで動作内容を分けるなら、以下のようにコードを記述すればよい。

// あらかじめ変数 ctrl に 0 を代入しておく
var ctrl = 0;

// GetKeyState.exe のパスで実行ファイルの実在確認をする
var getKeyState = editor.FullName.replace( /mery\.exe$/i , "" )
                + "Macros\\GetKeyState.exe";
if ( new ActiveXObject( "Scripting.FileSystemObject" ).FileExists( getKeyState ) ) {
  // GetKeyState.exe からの戻り値(Ctrl キーの押し下げ状態)を取得する
  var WshShell = new ActiveXObject( "WScript.Shell" );
  ctrl = WshShell.Run( "\"" + getKeyState + "\" control", 0, true );
}

if ( ctrl == 1 ) {
  /* GetKeyState.exe があり、Ctrl キーが押されているとき */ ;
}
else {
  /* GetKeyState.exe がない、または Ctrl キーが押されていないとき */ ;
}


投稿した構文ファイル

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


スクショ

マクロバーのアイコン化

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

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


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

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

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

スポンサーリンク