思いつくままに作ってるので、役に立つかどうかは二の次三の次。
覚え書き
- OnDocumentCloseで閉じたタブをもう一度開こうとすると
以下のNewFileで開いたタブを閉じるとき、定期的?にonDocumentCloseが呼ばれない。またOpenFileは何回かに一回しか成功しない。
var file="";
Editor.NewFile();
Editor.OpenFile(file,meEncodingUTF16LE,false);
OnModifiedなどでは問題ない。
- コマンドラインオプションからマクロ実行
Window.PromptとWindow.Confirmは実行できない。
- Document.GetLine
デフォルトでは表示行を取得。meGetLineLogicalが未定義なので0を指定する。
- 最初の数
- 行:1 (Document.GetLine)
- 文頭からの位置:0 (Selection.GetActivePos)
- 桁:1 (Selection.GetActivePointX)
- Editor,Document:0 (Editors.Item.Documents.Item)
- Window.Document
Document.NewFile後も更新されない。
Editor.ActiveDocument.NewFile();
Alert(Document.Text);
- Editor.FindInFiles
- ディレクトリ名は最後を"\\"か"\\*"にする。
- アクティブな文書が結果表示で乗っ取られる。
- PopupMenu.Track
- 引数無しだとエラー。0でキャレット位置に表示。mePosMouseは1。
- キャンセルした場合の返り値は0。
- 返り値を変数に入れるなりOutputするなりしないとメニューは表示されない。
- 領域外をクリックしてキャンセルした場合、続けてTrackしていても実行されない。Escでだとされる。
var p=CreatePopupMenu();
p.Add("1");
var x=p.Track(0); //ここでキャンセル
if(x==0){
x=p.Track(0);
}
- Selection.Replace
検索オプションを何も付けたくない場合はflagに0を指定する。
//正規表現を使わず、大文字と小文字を区別せず、カーソル位置の次の一つだけ、単語の途中でもマッチする
Selection.Replace("x","y",0);
検索文字列が0x000aから始まるとき、meFindReplaceRegExpを指定しないと、meReplaceAllがおかしい。
Selection.Replace("\n","",meReplaceAll); //文書全体の最初の1つだけ処理される
Selection.Replace(";\n","",meReplaceAll); //全て処理される
Selection.Replace("\n;","",meReplaceAll); //文書全体の最初の1つだけ処理される
- Document.Text
代入する場合、設定上の改行コードに関わらず、改行記号は文字列中の改行によって変わる。これがSelection.Textだと変わらない。
Document.Text=Document.Text; //改行記号はLFになる
Selection.SelectAll();
Selection.Text=Selection.Text; //元のまま
- Selection.CharLeft,CharRight,LineUp,LineDown
Countが0の時は1と同じ。負の場合、逆方向に移動。
- Selection.Find
正規表現の時meFindReplaceOnlyWordは無効。
マクロファイル
全てBitBucketで公開中。 たいていの場合Exesフォルダに実行用ファイルがあるので、Meryからはそちらを登録すること。
| マクロ | 中身とか注意事項とか |
|---|---|
| KILI | KILI.js KILI.code.js ArrayEx.js StringEx.js NumberEx.js WidePop.js MouseEmurator.js |
| Commentize.js | コメント化もしくはコメント解除する。 |
| LoopyBookmark.js | 最後のブックマークまで来たら最初のブックマークへ移動する。 |
| FillSearch.js | 選択文字列をテンプレートにはめ込んで検索する。 |
| MoveSelection.js | 選択文字列を移動する。 |
| InsetText.js | キャレット行の検索結果に基づいてテンプレートから文字列を作成・挿入する。 |
| Event | BitBucket |
KILI.js
グローバルに用意しているのはこの「KILI」名前空間と次の項に挙げたいくつかのみ。
クラス
- Point
- 座標を表す。今のところx,yが含まれているだけ。
- Range
- 選択範囲を表す。
- Direction
- 選択方向を表す。
- Coordinate
- 座標系を表す。
- LineMode
- 単位として扱う行を表す。
グローバルなもの
あまりにもよく使ってるので特別にグローバルに用意。よほどの事がない限りこれ以上増やさない。
| GDO | Documentを取得。 |
| GEO | Editorを取得。 |
| GSO | Selectionを取得。 |
| O | OutputBar.Writeln()へのショートカット。 |
| Seiko | 時間を計測する。 |
| meGetLineLogical | 有りそうで無い変数。 |
| mePosCaret | 有りそうで無い変数。 |
KILI.selex
Selection拡張。KILI.editと違い、文書は編集されない。
- 位置を判定するもの
| atLogicalHead | 論理行頭 |
| atLogicalEnd | 論理行末 |
| atViewHead | 表示行頭 |
| atViewEnd | 表示行末 |
| atEOF | 文末 |
- 位置を取得するもの
| getRange | 選択範囲 |
| getBottomPos | 文末側位置 |
| getTopPos | 文頭側位置 |
| getAnchorPoint | 選択終了位置 |
| getActivePoint | 選択開始位置 |
| getBottomPoint | 文末側位置 |
| getTopPoint | 文頭側位置 |
| getLogicalHeadPos | 全ての論理行頭 |
| getLogicalEndPos | 全ての論理行末 |
| getWrapPos | 全ての折り返し位置 |
| getViewHeadPos | 全ての表示行頭 |
| getViewEndPos | 全ての表示行末 |
- 文字列を取得するもの
| getLeft | 選択範囲より左 |
| getRight | 選択範囲より右 |
- 座標を変換するもの
| logicalToView | 論理行→表示行 |
| logicalToPos | 論理行→文頭から |
| posToLogical | 文頭から→論理行 |
| posToView | 文頭から→表示行 |
| viewToLogical | 表示行→論理行 |
| viewToPos | 表示行→文頭から |
- 選択するもの
| selectLine | 複数行 |
| selectLines | 複数行 |
| selectIfEmpty | 選択されていなければ選択 |
| setRange | 範囲 |
| reverse | 反転 |
| excludeBreak | 改行を除外 |
- 選択状態を判定するもの
| inline | 行内 |
| multiline | 複数行 |
| wholeLines | 行全体 |
| getDirection | 選択方向 |
- 検索するもの
| search | 検索 |
| searchTextLines | 行を検索 |
| count | マッチ数 |
KILI.edit
Selection拡張。KILI.selexと違い、文書は編集される。
| duplicate | 二重化 |
| sort | 並べ替え |
| deleteLines | 行削除 |
| deleteAll | 文字列を全て削除 |
| deleteAllTextLines | 文字列を含む行を削除 |
| breakAll | 文字列を改行に変換 |
KILI.docex
Document拡張。Editorの領分と思われるものも含む。
あまり仕様が固まってないので激変の可能性あり。
| all | 全て取得 |
| newFile | 新規作成 |
| clone | 複製 |
| cloneStyle | スタイルを指定して複製 |
| getINI | 設定ファイルを取得 |
| forceClose | 強制的に閉じる |
| getScroll | スクロール位置を取得 |
| setScroll | スクロール位置を指定 |
| getBreakCode | 改行コードを取得 |
KILI.code.js
文字・コードポイントの相互変換とその表現を扱う。Unicodeのみが対象。
| decode | 文字列→コードポイント |
| encode | コードポイント→文字列 |
| decodeAll | 全ての形式→文字列 |
| decodeSurrogate | サロゲートペア→コードポイント |
| encodeSurrogate | コードポイント→サロゲートペア |
| fromCharCode | 0x10000以上にも対応したString.fromCharCode |
| fromEntity | 数値実体参照→文字列 |
| toEntity | 文字列→数値実体参照 |
| fromOnig | 鬼車形式→文字列 |
| toOnig | 文字列→鬼車形式 |
| fromRegex | 正規表現形式→文字列 |
| toRegex | 文字列→正規表現形式 |
| fromUnicode | Unicode形式→文字列 |
| toUnicode | 文字列→Unicode形式 |
組み込みオブジェクト拡張
名前の衝突に注意。特にStringExはincludeライブラリのStringExと衝突しています。
Array
| clone | 値渡し |
| compact | 空白、null、undefinedを削除 |
| remove | 削除 |
| indexOf | 検索 |
| insert | 挿入 |
| last | 最後の要素を取得 |
| select | 条件指定して検索 |
| selectIndex | 条件指定してインデックスを検索 |
| pickup | インデックス指定で取り出す |
| siblings | 指定したプロパティの値を取得 |
| unique | 重複削除 |
Number
| clamp | 範囲内に収める |
| within | 範囲内にあるか判定 |
| padding | 桁揃え |
| toHexString | 十六進数表記 |
String
| crlf | 改行コード変換 |
| cut | 分割 |
| unhead | 文字列で始まらないようにする |
| untail | 文字列で終わらないようにする |
| dquote | 「"」で囲む |
| squote | 「'」で囲む |
| enclose | 囲む |
| enclosed | 文字列で囲まれているか判定 |
| insert | 挿入 |
| repeat | 繰り返し |
| startsWith | 文字列で始まっているか判定 |
| endsWith | 文字列で終わっているか判定 |
| escape | エスケープ |
| unescape | エスケープを戻す |
| escapeRegExp | 正規表現用エスケープ |
| unescapeRegExp | 正規表現用エスケープを戻す |
| head | 文字列で始まるようにする |
| tail | 文字列で終わるようにする |
| onigFind | 鬼車で検索(KILI.js内に記載) |
InsetText.js
キャレット行の検索結果に基づいてテンプレートから文字列を作成・挿入する。 SSnippet.js・Blockize.js・SmartBreak.jsを統合して一から作り直したもの。 検索条件やテンプレートはJSONで指定する。
- 機能
- 複数条件での検索
- 検索範囲をキャレット行・キャレット位置に基づいて指定可能
- 編集モードによる絞り込み
- テンプレートへの検索マッチやキャレット前後・選択部分などの埋め込み
- 一部分だけも可能
- インデントの考慮
- 選択範囲とは違う範囲への挿入
- 挿入後の選択範囲指定
- 一致するエントリーが無い場合の代替テンプレート
- 検索方法
否定検索も可能。
- 先頭・末尾に一致
- 選択位置の直前・直後に一致
- 選択位置より前・後の文字列に一致
- 選択文字列に一致
- 選択位置より前・後の文字列の長さが一致
- 選択文字列の長さが一致
- 選択位置より前・後の文字列に含まれる
- 選択文字列に含まれる
- 選択位置より前・後の文字列を正規表現検索
- 選択文字列を正規表現検索する
- 行全体の長さが一致する
- 行全体に含まれる
- 行全体を正規表現検索する
e.g.
var g=new InsetText(ScriptFullName.split("\\").slice(0,-1).join("\\")+"\\insettext.json").match(false).generated[0];
if(g){
g.insert();
}
{
"entries": [
{
"name":"for",
"comment":"forスニペット(カウンタも指定)",
"template":"for(var {0:8-1,0:8}=0;{0:8-1,0:8}<{s}.length;{0:8-1,0:8}++){\n\t\n}",
"indent":true,
"modes":["JavaScript","C#","C++","Java"],
"conditions":[
{
"type":14,
"text":"for[ijk]$"
}
],
"range":"0"
},
{
"name":"block",
"comment":"ブロックを作成",
"template":"\n\t{0:7,0:8-1}{s}\n}",
"indent":true,
"modes":["JavaScript"],
"conditions":[
{
"type":3,
"text":"{"
}
],
"range":"0"
},
{
"name":"block",
"comment":"ブロックを作成(キャレットより後に}があれば利用する)",
"template":"\n\t{0:8,1:8-1}{s}\n",
"indent":true,
"modes":["JavaScript"],
"conditions":[
{
"type":3,
"text":"{"
},
{
"type":15,
"text":"[^\\}]*\\}"
}
],
"range":"0:8,1:8-1",
"weight":1
},
{
"name":"block comment",
"comment":"ブロックコメント",
"template":"\n* {4,6}{s}",
"indent":true,
"modes":["JavaScript"],
"conditions":[
{
"type":14,
"text":"^/?\\*"
},
{
"type":-11,
"text":"*/"
}
],
"range":"4,6",
"weight":1
},
{
"name":"trim",
"comment":"右トリム",
"template":"",
"conditions":[
{
"type":15,
"text":"[\\s]+$",
"spaces":true
}
],
"range":"0"
},
{
"name":"indent",
"comment":"Python用インデント"
"template":"\n\t",
"indent":true,
"modes":["Python"],
"conditions":[
{
"type":3,
"text":":"
}
]
}
],
"sub":{
"name":"sub",
"comment":"一致するものが無ければ単純に改行する",
"template":"\n"
}
}
WidePop.js
拡張PopupMenu。機能は以下の通り。
- 配列のみでのメニュー定義
- チェックボックス
- ラジオボタン
- チェック、有効・無効の切り換え
- サブメニュー
- 選択時にコマンド実行
- MouseEmurator.jsを利用してメニューの位置を一定にする
e.g.
var menu=[
["a",1,function(pop,me){Alert(me.tags[0]);},null,["A","a"]],
[], //区切り線
["b",20], //チェック&グループ開始
["c",4], //"b"がチェック済みなのでチェックされない
["d",4], //次のflagが0なのでここでグループ終了
["e",1,function(pop,me){return this.caption},[
["-a",2,"e-a"], //チェックボックス
["-b",1,function(pop,me){return pop.getItemById(me.parent).command()+me.caption}],
["-c",1,"unalbled"]
]],
["f",0] //無効になっている
];
var p=new WidePop(menu);
p.getItemFromPosition(5,2).enabled=false;
p.check(1,function(pos,me){return me.caption=="-a"});
p.create().track(0,true);
Alert(p.getResult().value)
MouseEmulator.js
Mouse.dll(http://ja.syoubook.info/wsh/wsftemplate/)を利用してマウスの操作や座標の取得をする。
Event関連マクロファイル群
イベントマクロを使いやすく(?)したもの。 大体のメリットとしては、
- ポップアップ地獄を回避。
- イベント編集に必要なファイルは1つだけ。
- 同じ様な処理にファイルを分けなくていい。
- Event.js
- イベントを実行するクラス。イベント名に応じてEventMain.jsの関数を呼び出す。また例外メッセージをアウトプットに投げている。
- EventMain.js
- イベントで実行される関数のファイル。イベントの編集はこのファイルをいじるだけでいい。
- EventTemplate.js
- 1つのファイルで通常とイベントと両方のマクロに利用できるようするテンプレート。
- 「On~」で始まるファイル
- Meryでイベントとして登録するファイル。Event.executeを呼び出すだけ。
- EventMethod.js
- イベント用に作った関数。
古いもの・非推奨
- KeyList.js
- 簡単なJSON形式のファイル読み書き。あまり汎用には使えない。
InsetText.jsに統合したもの
- SSnippet.js
- キャレット直前の文字列をキーとして補完する。
- Blockize.js
- 選択部分をテンプレートにはめ込んだブロックを挿入する。
- SmartBreak.js
- ちょっと賢く改行する。
WidePop.jsに統合したもの
- SimplePM.js
- テキストと実行コマンドのみからなる単純なPopupMenu。
- WidePM.js
- いろいろできるPopupMenu。