Hatena::ブログ(Diary)

独学ActionScript このページをアンテナに追加 RSSフィード

2009.05.31

FlashDevelopの使い方 (11)マクロ機能(コンパイル指定してムービープレビューまでを自動化)

RC3から搭載されたマクロ機能ですが、ほとんど日本語の情報が無かったので全く使えていませんでした。ところが昨日、FlashDevelopエバンジェリストと一部で呼ばれている馬鹿全さんが、マクロ機能の詳しい解説ページを公開してくれました。しかも、私がこんな機能が欲しいとTwitterでリクエストしたらそれが採用されて、その機能を実現する工程を解説した内容になっています。嬉しい。FlashDevelopユーザー必読です。今回は、その馬鹿全さんが作ったマクロスクリプトベースにさせてもらって、自分が使うのに都合が良いようにちょっとだけ変更を加えた派生版スクリプトを作ったので、それを紹介します。ショートカットキーを1つ押せば、現在開いているasファイルをAlways Compileに設定して、ムービープレビューまでを自動で行うマクロです。※このエントリーで使用しているバージョンはFlashDevelop-3.0.0-RC4です。


はじめに

このエントリーで書かれている内容は、ほとんど馬鹿全さんの解説ページで得た情報をベースにしていますので、そちらを読んでいることが前提になります。もしまだ未読でしたらご一読してみてください。

前述のTwitterでリクエストした内容というのは、「今開いてるasをショートカットキー1つでAlways Compileに設定する」というもので、私はよくProjectパネルでAlways Compileを設定し忘れたままムービープレビュー(Test Movie)をしてしまい、期待していないasファイルが実行されるという失敗をします。さらに言えば、普段の自分のFlashDevelop環境では、Projectパネルを自動で隠す設定にしているため、Always Compileを再設定するには「Projectパネルを開く→コンパイル指定したいファイルを探す→右クリックメニューを開く→Always Compileを設定する」という手順を踏まなくてはならず、動作自体もけっこう面倒です。それを解決してくれるマクロが、馬鹿全さんが作成してくれた「AlwaysCompileShortcut.csで、このマクロスクリプトを使用すれば、設定したショートカットキーを1つ押せば、現在開いているasファイルをAlways Compileに設定することができます。


変更点

馬鹿全さんが作成された「AlwaysCompileShortcut.csは、大雑把に列挙すると以下の機能を備えています。

  • 現在開いているasファイルにAlways Compileに設定する
    • もし既にAlways Compileが設定されていたら。Always Compileを外す(トグル)
  • 同一プロジェクト内のそれ以外のasファイルからAlways Compileを外す
  • Always Compileに設定したファイルのフルパスをOutputパネルに表示する

それを元に今回私が変更を加えた「AlwaysCompileTestMovie.csは、以下の機能を備えています。

  • 現在開いているasファイルにAlways Compileに設定する
    • もし既にAlways Compileが設定されていたら。Always Compileを外す(トグル)
  • 同一プロジェクト内のそれ以外のasファイルからAlways Compileを外す
  • Always Compileに設定したファイルのファイル名だけをOutputパネルに表示する
  • 現在開いているasファイルをムービープレビュー(Test Movie)する

まず、トグル機能の部分を削除したのは、私の場合は1つのasファイルで完結するような小さなスクリプトがほとんどで、「開いているファイル=Always Compileするファイル」であることが多いからです。この機能を削除することで、マクロを実行した際に必ず開いているファイルがAlways Compileの状態を維持することになります。次に、フルパス表示をファイル名だけの表示に変えたのは、自分のFlashDevelop環境がOutputパネルを縦に表示しているためで、横幅が狭いのでフルパス表示だとファイル名が見られないからです。最後に、前述した通り今のところ100%、Always Compileの設定ミスで失敗するのはムービープレビューをする時なので、逆に言えば「Always Compileを再設定する時はムービープレビューする時」ということでこのような変更を加えました。

マクロスクリプトC#で記述するんですが、一度も書いたことが無くてよくわからず、正規表現もあまり知識がないので、おかしな記述の仕方があるかもしれません。もしあればご指摘ください。またマクロスクリプトに関して、何度もTwitter上で馬鹿全さんにアドバイスをいただきました。ありがとうございます。


設定方法

後述するマクロスクリプトをコピーしてテキストファイルに保存します。文字コードUTF-8BOM付き)」、ファイル名は「AlwaysCompileTestMovie.csを推奨。それを適当な場所(この例ではFlashDevelopインストールフォルダ配下にMacrosフォルダを作成してその中)に配置した上で、以下の手順でマクロを設定します。

  1. FlashDevelopを起動して、Macrosメニューから「Edit Macros」を選択します。
  2. Addボタンを押してマクロを新規作成します。
  3. Entriesの項目で「...」をクリックして、「ExecuteScript|Development;$(BaseDir)\Macros\AlwaysCompileTestMovie.csを入力してOKボタンを押します。*1
  4. Labelの項目で適切な名前(例:AlwaysCompileTestMovie)を設定します。
  5. Shortcutの項目で適切なショートカットキー(例:Shift+F5)を設定します。*2
  6. FlashDevelopを再起動します。(設定したショートカットキーを有効にするため)

これで設定したマクロを実行することが可能になります。この例の場合、Shift+F5キーを押すか、Macrosメニューから「AlwaysCompileTestMovie」を選択すると、現在開いているasファイルがAlways Compileに設定され、ムービープレビュー(Test Movie)が実行されます。Outputパネルには、「Always Compile: ファイル名」の形式でAlways Compileを設定したファイル名が出力されます。

もちろん、通常のムービープレビュー(Test Movie)はF5キーを押せば実行できますし、ムービープレビューの無いAlways Compileのトグルだけを行いたい場合は馬鹿全さん作成の「AlwaysCompileShortcut.cs」を使用すればできます。別々のショートカットキーでどちらも登録しておいて、適宜必要な方を呼び出すという使い方が便利だと思います。


(2009.06.01 20:02 追記) やっぱり「Shift+F5」じゃなくて「Ctrl+Shift+Enter」で実行したいので以下の方法で設定しました。

ショートカットキーをフックする常駐ソフトは他にもあると思いますが、「AutoHotkey」を使っているのでこれに設定しました。AutoHotkeyは、ホットキーを利用してWindowsアプリケーションを自由自在に操作できる高機能なスクリプト実行環境です。(日本語解説サイト

; FlashDevelop
#IfWinActive, ahk_class WindowsForms10.Window.8.app.0.378734a
	^+Enter::Send,+{F5} ; 「AlwaysCompileTestMovie」のShift+F5をCtrl+Shift+Enterにも割り当て
	^+NumpadEnter::Send,+{F5} ; テンキーのEnterにも同じように割り当て
#IfWinActive

FlashDevelop側の設定は変更せず、上記のスクリプトAutoHotkey.iniに記述して常駐しておくと、FlashDevelopがアクティブの時だけCtrl+Shift+Enterを押すとAutoHotkeyがそれをフックして、Shift+F5をFlashDevelopに送信します。なので、元々設定してあるShift+F5を押した時と同じ動作(AlwaysCompileTestMovieマクロの実行)をしてくれます。正攻法なやり方ではありませんが、普段Ctrl+Enterでのムービープレビューに慣れきっているので、こちらの方が使い勝手が良いです。


最後に

もしマクロスクリプトを作られたら是非教えてくださいませ!


マクロC#スクリプト(AlwaysCompileTestMovie.cs

/**
 * AlwaysCompileTestMovie.cs
 * 
 * @see http://blog.bk-zen.com/2009/05/30/164/
 * @see http://d.hatena.ne.jp/ActionScript/20090531/fd_macro_always_compile_movie_preview
 */

using FlashDevelop;
using FlashDevelop.Docking;
using PluginCore;
using PluginCore.Managers;
using ProjectManager;
using ProjectManager.Controls.TreeView;
using ProjectManager.Projects;
using System.Text.RegularExpressions;

public class AlwaysCompileTestMovie
{
	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, true);
		
		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 をセーブする。
		project.Save();
		
		// ツリーを再描画させる。
		ProjectTreeView.Instance.RefreshTree();
		
		// ファイル名だけ抽出
		string str = path;
		Regex reg = new Regex("^.*\\\\(?<filename>.*)$");
		if (reg.IsMatch(str))
		{
			Match match = reg.Match(str);
			str = match.Groups["filename"].Value;
		}
		
		// Test Movie を実行
		Globals.MainForm.CallCommand("PluginCommand", ProjectManagerCommands.TestMovie);
		
		// Outputパネルに出力
		TraceManager.Add("Always Compile: " + str, -2);
	}
	
}

参考ページ

今回の件を調べるに当たって以下のページがとても参考になりました。素敵情報に感謝。


まとめ

このシリーズのエントリーは、「FlashDevelopの使い方」のまとめにまとめてあります。

*1:「$(BaseDir)」はFlashDevelopインストールフォルダのパスが格納されている変数です。これを使用せずにフルパスで指定することも可能です。

*2:本当は普段Ctrl+Enterでムービープレビューしているので「Ctrl+Shift+Enter」を割り当てたかったのですが、Enterキーがショートカットキーとして割り当てられないようなので、もう1つのムービープレビューショートカットキーであるF5キーにちなんでShift+F5としました。

bk-zenbk-zen 2009/05/31 12:22 早速記事ありがとうございます!
ちなみに正規表現がイミプーな俺はASでよく使うこっちを使いましたw
string[] parts = project.CompileTargets[0].ToString().Split(new Char [] {'\\'} );
string name = parts[parts.Length - 1];
ショートカットが再起動しないとだめっていうのは気づきませんでした!

ActionScriptActionScript 2009/05/31 14:36 おぉbk-zenさん、コメント&またまたアドバイスありがとうございます!
正規表現使わなくても2行で書けちゃうんですかw
いやー結局ほとんどbk-zenさんに教わった内容だけのコードになってしまいますねww
今回はとても勉強になりました。今後ともよろしくお願いします。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/ActionScript/20090531/fd_macro_always_compile_movie_preview