Julia REPLのUnicode InputをAlfredで再現する
JuliaのUnicode Input
Juliaは「ASCII範囲外のUnicode文字もどんどんプログラムの中で使っていこう」という方針の言語です。たとえば∘
という文字を関数合成に使うことができたり、⊻
がXORを表す中置演算子として扱えたりします。これにより、複雑な数学的表現を見た目そのままにプログラムに落とし込むことができます。科学技術計算を得意とするJuliaならではの特徴の一つと言えると思います。
プログラム内でASCII範囲外のUnicode文字を使うにあたっての最大の問題は、入力が面倒であることです。そのため、JuliaのREPLやエディタではタブ補完によって簡単にUnicode文字が入力できるようになっています。REPLで\pi<tab>
と入力するとπ
が入力できる、という具合に、LaTeX方式の数式入力に慣れている人であれば簡単に記号入力が可能です。少し複雑な例を挙げると、シュレディンガー方程式iħ|ψ̇(t)⟩=Ĥ|ψ(t)⟩
を入力したければREPL上でi\hbar<tab>|\psi<tab>\dot<tab>(t)\rangle<tab>=H\bar<tab>|\psi<tab>(t)\rangle<tab>
と入力すればOKです。
Unicodeを使った数式表現はけっこう便利で、メールやSlackやTwitterなどでテキストベースで数学的な内容についてやりとりしたい時にも使えます。僕はそういうときいつもJuliaのREPLを立ち上げて入力し、結果をコピペするという回りくどいことをしていました。しかし、snippetsツールを使えばREPLを立ち上げなくても同じことができることに気付き、頑張って設定したメモがこの記事です。
Alfredのsnippets機能
AlfredはMacで使える強力なランチャーアプリで、機能の一つにsnippetsがあります。僕はMacにインストールされているアプリをあまり増やしたくないのもあって、これを利用することにしました。
Juliaでtab補完できるLaTeXコマンドはたくさんあるので、手動で登録するのは馬鹿らしいです。Alfredからsnippetsをエクスポートするとalfredsnippets
という拡張子を持つファイルができるのですが、正体はJSONをまとめてzipで固めたものです。これを参考に同じようなファイルを作れば、Alfredがインポートしてくれます。
JuliaのREPLにおける補完のための情報はREPL.REPLCompletions.latex_symbols
という辞書の中に入っているので、このデータをもとに以下のようなスクリプトでJSONファイルを生成し
# using Pkg; Pkg.add("JSON")
using REPL, UUIDs, JSON
mkdir("JuliaUnicodeInput")
for (k, v) in REPL.REPLCompletions.latex_symbols
input = strip(k, '\\')
result = v
uid = string(uuid4())
codepoint = uppercase(string(UInt32(result[1]), base = 16, pad = 5))
open("JuliaUnicodeInput/$codepoint.json", "w") do f
snippet = Dict(
"name" => result,
"snippet" => result,
"keyword" => input,
"uid" => uid,
"dontautoexpand" => false
)
JSON.print(f, Dict("alfredsnippet" => snippet))
end
end
zipで固めて拡張子を変更すれば
zip latex.alfredsnippets JuliaUnicodeInput/*
Alfredにインポートできるようになります。
Alfredにはsnippetsのキーワードが入力されたときに自動で変換するモードがあるので、これを使うとかなりJuliaのREPLと似た感覚で書くことができます。が、何故か自動変換が発動しなかったり、Zennのエディタ上で使うとフリーズしたりと、割と不安定です。僕はあきらめて普通にAlfredを起動して使うようにしました。別のsnippetsツールであればもっとうまくいくのかもしれませんが、これでも十分便利でけっこう満足しています。
Discussion