OS X Yosemite における LSOpenURLsWithRole エラーの解決

これまで自分はアプリケーションを起動したりファイルを開いたりするのにopenコマンドを多用していたのですが、OS X Yosemiteにアップグレードしてから

LSOpenURLsWithRole() failed for the application /Applications/TextEdit.app with error -10810 for the file /some/file

というエラーが起こって困っていました。

このエラーはTmux上でopenコマンドを使用した場合にのみ起こり、通常では問題なく使えていました。

openコマンドじゃなくてアプリケーションなどでこのエラーが出ている人でも、tmux上で起動した時だけ上記エラーが出るようなら下の解決策が有効かもしれません。

ReattachToUserNamespaceのインストール

結論から言うと、ReattachToUserNamespaceというアプリケーションをインストールして、Tmuxのウィンドウ作成時にはそのコマンドを噛ませたシェルを起動するように変更すると問題がなくなりました。

恥ずかしながら自分は全く知らなかったのですが、このアプリケーションはTmux上でコピーしたものをMac OS Xクリップボードにもコピーするための結構有名なものだそうです。

だからあんまりこのエラーで詰まっている人が見つからなかったのかな...

インストールはHomebrewでできます。とてもべんり。

$ brew install reattach-to-user-namespace

.tmux.confの変更

Tmuxのウィンドウ作成時に起動するアプリケーションは.tmux.conf内でdefault-commandオプションを設定することで変更できます。

set-option -g default-command "which reattach-to-user-namespace > /dev/null && reattach-to-user-namespace -l $SHELL || $SHELL"

default-commandオプションはデフォルトでは空になっており、からの場合はログインシェルがデフォルトコマンドになります。

今回はreattach-to-user-namespaceコマンドがない場合でも正常に起動できるよう、whichコマンドの結果によってシェルの起動にReattachToUserNamespaceを噛ませるかどうかを変更するようにしました。

.tmux.confの変更が反映されない場合

ずっと前にもこれでハマってすっかり忘れていたのですが、.tmux.confの変更を反映させるためにはTmuxのプロセスを一度全て終了させる必要があるため、デタッチしたセッションがある場合には一度すべて殺さなければいけません。

Tmuxセッションが残っているかどうかはpsコマンドで確認します。

$ ps aux | grep taux

自分は以上でopenコマンド使用時にエラーが起こることはなくなりました。 ついでに Mac OS X の tmux でクリップボードを使えるようにした(pbcopyとか) - 戦場のプログラマー とか tmuxとMacのクリップボードを共有する(copy-mode, vim) - Qiita を見てクリップボード共有の設定もして、今では穏やかにTmuxを使いまくっています。