GUIなアプリケーションからCUIなエディタを起動したい。

逆はふつーに出来るのですが、どうもGUIからCUIというのはあまりアレな方向でないらしい。
具体的に言うとFirefoxのadd-on、mozexでgVimやMacVimでなくターミナル上のvimを使いたい、というお話。
少数派なのかなぁ...。

まず、mozexというadd-on。
簡単に説明すると、firefoxのadd-onで、textareaやページのソースなどを外部エディタで開けるようにするadd-on。
よくhatenaなり日記なりを書きかけでFirefoxを閉じてしまったり、textareaからフォーカス外れたのに気がつかないままBackspaceを連打したあげく別のリンク踏んでアレレ?なことになったりするので、自動バックアップ付きのvimで編集できるというのはかなり心強い。
エディタで書いてコピペすりゃええやん、という話なのですが、このadd-onいれた当時はfakeclipなんてプラグインを知らず、コピペどうすりゃ?という時期だったのですよ。
まぁ、慣れの問題もあるかもしれないけど、エディタ終了すると勝手にtextareaにコピってくれるのはかなり便利。


まぁ、Firefoxアップデートしたら使えなくなったんですがね...。
非公式版(?)ならあるようなので気になる方はFirefox OfficialのAdd-onリストではなくGoogle先生にお尋ねください。


で、表題。
GUIからCUIのコマンドを起動する。
もうすこし具体的に言えば、ターミナルエミュレータ(TerminalとかiTermとか)を起動し、さらにその上で指定したコマンドを実行、したい。
ターミナル自体に引数を解釈するオプションがあればいいのだろうけど、軽く見た感じ見つからない。
まぁ、こういう時はAppleScriptの出番となるわけです。
やりたいことは新しくウィンドウ開いてそこに文字を送ればいいだけなのでキーストローク送るだけでもいいのだろうけど、折角なので用語(?)を使おう。
ということで、Terminal.app版

#!/usr/bin/osascript

on run argv
	set originalDelimiters to text item delimiters of AppleScript
	set text item delimiters of AppleScript to " "

	tell application "Terminal"
		do script (argv as string)
	end tell

	set text item delimiters of AppleScript to originalDelimiters
end run

delimiter云々はAppleScriptで文字列の配列をスペースをはさんでくっつける(ruby的に言えばjoin)常套手段らしいです。
Terminal.appだと"do script"という用語(?)が一連の作業をこなしてくれます。
対してiTerm.appだとちと面倒...

#!/usr/bin/osascript

on run argv
	set originalDelimiter to text item delimiters of AppleScript
	set text item delimiters of AppleScript to " "

	tell application "iTerm"
		tell (make new terminal)
			launch session "Default"
			tell current session
				write text (argv as string)
			end tell
		end tell
	end tell

	set text item delimiters of AppleScript to originalDelimiter
end run

new terminalを作って、さらにそこでsessionをluanchして...。
make new terminalだけだと非可視なウィンドウができるだけのようで、さらにそこでsessionを作らないといけないらしい。
sessionのあとの"Default"の部分はBookmarksにある普段使ってるsession名をいれてやってください。
defaultなsession名も拾ってこれるのだろうけどやる気が尽きました。


どちらもただ引数実行しているだけなので、実際に使うときには

$ osascript onTerminal.scpt "vim hoge ; exit"

の様に";exit"をつけないとウィンドウが残ります。
あとactivateしていないので前面にはでてきません。
前面に持ってきたい、という場合にはtell applicationの中にactivateを書けばokです。多分。


あいかわらずAppleScriptは苦手だなぁ...