TL;DR
- Spacemacs の Clojure レイヤーにある Pretty Symbols と同じことを Visual Studio Code でしたいが、既存の拡張が見つからなかった。
- Spacemacs の
clojure/fancify-symbols関数の実装を調べ、これを参考に拡張を自作することにした。
背景
Spacemacs の Clojure レイヤーでは、設定値 clojure-enable-fancify-symbols を有効にすると、一部のシンボルが記号に置き換わって表示される(Pretty Symbols)。具体的には次のように変わる。
| 元の表記 | 表示 |
|---|---|
fn | λ |
#(...) | ƒ(...) |
#{...} | ∈{...} |
partial | Ƥ |
comp | ∘ |
Clojure を VSCode で書くときにも同じ表示にしたくて色々と調べたが、そのような拡張はなさそうだった。そこで、自分で拡張を作ることにした。
検証
Spacemacs では、layers/+lang/clojure/funcs.el の clojure/fancify-symbols 関数でシンボルを置き換えている。font-lock-add-keywords で正規表現にマッチした範囲を、compose-region で記号に合成して表示している。
(defun clojure/fancify-symbols (mode)
"Pretty symbols for Clojure's anonymous functions and sets,
like (λ [a] (+ a 5)), ƒ(+ % 5), and ∈{2 4 6}."
(font-lock-add-keywords mode
`(("(\\(fn\\)[[[:space:]]"
(0 (progn (compose-region (match-beginning 1)
(match-end 1) "λ")
nil)))
("(\\(partial\\)[[[:space:]]"
(0 (progn (compose-region (match-beginning 1)
(match-end 1) "Ƥ")
nil)))
("(\\(comp\\)[[[:space:]]"
(0 (progn (compose-region (match-beginning 1)
(match-end 1) "∘")
nil)))
("\\(#\\)("
(0 (progn (compose-region (match-beginning 1)
(match-end 1) "ƒ")
nil)))
("\\(#\\){"
(0 (progn (compose-region (match-beginning 1)
(match-end 1) "∈")
nil))))))これを参考に、VSCode の拡張を作る。