ExecuteScript

出典: FlashDevelop.jp

マクロのコマンドの一つで C# で書かれたスクリプトをプラグインのように実行できる。

目次

Syntax

ExecuteScript|[<Mode>;]<File>

モード

省略も可能。省略した場合は External モードと同じ

  • Internal モード
    FlashDevelop のプラグインとしてスクリプトを実行して、FlashDevelop の ランタイムインスタンスにアクセスできる。
    同じアプリケーションドメインにロードされるときテンプファイルはロックされる。
  • External モード
    FlashDevelop のランタイムインスタンスへのアクセスなしで終了するとスクリプトは実行して解放される。
    テンプファイルは実行された後で解放され、ファイルロックは起こらない。
  • Development モード
    Internal モードと似ているが、いつでも新しい一時ファイルを作りなおす。
    新しい内部スクリプトを開発するときだけ使用すべき。

いまいち External の使い道がわからない。とりあえず、External だと FlashDevelop のランタイムインスタンスにアクセスができない?っぽいので Development で作って、Internal で設定しておくとよさげ。

と思ったのだが、一時ファイルがロックされるため、Internal にしておくと2回目以降一時ファイルにアクセスできませんと表示され実行できない。俺の環境だけなのかな?・・・。

一時ファイルって何だ?って思って調べてみたら、一回目に実行した際に

C:\Documents and Settings\[ユーザー名]\Local Settings\Temp\CSSCRIPT\Cache

にコンパイルしたファイルが作られる。次回からはコンパイルされないので早くマクロが動くとかそういうことだと思う。

Development モードにしておけば毎回一時ファイルを破棄して新しく作り直すのでちょっと遅い。

でも Internal にしておくと一回しか動かないし・・・。

とりあえず、詳しくわかるまでは Development モードで進めます。


実際に書いてみる

Script の Syntax はシンプル。public なクラスを作って、 public static void Execute っていうメソッドを書いておけばそこからスタートする。

これをベースとする。

// FDScript.cs
using FlashDevelop;

public class FDScript
{
	public static void Execute()
	{
		Globals.MainForm.About(null, null);
	}
}

これをどこか適当に置いておく。

自分は E:\FDP\csmacro のようなディレクトリを掘って置いておいた。

実行してみる

Macros に Execute Script のサンプルがあるのでそれで実行してみる。

Execute Script を選択すると、ファイルを選ぶ画面になるので先ほど作った FDScript.cs を選択してみます。

すると Help の About FlashDevelop が表示された。

いちいち選択するのが面倒な人は Macros の Edit で以下のように設定しておこう。

Add ボタンで新しいマクロを作り、 Entries に以下を書いておく

ExecuteScript|Development;<FilePath>

今回の例では

ExecuteScript|Development;E:\FDP\csmacro\FDScript.cs

とした。

ファイルパスは、$(BaseDir) などを使うことができるので長くなるのが嫌な人は使って短くしよう。

Shortcut を設定すれば使いやすさは向上するよ!


今開いているasを Always Compile に設定するマクロ

例として今開いてるasをショートカットキー1つでAlways Compileに設定するマクロ。

using FlashDevelop;
using FlashDevelop.Docking;
using PluginCore;
using PluginCore.Managers;
using ProjectManager.Controls.TreeView;
using ProjectManager.Projects;

public class AlwaysCompileShortcut
{
	public static void Execute()
	{
		Project project = (Project)PluginBase.CurrentProject;
		TabbedDocument nowDoc = (TabbedDocument)Globals.CurrentDocument;
		
		// StartsWith で始まりに指定した文字列があるかを比較できる。
		if (nowDoc.FileName.StartsWith(project.Directory))
		{
			// 現在のプロジェクト内のファイル。
			if (nowDoc.FileName.EndsWith(".as")) 
			{
				// AS
				ToggleAlwaysCompile(project, nowDoc.FileName);
			}
			else
			{
				if (nowDoc.FileName.EndsWith(".mxml"))
				{
					// MXML
					ToggleAlwaysCompile(project, nowDoc.FileName);
				}
				else
				{
					ErrorManager.ShowWarning(nowDoc.FileName + " は、AS, MXMLファイルではありません。", null);
				}
			}
		}
		else
		{
			// 現在のプロジェクト外のファイル。
			ErrorManager.ShowWarning(nowDoc.FileName + " は、現在の Project のファイルではありません。", null);
		}
		
	}
	
	public static void ToggleAlwaysCompile(Project project, string path)
	{
		bool isTarget = project.IsCompileTarget(project.GetAbsolutePath(path));
		// 指定しようとしているファイルがコンパイルターゲットかどうかを判断する。
		project.SetCompileTarget(path, !isTarget);
		// コンパイルターゲットに指定する。
		if (project.MaxTargetsCount > 0)
		{
			while (project.CompileTargets.Count > project.MaxTargetsCount)
			{
				// 以前までのコンパイルターゲットをターゲットからはずす。
				string relPath = project.CompileTargets[0];
				string path2 = project.GetAbsolutePath(relPath);
				project.SetCompileTarget(path2, false);
			}
		}
		project.Save();
		// project をセーブする。
		ProjectTreeView.Instance.RefreshTree();
		// ツリーを再描画させる。
		TraceManager.Add("AlwaysCompile のターゲットを" + path + " に変更しました。");
	}
	
}

以上を適当にどこかに保存して

ExecuteScript|Development;E:\FDP\csmacro\AlwaysCompileShortcut.cs

のような感じでマクロを設定する。


参考

FlashDevelop Macro ExecuteScript で無限の可能性