Unityの外部スクリプトエディタ(External Script Editor)にneovimを登録するためにやったことをまとめます。
やりたいこと
Unity Editorでソースファイルやエラーメッセージをダブルクリックしたとき、
- 端末(iTerm2 + tmux)上で起動済みのneovimにそのファイルを開かせる
- カーソルを指定の行に合わせる
- neovimのカレントディレクトリをUnityのプロジェクトパスに変更する
実行環境
- macOS Mojave(10.14.3)
- iTerm2
- tmux
- neovim v0.4.3
- Unity 2018.3.0f2
実現方法
neovim-remoteによる遠隔起動
https://github.com/mhinz/neovim-remote
neovimは起動時に遠隔指示を受け付けるサーバを立ち上げてくれます。neovim-remoteはそれを利用して、起動済みのneovimに指定のファイルを開かせるコマンドです。
これを使って上記の挙動を実現すると次のようになります。
nvr --remote +(行番号) (ファイル名) -c 'cd (プロジェクトパス)'
となれば、あとはnvrを外部エディタとして登録し、引数をUnity側で設定してあげればOK……ではありません。nvrを外部エディタとして登録することができないからです。
Automatorで.App化する
macOS版Unity Editorに登録できる外部エディタはCocoa App形式に限られます。つまりnvrそのものや、nvrを実行するシェルスクリプトはそもそも登録することができなくなっています。
ではどうするか?幸いmacOSにはAutomatorがあるので、これを使いましょう。内部的にシェルスクリプトを実行するAppを作成することができます。
次のようにAutomator Applicationを設定します。
-
新規Applicationを作成する
-
「シェルスクリプトを実行」を追加し、次のように記述する。また、入力の引き渡し方法は「引数として」を選ぶ。
シェルスクリプトを実行
eval "/usr/local/bin/nvr" "--remote" $@
* 上記Applicationを保存する
* Unity側でPreferencesを開き、External Tools画面のExternal Script Editorに上記Applicationを指定する
* 同画面のExternal Script Editor Argsに下記を指定する
"+$(Line) $(File) -c 'cd $(ProjectPath)'"
これで完成です!Unity Editor上でC#スクリプトやシェーダファイルをダブルクリックすると、neovimが起動済みであればそちらで開かれます。
## 今後の課題
ファイルを開いたときにneovim(を起動しているiTerm2)にフォーカスを移したいのですが、これは上記Automator Applicationに追加処理を記述することで実現できそうです。
また、今回はneovimがすでに起動していることが前提になっており、neovim未起動の状態でファイルを開こうとするとエラーになります。ここはどうにか改善したいところです。
以上です。