⌨️

Julia REPLのUnicode InputをAlfredで再現する

2022/03/03に公開

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