主にEmacs lispからWINDOWSコマンドを呼ぶ際に、引数としてファイルパスを与える際に問題となっていた。Emacs Lisp側にパッチを入れていたりしたが、こんなのやってられないと思い考えた。
CYGWINからWINDOWSのコマンドを動かすとき、WINDOWS形式のパスとUNIX形式のパスで問題になるなら、ラッパーを挟んでしまえば良いという身も蓋もない結論に達した。
JAVA
WINDOWSネイティブで動作するため、JAVAに渡すパスはWINDOWS形式でないと動いてくれない。で、色々とやった結果、最後はjava_wrapper でJAVAコマンドをラップする事になった。インストール手順はスクリプトに書かれているが、JAVAのパスにスペースが含まれていると余計なシンボリックリンクを1つ作る。自分の場合はProgram Files以下にJAVAをインストールしているので、Program -> java_wrapperのシンボリックリンクが出来ていた。
Graphviz
CYGWINにもGraphvizパッケージがあるが、plantumlから呼び出すこともあるのでWINDOWS版を使う。よって、dotコマンドもラッパーを作った。dot.exeへのパスは環境変数を使ったほうが良いのだけど取り敢えずこれで動く。
#!/bin/bash ## http://takuya-1st.hatenablog.jp/entry/20110811/1313045543 を参考とした # java_wrapperと同じくコマンドのシンボリックリンクを作る # ln -s /usr/local/bin/dot_wrapper /usr/local/bin/dot function cygpath_to_winpath(){ args=() for i in $@ ; do case $i in -*) args=(${args[@]} $i) ;; *) args=(${args[@]} `cygpath -w $i`) ;; esac done echo ${args[@]} return 0 } /cygdrive/c/Program\ Files\ \(x86\)/Graphviz2.38/bin/dot.exe `cygpath_to_winpath $@`
これで、CYGWINのorg-modeで
#+BEGIN_SRC dot :file dot_example0.png digraph { A->B; } #+END_SRC
とdotコマンドを動かして図が書けるようになった。
CYGWINを使うことのバットノウハウ
CYGWINを使うために余計なことが色々と必要になる。大半は先人の知恵で解決済みなのだけど、たまに自分で調べることになる。無駄な作業なので、たまにイラッとくるのだけど、よかった探し*1をしておくと、「どのように動いているか知ることが出来てよかった」。
*1:知らない人のほうが多いのだろな