JavaScriptツール

miのツールメニュー/ツールバーキーバインドに、テキスト編集を制御するJavaScriptプログラムを記述することが出来ます。

ツールメニュー/ツールバーの場合

ツール名の拡張子を.jsにすると、JavaScriptファイルとして実行します。

キーバインドの場合

「動作」を「JavaScript として実行」に設定し、「挿入文字列」欄にJavaScriptプログラムを記述してください。

サンプルコード

サンプルコードです。

下記の他にも、標準モードのツールのいくつか(「選択範囲の数値を順に+1する」「選択範囲の 16 進数 Unicode を文字に変換」など)はJavaScriptで記述されています。
コピー&ペースト等ご自由にご使用ください。(ツールメニューの項目をoptionキーを押しながら選択すると、中身を参照することができます。)

また、APIの詳細は「API仕様」をご参照ください。

キャレット位置にHello World!を挿入

var doc = mi.getCurrentDocument();
var pos = doc.getCaretPos();
var text = "Hello World!";
doc.setText(pos, pos, text);

mi.getCurrentDocument()で現在ドキュメントオブジェクトを取得し、doc.getCaretPos()で現在のキャレット位置を取得しています。
doc.setText()で、指定範囲のテキストを置き換えています。
なお、doc.setText()はキャレットを移動しません。doc.setCaretPos(pos+text.length);を追加することで挿入文字列の後にキャレット移動できます。

キャレット位置に0〜99の数値をカンマ区切りで挿入

var doc = mi.getCurrentDocument();
var pos = doc.getCaretPos();
for( var n = 0; n < 100; n++ ) {
    var text = n.toString()+",";
    doc.setText(pos, pos, text);
    pos += text.length;
}

選択テキストをダイアログに表示

現在選択中のテキストをダイアログに表示します。

alert(mi.getCurrentDocument().getSelectionText());

getSelectionText()で選択テキストを取得しています。
alert()ダイアログ表示の関数です。confirm(), prompt()も使用可能です。

選択テキストを反転

現在選択中のテキストを反転します。

var doc = mi.getCurrentDocument();
var text = doc.getSelectionText();
var selectionArray = doc.getSelectionRangeArray();
doc.setText(selectionArray[0].start, selectionArray[0].end, text.split("").reverse().join(""));

doc.getSelectionRangeArray()で選択範囲の配列を取得しています。 通常選択の場合は配列の0番目に選択範囲が入っており、start, endプロパティで開始・終了位置を取得できます。(矩形選択・マルチカーソルの場合は1番目以降にも値が格納されます。)start, endプロパティの値はドキュメントの最初からの(文字単位の)indexです。
split(), reverse(), join()はJavaScript組み込みオブジェクトのメソッドです。

選択範囲の行頭にテキストを挿入

選択範囲の各行頭に、ダイアログで入力したテキストを挿入します。

var text = prompt("挿入テキストを入力してください。");
var doc = mi.getCurrentDocument();
var sel = doc.getSelectionRange();
var starty = doc.getTextPointFromPos(sel.start).y;
var endy = doc.getTextPointFromPos(sel.end).y;
for( var y = starty; y <= endy; y++ ) {
    var pos = doc.getPosFromTextPoint(0, y);
    doc.setText(pos, pos, text);
}

prompt()は、ダイアログ表示の関数で、ユーザーが入力したテキストを返します。
getTextPointFromPos()は、ドキュメントの最初からのindexを引数として、各段落内のindexをx、段落をyとするオブジェクトを取得します。
getPosFromTextPoint()はその逆の変換です。

API仕様

miのテキストや各種情報を取得/変更するAPIが使用可能です。
(JavaScriptツールをmiで編集する際、JavaScriptモードのキーワードカテゴリー「mi JavaScript」を有効にすると、APIの関数を色付け・キーワード情報表示することができます。)

miから出力する改行コードはLF("\n")となります。
mi.setOutputLineEndCode("CR");を使用することにより、CRへ変更することが可能です。)

アプリケーションクラス

miアプリケーションに対応するクラスです。
あらかじめ、グローバル変数"mi"にインスタンス(唯一のインスタンス)が生成済みです。

ドキュメント制御

関数説明

getCurrentDocument()

現在編集中のドキュメントオブジェクトを取得します。

コード例:

doc = mi.getCurrentDocument();

createDocument()

新規ドキュメントを生成して、そのドキュメントオブジェクトを取得します。

コード例:

doc = mi.createDocument();

ダイアログの表示

miバージョン3.7以降のみ使用可能。

関数説明

alert(message)

message: String : メッセージ

OKボタンを持つダイアログを表示します。

コード例:

mi.alert("メッセージ");

confirm(message)

message: String : メッセージ
返り値: boolean : OKボタンを押された場合はtrue、それ以外はfalse

OKボタンとCancelボタンを持つダイアログを表示します。

コード例:

if( mi.confirm("メッセージ") === true ) { ... }

→実行結果:ユーザーがOKをクリックしたら{ }内を実行します。

prompt()
prompt(message)
prompt(message, default)

message: String : メッセージ(省略可能)
default: String : 初期文字列(省略可能)
返り値: String : OKボタンを押された場合は入力された文字列、それ以外はnull

1行入力可能なテキストボックスを表示します。

コード例:

var str = mi.prompt("テキストを入力してください。");

→実行結果:strにユーザーが入力した文字列を格納します。

別のJavaScriptファイルの実行

関数説明

loadModule(path)

path: String : 自身からの相対ファイルパス
(キーバインドから実行の場合はツールフォルダのルートからの相対パス)

JavaScriptファイルをロード(スクリプト実行)します。

コード例:

mi.loadModule("./script/jshint.js");

→実行結果:同じフォルダ内のscriptフォルダ内のjshint.jsの内容を実行します。

プラグイン制御

関数説明

registerPlugin(modeName,id, name, defaultEnabled, defaultOptions)

modeName: String: 対象モードの名称
id : String: プラグインのID(他のプラグインと重複しないユニークなID。例:"std.jshint.mimikaki.net")
name : プラグイン名称
defaultEnabled : デフォルトのON/OFF状態
defaultOptions : デフォルトのオプション文字列

プラグインを登録します。
(プラグインの登録の効果は、モードに設定データを作成し、モード設定ウインドウに設定を表示することのみです。イベントリスナーの登録などは、addEventListener()などで行います。)

コード例:

mi.registerPlugin(modeName,"std.jshint.mimikaki.net","JSHINT",false,"");

setPluginDisplayName(modeName,id,lang,displayName)

modeName: String: 対象モードの名称
id : String: プラグインのID
lang : String: 言語名(現状、"ja"のみ対応)
displayName : 表示名

プラグインの英語以外での表示名を設定します。

コード例:

mi.setPluginDisplayName(modeName,pluginId,"ja","JSHINT (JavaScript 文法チェック)");

getPluginEnabled(modeName,id)

modeName: String: 対象モードの名称
id : String: プラグインのID

このプラグインがONに設定されているかどうかを取得します。
プラグインのON/OFFは、モード設定「詳細」タブの「プラグイン」のリストで設定できます。

コード例:

if( mi.getPluginEnabled(modeName,pluginId) === true ) { 
(イベントリスナー登録などの処理) }

getPluginOptions(modeName,id)

modeName: String: 対象モードの名称
id : String: プラグインのID
返り値: String

このプラグインのオプション文字列を取得します。
プラグインのオプション文字列は、モード設定「詳細」タブの「プラグイン」のリストの「オプション文字列」の列で設定できます。

コード例:

str = mi.getPluginOptions(doc.getModeName(), "my_plugin_id");

getCurrentModeNameForPluginLoad()

現在ロード中の対象モードの名称を取得します。プラグインロード処理内でのみ使用可能です。

コード例:

modeName = mi.getCurrentModeNameForPluginLoad();

イベントリスナー制御

関数説明

addEventListener(modeName, id, events, fn)

modeName: String: 対象モードの名称
id : String: プラグインのID
events : Array of String : 対象イベント
fn : function(doc, event, parameter) : イベントリスナー

ドキュメント保存等のイベント発生時にコールされる関数(イベントリスナー)を登録します。
※内部的にremoveEventListeners()を実行しているため、指定プラグインIDに対応する既存のイベントリスナーは登録解除されます。

コード例:

mi.addEventListener(modeName, pluginId, ["onSaved", "onOpened"],
function(doc, event, parameter) {
(処理)}

removeEventListeners(modeName, id)

modeName: String: 対象モードの名称
id : String: プラグインのID

イベントリスナーを登録解除します。
指定プラグインIDに対応するイベントリスナーが全て登録解除されます。

イベントリスナー(イベント発生時にコールされる関数)

function(doc, event, parameter)
doc: ドキュメントオブジェクト
event: イベント名
parameter: パラメータ(現在のバージョンでは、必ず空文字列です。)

イベントリスナーは、イベント発生時に左記のパラメータでmiからコールされます。

イベントの種類

イベント名パラメータ発生するタイミング

onOpened

空文字列

ドキュメントをオープンしたとき

onSaved

空文字列

ドキュメントを保存したとき

その他

関数説明

setOutputLineEndCode(s)

s: "CR" または "LF"

getText()等で得られる文字列の改行コードをCR、または、LFに変更します。
デフォルトはLFです。

※miバージョン3.6以前ではCRとなっていました。CRであることが必要な場合、下記のコードをツールの最初に記述することにより、以前の動作に合わせることができます。お手数をおかけして大変申し訳ありません。

mi.setOutputLineEndCode("CR");

outputToStderr(text)

text: String: テキスト

標準エラー出力にテキストを出力します。

コード例:

mi.outputToStderr("test");

ドキュメントクラス

ドキュメントに対応するクラスです。

テキスト編集

関数説明

getText(start, end)

start : Number: 開始位置(0始まり)
end : Number: 終了位置(0始まり)
返り値 : String

指定範囲のテキストを取得します。
(出力改行コードはLFです。)

コード例:

text = doc.getText(s,e);

setText(start, end, text)

start : Number: 開始位置(0始まり)
end : Number: 終了位置(0始まり)
text : String: テキスト

指定範囲にテキストを設定します。
(入力改行コードはLFまたはCRです。どちらでも改行として認識します。)

コード例:

doc.setText(start,end,"abc");

getTextPointFromPos(pos)

pos : Number: テキスト挿入位置(0始まり)
返り値 : オブジェクト(x:Number, y:Number)

テキスト挿入位置から、テキストポイントを取得します。

コード例:

textpt = doc.getTextPointFromPos(textindex);

getPosFromTextPoint(x, y)

x : Number: 段落内のテキスト挿入位置(0始まり)
y : Number: 段落番号(0始まり)
返り値 : Number

テキストポイントから、テキスト挿入位置を取得します。

コード例:

textindex = doc.getPosFromTextPoint(textpt.x,textpt.y);

ドキュメント全体の編集

関数説明

getLength()

返り値 : Number

ドキュメントの文字数を取得します。

コード例:

len = doc.getLength();

getContent()

返り値 : String

ドキュメント全体のテキストを取得します。
(出力改行コードはLFです。)

コード例:

text = doc.getContent();

setContent(text)

text : String: テキスト

ドキュメント全体にテキストを設定します。
(入力改行コードはLFまたはCRです。どちらでも改行として認識します。)

コード例:

doc.setContent("abc");

段落

関数説明

getParagraphCount()

返り値 : Number

ドキュメントの段落数を取得します。

コード例:

paraCount = doc.getParagraphCount();

getParagraphRange(paraindex)

paraindex : Number: 段落のインデックス(0始まり)
返り値 : オブジェクト(start:Number, end:Number)

段落の範囲を取得します。
(改行コードを含みます。)

コード例:

pararange = doc.getParagraphRange(0);

getParagraphText(paraindex)

paraindex : Number: 段落のインデックス(0始まり)
返り値 : String

段落のテキストを取得します。
(改行コードを含みます。出力改行コードはLFです。)

コード例:

paratext = doc.getParagraphText(0);

setParagraphText(paraindex, text)

paraindex : Number: 段落番号(0始まり)
text : String: テキスト

段落にテキストを設定します。
(入力改行コードはLFまたはCRです。どちらでも改行として認識します。)

コード例:

doc.setParagraphText(paraindex,"abc\n");

選択範囲・キャレット

関数説明

getSelectionRange()
getSelectionRange(selindex)

selindex : 選択範囲のインデックス(0始まり)(省略可)
返り値 : オブジェクト(start:Number, end:Number)

現在の選択範囲を取得します。(矩形選択・マルチカーソルの場合、複数の選択範囲が存在します。)

コード例:

sel = doc.getSelectionRange();

getSelectionRangeArray()

返り値 : Array of オブジェクト(start:Number, end:Number)

現在の選択範囲の配列を取得します。(矩形選択・マルチカーソルの場合、複数の選択範囲が存在します。)

コード例:

selarray = doc.getSelectionRangeArray();

getSelectionCount()

返り値 : Number

現在の選択範囲の個数を取得します。(矩形選択・マルチカーソルの場合、複数の選択範囲が存在します。)

コード例:

selcount = doc.getSelectionCount();

getSelectionText()

返り値 : String

現在の選択範囲のテキストを取得します。
(出力改行コードはLFです。)

コード例:

text = doc.getSelectionText();

setSelectionRange(start, end)

start : Number: 開始位置(0始まり)
end : Number: 終了位置(0始まり)

選択範囲を設定します。
(入力改行コードはLFまたはCRです。どちらでも改行として認識します。)

コード例:

doc.setSelectionRange(start,end);

getCaretPos()

返り値: Number

現在のキャレット位置を取得します。
mi.getSelectionRange().startと同等です。

コード例:

pos = doc.getCaretPos();

setCaretPos(pos)

pos: Number: テキスト挿入位置

現在のキャレット位置を設定します。
mi.setSelectionRange(pos,pos)と同等です。

コード例:

doc.setCaretPos(pos);

ドキュメント情報

関数説明

getModeName()

返り値: String

ドキュメントのモード名を取得します。

コード例:

modeName = doc.getModeName();

getURL()

返り値: String

ドキュメントファイルのURLを取得します。

コード例:

url = doc.getURL();

文法チェッカー

関数説明

clearSyntaxCheckerWarnings()

文法チェッカーワーニングを全て消去します。

コード例:

doc.clearSyntaxCheckerWarnings();

addSyntaxCheckerWarning(para, col, title, detail, type, displayInTextView)

para : Number : 段落番号
col : Number : 段落内の文字挿入位置(0始まり)
title : String : ワーニングタイトル
detail : String : ワーニング内容
type : Number : タイプ(1: Information, 2: Warning, 3: Error)
displayInTextView : Boolean : テキストビュー内にもワーニング表示するかどうか

文法チェッカーワーニングを追加します。

コード例:

doc.addSyntaxCheckerWarning(lineIndex,colIndex,reason,detail,2,true);

プレビュー

関数説明

setPreviewHTML(htmlText)

htmlText: String: HTMLテキスト

プレビューサブウインドウへ表示するHTMLを設定します。
設定されたHTMLはツールコマンドBROWSEにも使用されます。

コード例:

doc.setPreviewHTML(htmlText);

その他

関数説明

setDocInfoText(text)

text: String: 情報テキスト

テキスト情報ウインドウに表示するテキストを設定します。

コード例:

doc.setDocInfoText("情報");

(旧)ダイアログの表示

miバージョン3.7より、一般的なダイアログ表示関数の仕様に合わせた、alert(), confirm(), prompt()を新規追加しました。
バージョン3.6以前のshowDialog()も、互換性のため残していますが、alert(), confirm(), prompt()の方を推奨します。

関数説明

showDialog(title, message)

title: String : タイトル
message: String : メッセージ

OKボタンを持つダイアログを表示します。
(ダイアログの左下に、ツール実行を中断するボタンも表示されます。)

コード例:

mi.showDialog("タイトル","メッセージ");

showDialog(title, message, okButton)

title: String : タイトル
message: String : メッセージ
okButton: String : OKボタンのタイトル

OKボタンを持つダイアログを表示します。
OKボタンのタイトルを指定できます。
(ダイアログの左下に、ツール実行を中断するボタンも表示されます。)

コード例:

mi.showDialog("タイトル","メッセージ","おっけー");

showDialog(title, message, okButton, cancelButton)

title: String : タイトル
message: String : メッセージ
okButton: String : OKボタンのタイトル
cancelButton: String : Cancelボタンのタイトル
返り値: String : クリックされたボタンのタイトル

OK, Cancelボタンを持つダイアログを表示します。
OK, Cancelボタンのタイトルを指定できます。
(ダイアログの左下に、ツール実行を中断するボタンも表示されます。)

コード例:

if( mi.showDialog("タイトル","メッセージ","続行","キャンセル") == "キャンセル" )   break;

→実行結果:ユーザーがキャンセルをクリックしたらbreakします。

JavaScriptプラグイン

miのプラグインを、JavaScriptで記述することが出来ます。
拡張子.jsのファイルをモード設定フォルダの"plugins"フォルダに格納することで、mi起動時に自動的に実行されます。
このプラグインファイルに、イベントリスナーを登録するコードを記述することで、ファイルオープン時や保存時に 特定のJavaScriptコードを実行することが出来ます。

プラグインのON/OFF、オプション文字列は、モード設定の詳細タブで設定できます。

サンプル

デフォルトで添付されているプラグインです。コピー&ペースト等ご自由にご使用ください。
(使用しているライブラリについては、それぞれのライセンスに従ってください。)
ファイルはmiアプリパッケージ内のmi.app/Contents/Resources/default/(モード名)/pluginsフォルダにもあります。

Markdown用プレビュー

preview.js

Markdownモードで、プレビューを表示するプラグインです。
ファイルオープン/保存時にHTMLへ変換してプレビューに設定するイベントリスナーを登録しています。
marked.parse()は、marked.jsの関数です。

JSHINT

syntaxchecker_jshint.js

JavaScriptモードで、文法エラーチェックツール(JSHint)の結果を表示するプラグインです。
ファイルオープン/保存時にチェックを実行するイベントリスナーを登録しています。
JSHINT()は、JSHintの関数です。