利用者:黄身

提供: MeryWiki
2019年12月7日 (土) 18:05時点における黄身 (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

KL

ダウンロード

準備中。

概要

新版のライブラリ。Chakraの使用を前提にkiliを作り直したもの。

マクロ 中身とか注意事項とか
KL.js Selection/Document/Editorの拡張。旧版と異なり、それぞれのラッパオブジェクトとなっているので、Mery組み込みの機能と独自の機能を同じ方法で呼び出せる。
polyfill.js Chakraで実装されていないメソッドなどの拡張。
ArrExt.js
StrExt.js
MathExt.js
それぞれのオブジェクトの拡張。
WidePop.js 旧版に同じ。
ComText.js 旧版のInsetText.jsからマッチング部分だけ抜き出したもの。
InsertOption.js 旧版のInsetText.jsに相当。ComText.jsを使って実現する為のもの。
InsetSearch.js 旧版のFillSearch.jsをComText.jsを使って作り直したもの。
MouseEmurator.js 旧版に同じ。
Commentize.js 旧版に同じ。
MoveSelection.js 旧版に同じ。
Exes 旧版に同じ。

kili

ダウンロード

BitBucket

概要

旧版のライブラリ。

マクロ 中身とか注意事項とか
KILI.js Selection/Documentの拡張がメイン。その他座標などを表す簡易なオブジェクトやグローバルな関数/変数を含む。
グローバルなもの以外はKILIオブジェクト下に存在する。
KILI.code.js 文字・コードポイントの相互変換とその表現を扱う。Unicodeのみが対象。
ArrayEx.js
StringEx.js
NumberEx.js
それぞれのオブジェクトの拡張。
WidePop.js ポップアップ拡張。
InsetText.js キャレット行の検索結果に基づいてテンプレートから文字列を作成・挿入する。
MouseEmurator.js マウスの操作。
Commentize.js コメント化もしくはコメント解除する。
LoopyBookmark.js 最後のブックマークまで来たら最初のブックマークへ移動する。
FillSearch.js 選択文字列をテンプレートにはめ込んで検索する。
MoveSelection.js 選択文字列を移動する。
Exes マクロの実行用ファイル。

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)

InsetText.js

キャレット行の検索結果に基づいてテンプレートから文字列を作成・挿入する。 SSnippet.js・Blockize.js・SmartBreak.jsを統合して一から作り直したもの。 検索条件やテンプレートはJSONで指定する。

機能
  • 複数条件での検索
    • 検索範囲をキャレット行・キャレット位置に基づいて指定可能
  • 編集モードによる絞り込み
  • テンプレートへの検索マッチやキャレット前後・選択部分などの埋め込み
    • 一部分だけも可能
  • インデントの考慮
  • 選択範囲とは違う範囲への挿入
  • 挿入後の選択範囲指定
  • 一致するエントリーが無い場合の代替テンプレート
検索方法
  • (先頭・末尾/選択位置の直前・直後)に一致
  • (選択位置の前後/選択文字列)に(一致/含まれる/長さが一致)
  • 行全体に(含まれる/長さが一致)
  • (選択位置の前後/選択文字列/行全体)を正規表現検索
  • 上記それぞれの否定検索

e.g. 仮に以下の様なinsettext.jsonを用意する。

{
  "entries": [
    {
      "name":"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"
    }
  ],
  "sub":{
    "name":"sub",
    "comment":"一致するものが無ければ単純に改行する",
    "template":"\n"
  }
}

Mery上で

[Tab]fori

というテキストの末尾にキャレットがある時、次のマクロを実行する。

var g=new InsetText("insettext.json").match(false).generated[0];
if(g){
  g.insert();
}
  1. この時InsetTextはJSONファイルのentriesをリスト化し、現在の編集モードが"modes"にあればそのエントリーを検索に使用する。
  2. 検索するメソッドは"InsetText#match"。
  3. 検索条件は"conditions"で指定する。複数指定できるが、全てにマッチした時のみそのエントリーがマッチしたとみなす。検索範囲は現在の行に限る。
  4. "type"は検索方法を指定する。14であれば「選択位置より前の文字列を正規表現検索」する。(この番号はInsetText.SearchTypesを参照)
  5. "text"は検索文字列で、ここでは正規表現パターンになる。「選択位置より前の文字列」が検索範囲で「$」を指定しているので、選択範囲の直前がfori/forj/forkのいずれかであればマッチは成功となる。
  6. マッチが成功すれば、"template"から挿入する文字列を作成する。「{0:8-1,0:8}」は元のテキストの範囲を表し、その部分のテキストをテンプレートに埋め込んで文字列を作成できる。「,」の前は開始位置、後は終了位置を表す。「:」の前はconditionsのインデックスを表す(0始まり)。「:」の後の数字はテキスト中での位置を表す(InsetText.RangeTypes)。「8」はマッチ終了位置を意味する。「-1」はその位置からの差分を表す。なので「{0:8-1,0:8}」は「conditionsの0番目のマッチ終了位置より1文字遡った位置から、conditionsの0番目のマッチ終了位置」までの文字列を表す事になる。つまりマッチした最後の1文字「i」になる。これがテンプレートに埋め込まれて文字列が完成する。
  7. こうして作成された文字列は他の情報と共にInsetText#generatedに追加される。複数のエントリーがマッチする事もあるが、マクロで「match(true)」とすれば1つのエントリーがマッチした時点で強制終了する。どちらにせよInsetText#generatedは配列なのでそこから必要なものを選ぶことになる。
  8. テキストの挿入は"InsetText#generated#insert"で行う。挿入位置は"range"で指定する。指定方法はテンプレートの範囲指定と同じだが、ここでは省略してconditionsのインデックス「0」だけを指定しているので、挿入位置は「conditionsの0番目のマッチ位置全体」になる。
  9. "indent"を指定していれば、挿入する文字列が複数行の場合に、1行目に合わせてインデントを追加する。これで上のテキストは次の様になる。
[Tab]for(var i=0;i<.length;i++){
[Tab][Tab]
[Tab]}

なお、テンプレート中の「{s}」「{e}」は挿入後の選択範囲を表す。ここでは「{s}」のみ指定しているので、「.length」の前にキャレットが移動する。 どのエントリーもマッチしなかった場合、"sub"に指定したテンプレートから文字列を作成してInsetText#generatedに追加する。"sub"が存在しなければInsetText#generatedは空になり、挿入できる文字列は何もないという事になる。

MouseEmulator.js

Mouse.dll(http://ja.syoubook.info/wsh/wsftemplate/)を利用してマウスの操作や座標の取得をする。

古いもの・非推奨

KeyList.js
簡単なJSON形式のファイル読み書き。あまり汎用には使えない。

InsetText.jsに統合したもの

SSnippet.js
キャレット直前の文字列をキーとして補完する。
Blockize.js
選択部分をテンプレートにはめ込んだブロックを挿入する。
SmartBreak.js
ちょっと賢く改行する。

WidePop.jsに統合したもの

SimplePM.js
テキストと実行コマンドのみからなる単純なPopupMenu。
WidePM.js
いろいろできるPopupMenu。

Events

イベントマクロを使いやすく(?)したもの。 大体のメリットとしては、

  • ポップアップ地獄を回避。
  • イベント編集に必要なファイルは1つだけ。
  • 同じ様な処理にファイルを分けなくていい。
Event.js
イベントを実行するクラス。イベント名に応じてEventMain.jsの関数を呼び出す。また例外メッセージをアウトプットに投げている。
EventMain.js
イベントで実行される関数のファイル。イベントの編集はこのファイルをいじるだけでいい。
EventTemplate.js
1つのファイルで通常とイベントと両方のマクロに利用できるようするテンプレート。
「On~」で始まるファイル
Meryでイベントとして登録するファイル。Event.executeを呼び出すだけ。
EventMethod.js
イベント用に作った関数。

ダウンロード

BitBucket

覚え書き

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は無効。

スポンサーリンク