Sublime Text 3でのAsymptote Syntax Highlighting 改訂版

ちょっと要領が分かってきたので,Emacs版のAsymptote Syntax Highlighting に近づけるように改訂版を作ってみた。

ATOM版のSyntaxの元になっているのは,asy -l > asy.list で生成される asy.list というファイル。これに,変数やら関数やらの一覧が載っている。ところで,Asymptoteをビルドするための本家の一式を見ると,Makefileに,次のような箇所がある。

asy-keywords.el: asy
        @echo Creating $@;
        $(ASY) -l > asy.list
        ls $(addsuffix /*.asy,$(KEYWORDS)) | grep -v plain\* | \
          grep -v three_\* | grep -v featpost3D | xargs $(ASY) -l >> asy.list
        perl ./asy-list.pl asy.list 2.09svn

これを見ると,asy -l で生成された asy.list にさらに幾つかのキーワードが追加されているようだ。そして,こうして出来た asy.list を用いて,Emacs用の keywords.el が作られている。そこで,ATOM版の作成スクリプトに変更を加えて,増補されたasy.listを使って,Asymptote.csonを生成するようにした。あとは前回と同様にして,JSONに変換したのち,JSON-tmLanguage にして,最終的に tmLanguage に変換した。そのままだと,syntaxファイルとして認識できない箇所があったので,real[]といった[]を含む箇所をコメントアウトするなり,適当に手を加えた。出来上がりはまずまずだと思う。

Sublime Text 3でAsymptoteのsyntax highlight表示

最近,AtomやらBracketsやらVisual Studio Codeやら,新しいエディター(文書編集プログラム)を使っているのだが,やはり Sublime Text 3の軽快さにはかなわない。ということで,LaTeX文書に関しては,Sublime Text 3に戻ってきたのだが,図版作成プログラムのAsymptoteについては,以前と変わらず Emacs を使っているのだった。

Emacsを使う理由は Syntax Highlight ができるから。あと,C-c C-cでビルド&プレビューが出来るし。ビルドの方は,Sublime Text 3でも自前ビルドシステムを作れば簡単なのだが,シンタックス・ハイライトできるパッケージが見つからなかった。

いろいろ調べてみると,ATOM用のAsymptoteパッケージが見つかった。これに,シンタックス・ハイライト用のデータが付いているので,これを移植できないかと考えた。試行錯誤したが,以下の方法で,とりあえず出来た。

まず,ATOM用Asymptoteパッケージ付属のasymptote.csonというファイルをJSON形式に変換する。これはATOMにCSON-parserというパッケージを入れることで出来た。ファイルの先頭に無駄な{}が付いていたので,これを手動で削除。以上で,asymptote.JSONが出来た。

次に,Sublime Text 3にPackageDevというパッケージをインストールする。それを用いて,JSON形式のTextMate Languageファイルを新規に作る。パッケージ・コントロールから選んで行って,New Langauage Syntax (JSON-TextMate) 的な表示のものを選ぶと,雛形が作成される。それをasymptote.JSON-tmLanguage という名前で保存する。

pattern:[] の中身が空っぽなので,そこに,先に変換して作ったasymptote.JSONのpattern:[…] の中身をコピーする。インデントが2文字になるように調整。これは必要か分からないが。言語の名前と拡張子をそれぞれ Asymptote, asy として保存。

これをTextMateの言語ファイル形式に変換する。Build SystemをConvert to … にして,Build with … から Convert to Property List を選択。すると,なんとエラー。25行目あたりで,Expected Dictionary というエラー。このブロックだけ,begin, beginCaptures などという語句がある。そこで,このブロックをコメント・アウトして,再び Convert to Property List する。今度はエラーもなく,asymptote.tmLanguage というファイルが出来上がった。拡張子がxmlでないのが不思議だったが,どうやら,PackageDevが作ったJSON-tmLanguageの1行目がshebang的になっているようだ。コメントなのだが,
// [PackageDev] target_format: plist, ext: tmLanguage
と書いてある。これを読んで,plistに変換し,拡張子を tmLanguage にしているらしい。

以上で,asymptote.tmLanguage が完成した。これを,Package/User/ に移動して,Sublime Text 3を再起動すると,SyntaxにAsymptoteが表示されていて,拡張子 asy のファイルは自動的に,syntax highlight される。

これで,一応の目的は果たした。しかし,比較してみると,Emacsの表示の方が,まだ完成度が高いようだ。Emacsではgeometryで定義された line型なども,ちゃんと予約語として表示されるが,ATOMのAsymptoteだと line はただの変数と同じ。ということで,完全に満足はできないのだが,まずまずではある。

Carbon Emacs メモ

asymptoteの編集にはCarbon Emacs (Emacs22をMac OS Xに移植したもの) を使っているのだが、昨日、ちょっと困った事態になったので、解決策をメモ。

昨日、Asymptoteの最近版?である 2.12 をソースからコンパイルしたのだが、Carbon Emacsからコンパイルしようとすると、古いバージョンが起動してしまった。古いバージョンどころか、ログを見ると、TeXLive/2009/ 以下にあるasymptote1.88が起動している。これは、自分で以前にコンパイルしたものとも違う。

つらつら考えるに、TeXLive/2009 以下にあるasymptoteが先に認識されているからに違いなかった。つまり、パスの優先順位の問題だ。しかるに、ワタシの場合、怠けていて、.emacs すら作っていない。いったい何処にパスの設定があるのだろうか。

いろいろ調べて分かったこと。Carbon Emacs.app はアプリとは言いながら、実態はフォルダー。Finderから右クリックして、パッケージの内容を表示というのを選べば、アプリの内容をファインダー上で表示できる。Carbon Emacs.app/Contents/Resorces/site-lisp/ に、site-start.el というEmacs Lisp があるが、これが最初に読み込まれるようだ。中を見ると、

  (carbon-emacs-package-add-to-path
   '(
     "~/bin"          ; one's own
     "/usr/texbin"    ; TeX
     "/usr/local/bin"
     "/usr/X11R6/bin" ; xdvi
     "/usr/local/teTeX/bin/i386-apple-darwin-current" ; i-Installer (intel)
     "/usr/local/teTeX/bin/powerpc-apple-darwin-current" ; i-Installer (ppc)
     "/opt/local/bin" ; MacPorts
     "/sw/bin"        ; Fink
     ))

となっていて、2番目に /usr/texbin がロードパスに指定されていることが分かる。/usr/texbin は実際には /usr/local/texlive/2009/bin へのシンボリック・リンクなので、これで、TexLive 2009 のAsymptoteがロードされているのだった。

そこで、これを削除することで解決。ついでにいろいろ調べていたら、.emacs とかに、

(mac-key-mode 1)

と書けば、マック風のキーバインドになって、Command-Cでコピー、Command-Vでペーストとか出来ることを発見。まあ、これは慣れの問題だから、どっちでも良いのだが。

Emacs.appでAsymptoteを使う

[ 備忘録 ] UNIXやGNU/LINUX上と違って、Mac OS X上で、しかも、独立アプリケーションになっている Carbon版Emacs.appでAsymptoteを使うためのメモ。

どの版のEmacsでもEmacs lispを読み込むことは同じ。Carbon版Emacs.appでは、アプリケーション本体(実は実行可能なディレクトリーなのだが)に様々なemacs lispを内包している。Emacs.appを右クリックして「内容を表示する」というのを選ぶと、ディレクトリーが開かれる。Emacs.app/Contents/Resources/ 以下にemacs lispがたくさん入っている。

Emacs.app/Contents/Resources/site-lisp/ 以下に asymptoteというディレクトリーを作り、そこに、/usr/local/share/asymptote/ (標準的なインストールの場合) 以下にある asy-mode.el と asy-keywords.el をコピーする。このフォルダーにはもう一つ asy-init.el というemacs lisp プログラムがあるのだが、それは、Emacs.app/Contents/Resources/site-lisp/site-start.d というディレクトリーにコピーする。これで、拡張子がasyのファイルを開くと、asymptoteのキーワードが色分けされて、見やすい。コンパイルもメニューから(メニューじゃなくても)実行できるのだが、何故かエラーが表示されてしまった。latexとdvipsの場所を明示的に指定しないとダメらしく、コンフィグレーションファイルである ~/.asy/config.asy に texpath=”latexが入っているフォルダーのパス”; と dvips=”こちらはdvips本体へのパス”; を書き込むように促される。パスは通っているし、TeXShopからは別段こんなことしないてもいいのになあと不思議ではあるが、ともかく指定した。これで、無事にコンパイル&プレビューできるようになった。

ということで、きちんと設定さえできれば Emacs はとても使いやすいのである。当然ではあるが。今のところ TeXShop では asymptoteのキーワード色分けが出来ないので、Emacsにしようかなあ。それにしてもTeXShopは便利さが中途半端だ。ファイルの拡張子に合せて、コンパイル・エンジンを自動で振り分けるくらいのことが出来ないんだからねえ。

やっぱ、男はEmacsだな(^^;)

いや、まだ全然使いこなせてないんですがね(苦笑)。というか、以前使っていたときも、別にEmacs Lispをバリバリと書いていた訳じゃなし、普通のユーザーにすぎなかったんですから。

ともあれ、Emacs 23 (まだ安定版じゃないけど)にAUCTeXを入れて、自分の環境に合わせたカスタマイズを少々行いました。これでイーマックスもただのエディターに成り下がった :mrgreen: というか、普通に使う分には、難しいことは何もありません。ツールバーにあるライオンさん(TeXbook以来の伝統で、ライオンがTeXのイメージキャラクターなんです)のアイコンをクリックして組版、しかるのちに眼鏡のアイコン(なんで眼鏡なんだろう?)のアイコンをクリック。すると出来たPDFがプレビューできるという具合です。

Emacs編集画面