スポンサーリンク

Coda2でファイル保存時の自動ビルド(コンパイル)を試みる

はじめに

前の記事で、Sublime Text2からCoda2へ移行しようかな、という内容を書きました。その際にSublime Textで利用していたプラグイン’SublimeOnSaveBuild’と同じ、保存時の自動ビルド(コンパイル)がCodaでもできるかどうか色々試した記録です。

SublimeOnSaveBuild

何ができるかというと、指定した拡張子(Settingsファイルで設定)のファイルを保存すると、自動的にビルドが実行(Command+B)されます。できることは単純ですが応用の効くとても便利なプラグインです。

私の場合、markdownファイルの保存と同時にコンパイルを実行してhtmlを出力するようにしていました。ビルドファイル次第で、保存時に何でもできるので便利です。

Coda2とBuildOnSave

(できると思いますが)保存と同時に何かを実行するという方法を見つけることができませんでした。Panicのサイトに、保存時にAntを実行するBuildOnSaveというプラグインはあるのですが、バイナリがなくコンパイルが必要でした。それより、なぜAnt?・・・という感じです。

Antは主にJavaの開発で使いますが、実行環境がJavaというだけで、なんでもできるビルドツールです。

昔とった杵付と思えないほど忘れていましたが、compassを実行するbuild.xmlを書いてみました。terminal.appでbuild.xmlのあるディレクトリで”ant”と実行すると、cssファイルが作成されます。当然、Compassが必要で、config.rbも必要です。




	
	
	
		
            
        
	
	
	
	
	


ここまではよかったのですが、肝心のBuildOnSaveが私の環境だとコンパイルしても動きませんでした。なんとなく動いているような感じはあるのですが、Looking for build.xmlというメッセージが出たまま止まります。何か情報がないかと調べましたが、どうもサイト(プロジェクト?)単位で管理されていて、何が保存されても実行される作りなので、使い勝手が悪いと思いあきらめました。

Coda2とAppleScript

さすがにプラグインを作るのは時間がかかりそうなので、次善の策となりますが、AppleScriptを試すことにしました。とりあえずkramdown(markdown拡張)をコンパイルするAppleScriptを書いてみました。このscptファイルを、”~/Library/Scripts/Applications/Coda 2/”に保存します。メニューから「スクリプトを再読み込み」を実行すると、追加したAppleScriptがメニューに登録されます。

保存時(Command+S)に自動コンパイルとまではいきませんが、環境設定のキーボードで適当なショートカットを設定すると、キーボード操作(ショートカットキー)でコンパイルを実行できます。

パスやファイル名の取得方法を色々と試しながら書いたので、不要なコードが含まれています。といっても、AppleScriptとShellScriptとのどちらで取得するかの違いなので、利用する場合は適当に削除して下さい。


-- script settings
on CodaScriptSettings()
	return {displayName:"kramdown", inContextMenu:"yes"}
end CodaScriptSettings

-- actual script
tell application "Coda 2"
	try
		-- 現在開いているファイルのパスを取得する。標準形式
		set filePath to file of contents of selected split of selected tab of front window
		-- alias形式に変換
		set aliasPath to filePath as alias
		-- UNIX形式に変換
		set posixPath to (filePath)'s POSIX path -- POSIX path of filePathでも可
		
		-- AppleScript
		-- fileName(baseName+extension)
		set fileName to getNameByAs(filePath) of me
		-- baseName
		set baseName to getBaseNameByAs(filePath) of me
		-- extension
		set extension to getExtensionByAs(filePath) of me
		-- directory
		set directory to getDirectoryByAs(filePath) of me
		-- set posixDir to POSIX path of directory -- UNIX形式に変換
		
		-- Shell script
		-- fileName(baseName+extension)
		set fileName to getNameBySh(filePath) of me
		-- baseName
		set baseName to getBaseNameBySh(filePath, "markdown") of me
		-- extension
		set extension to getExtensionBySh(filePath) of me
		-- directory
		set directory to getDirectoryBySh(filePath) of me
		
		tell current application
			-- kramdownコンパイル
			set sourcePath to quoted form of (POSIX path of filePath)
			set targetPath to quoted form of (directory & "/html/" & baseName & ".html")
			do shell script "kramdown " & sourcePath & " > " & targetPath
		end tell
		
	on error message
		display dialog message
	end try
end tell

-- basename+extension
on getNameByAs(filePath)
	set fileName to ""
	tell application "Finder"
		set fileName to name of (filePath as alias)
	end tell
	return fileName
end getNameByAs

-- basename
on getBaseNameByAs(filePath)
	set baseName to ""
	tell application "Finder"
		set len to (length of (name extension of (filePath as alias) as text)) + 2
		set baseName to items 1 thru -len of (name of (filePath as alias) as text) as text -- -lenで後方カウント
	end tell
	return baseName
end getBaseNameByAs

-- extension
on getExtensionByAs(filePath)
	set extension to ""
	tell application "Finder"
		set extension to name extension of (filePath as alias)
	end tell
	return extension
end getExtensionByAs

-- directory(alias)
on getDirectoryByAs(filePath)
	set directory to ""
	tell application "Finder"
		set directory to folder of (filePath as alias) as alias
	end tell
	return directory
end getDirectoryByAs

-- Shell script

-- basename + extension
on getNameBySh(filePath)
	set posixPath to POSIX path of filePath -- (filePath)'s POSIX pathでも可
	-- set fileName to do shell script "n=" & (posixPath)'s quoted form & ";echo "${n##*/}"" -- quoted form of posixPathでも可
	set fileName to do shell script "basename " & quoted form of posixPath
	return fileName
end getNameBySh

-- basename
on getBaseNameBySh(filePath, extension)
	set posixPath to (filePath)'s POSIX path
	-- set baseName to do shell script "n=" & quoted form of (getNameBySh(filePath) of me) & ";echo "${n%.*}""
	set baseName to do shell script "basename " & quoted form of posixPath & " '." & extension & "'"
	return baseName
end getBaseNameBySh

-- extension
on getExtensionBySh(filePath)
	set posixPath to (filePath)'s POSIX path
	set extension to do shell script "n=" & quoted form of posixPath & ";echo "${n##*.}""
	return extension
end getExtensionBySh

-- directory
on getDirectoryBySh(filePath)
	set posixPath to (filePath)'s POSIX path
	-- set directory to do shell script "n=" & quoted form of posixPath & ";echo "${n%/*}""
	set directory to do shell script "dirname " & quoted form of posixPath
	return dir
end getDirectoryBySh

下記のサイトを参考にしています。

おわりに

結局、Sublime Textを使っているのですが、CodaもApple scriptでなんでもできますね。と思ったら、Sublime TextでもApple Scriptを使えそうです。Codaのメリットがなくなっていく・・・ただ、FTPとGitはGUI込で便利だと思います。もう少しプラグインが豊富にあればCodaでいいかなと思うのです。Sublime Textは無骨というか硬派というか可愛げがありません。