自分(もか)がほしいなと思うEditor所有マクロ関数群を提案します。 上のほうが個人的に優先度が高いです。 既存のテクニックも、XPだけなら使えるとか、IE8だとセキュリティで使えないとか PerlScriptならできるとか、そんなのばかりなのでなるべく環境非依存で 皆でマクロを共有できるような追加機能を提案します。 (仮)でないものは、自分で実装する気があるものです。 ■カーソル移動 ・MoveCursorTo(Phy_X, Phy_Y) 指定の論理座標へ移動。移動したかどうかは別 参考:ANSI/CEditView::MoveCursor ・MoveCursorLayoutTo(Lay_X, Lay_Y) 指定のレイアウト座標へ移動。移動したかどうかは別 論理座標では移動できない場所があるので必要 レイアウト座標だけだと、下ほのうの変換関数が必須に。 参考:ANSI/CEditView::MoveCursorProperly ■Sleep ・Sleep(msec) msのお休み。20msから4000msが有効。それ以下・以上は範囲内に切り詰める。 長い場合はBlockingHookを勝手に呼ぶのも検討。 ずっと止められても困る。 ■対ユーザー基本ダイアログ ・InputBox サクラの1行入力の流用/JScriptでめんどくさい ・MessageBox サクラのメッセージボックスを流用 ErrorMessageBox(str):integer [OK] WarnMessageBox(str):integer [OK] InfoMessageBox(str):integer [OK] QuesionMessageBox(str):integer [YES]/[NO] はないので新設 MessageBox(strCaption.strText,intType, Win32直通 ■ファイル関連ダイアログ サクラで使ってるのを流用 ・FileOpenDialog(defFilePathName, types):fileName ・FileSaveDialog(defFilePathName, types):fileName ・DirectoryDialog(defDir):dirName サクラのは新規作成できないけど。ないよりいい キャンセル時は""を戻す。(nullではない) ■ANSI/Unicode対応 ・IsUnicode():integer Unicode版かどうかを返す。Unicode版のANSIビルドでもtrue(1)。ANSI版は0 ・GetNativeLength(str) ANSIならSJIS/UnicodeならUTF-16の長さを返す UnicodeならJScrptのString#lengthと同じ ■指定期間・スコープの値取得・設定・削除 scopeはwindow/document windowはウィンドウ毎ウィンドウを閉じるまで。 documentはウィンドウ毎ファイルを閉じるまで。閉じるか、閉じて開く、開きなおすと消える。 名前をつけて保存では保持する ウィンドウ間/ファイル名毎(例:ブックマーク)、全プロセス設定などは、面倒なので実装しない プラグインの設定保持インターフェイスを活用するか個別にファイルに保存すべき 全プロセス共通、iniなどに保存しない起動中バッファは必要なら検討する 長さ/個数制限は検討中 nameは、AppName.ValueName形式を推奨。階層は自由定義 nameで使用できる文字種は[a-z0-9_.]+以外は拒否するようにするかも ・GetCookie(scopeName, name):string, 無いときは""を返す ・GetCookieDefault(scopeName, name,defaultValue):string ・SetCookie(scopeName, name, value):integer エラー状況 ・DeleteCookie(scopeName, name):integer エラー状況 ・GetCookieNames(scopeName, PrefixName) PrefixNameで始まるnameを,で区切って返す ■クリップボード標準 バイナリの読み書きは想定外。TEXT/OLETEXTは都合により一度Unicodeに変換される "SakuraClip"は未定 ・GetClipBorad():str サクラ標準 ・SetClipBorad(str):integer サクラ標準設定 ■ステータス表示 ・SetStatusMsg(str) ステータスバーか右上にメッセージ表示 ■長時間処理系 ・StartProgress() ステータスバーのプログレスバーを表示・初期設定 ・SetProgress() ステータスバーのプログレスバーの進行状況を設定 ・EndProgress() ステータスバーのプログレスバーを非表示に戻す ・DispatchWindowMessage():integer (BOOL) メッセージ配信。どうなるかは未定義。 通称 DoEvents 参考:ANSI/etc_uty.cpp Unicode/util/window.cpp BlockingHook retval 0: WM_QUITを拾った。速やかにマクロを終了してください retval 1: 続行してもよいです ・ShowCancelDlg():integer (ERROR_NO) キャンセルダイアログをモードレス表示 外部コマンド実行の物を表示 表示できたら0を返す すでに表示されていたら1を返す それ以外は何らかのエラー ・SetCancelDlgMessage(strMessage, strTitle):integer (ERROR_NO) キャンセルダイアログの表示を変更 成功したら0を返す ウィンドウがないなら1を返す(キャンセルされた場合も) それ以外は何らかのエラー ・IsCancelDlgCanceled(): integer(BOOL) 0: キャンセルされていない/ダイアログがそもそもない 1: キャンセルされた ・CloseCancelDlg() キャンセルダイアログを閉じる ■(仮)論理レイアウト座標変換 X,Yまとめたいけど、どうすればいいかわからない ・GetLayoutToPhysicalX(Lay_Y, Lay_X) ・GetLayoutToPhysicalY(Lay_Y, Lay_X) ・GetPhysicalToLayoutX(Phy_Y, Phy_X) ・GetPhysicalToLayoutY(Phy_Y, Phy_X) ・GetLayoutWidth(str) サクラ的に横幅をいくつと見るか調べる TABは行内の位置で変わるので、TAB=1 合成文字の扱いは実装依存 ■(仮)クリップボード種類別 文字コード変換やバイナリが絡むと、PPAとかどうしたらいいかわからないので保留 ・ClearClipBorad():integer クリップボードを空にする。AddClipBoradStringByFormat前に呼ぶ必要がある ・RegistorClipBoradFormat(str): integer clipFormat クリップボードの種類を登録する ・IsAvailableClipBoradFormat(clipFormat:integer) クリップボードの指定のタイプがあるか調べる ・AddClipBoradStringByFormat(clipFormat:integer, str):integer クリップボードに文字列を追加設定。 戻り値未定 ・GetClipBoradStringByFormat(clipFormat:integer):string クリップボードから文字列を取得 改行コードは変換しない ■(仮)現在のタイプ別設定を取得 IsCurTypeExt/IsSameTypeExtで十分かな タイプ別設定から各設定は取得できないが、それはsakura.iniから頑張ってもらう ・GetCurTypeId() 番号。一番上の共通が0 ・GetDocTypeName(id) タイプ名 ・GetDocTypeExts(id) 拡張子一覧 ■(仮)Redoバッファ管理 ・まとめる機能がほしい ・Officeの履歴表示みたいに、それぞれの処理内容が分かる名称もつけられるといい ■(仮)ファイル読み書き 文字コード変換、改行変換、BOM対応のエディタの読み書き互換関数 クラスにしないとまずそうだが拡張が面倒 ・読込クラスはあるのでたぶん使える ・サクラの保存と同じオプションが使える高レベル書き込みクラスがない