leaf-expandでleafのデバッグをする


設定しているsmartparensが期待通りに動かずに困っていた。 具体的には、lispを編集するモード(emacs-lisp-modeとか)のときに、「’(シングルクオート)」がダブルクオートとかと同じく「’’」となってしまいかえって面倒なことに。

beforeの設定がこんな感じ。 最近は、 use-package のかわりに leaf を使っているが、use-packageでもだいたい同じだと思う。

(leaf smartparens
  :straight t
  :require t
  :diminish smartparens-mode
  :config
  (leaf smartparens-config
    :require t
    :after smartparens
    :hook
    (prog-mode-hook . smartparens-mode)))

smartparensの設定は、 (require 'smartparens-config) が楽だし確実、というのを見て、たしかにそのように設定してるんだけどなあ。。。って感じだった。

いろいろ見た結果、期待通りにrequireできてないんじゃないの?って結論に至るのだけど、そういったときのデバッグって大変ですよね。

そんな時に便利なのが、 leaf-expand で、これはleafマクロで書かれた箇所を展開するとどうなるかがその場でわかる。 それにより、この展開後が

(prog1 'smartparens-config
  (autoload #'smartparens-mode "smartparens-config" nil t)
  (eval-after-load 'smartparens
    '(progn
       (add-hook 'prog-mode-hook #'smartparens-mode)
       (eval-after-load 'smartparens-config
         '(progn
            (require 'smartparens-config))))))

であることがわかり、これってちゃんとrequireされないよね、ということがわかった。

ちなみに解決後の設定は以下な感じ。

(leaf smartparens
  :straight t
  :require smartparens-config
  :diminish smartparens-mode
  :hook
  (prog-mode-hook . turn-on-smartparens-mode)
  :config
  (show-smartparens-global-mode t))

これだと展開後の姿も、以下のようになり、とても綺麗(なのか?)。

(prog1 'smartparens
  (autoload #'turn-on-smartparens-mode "smartparens" nil t)
  (straight-use-package 'smartparens)
  (add-hook 'prog-mode-hook #'turn-on-smartparens-mode)
  (eval-after-load 'smartparens
    '(progn
       (require 'smartparens-config)
       (show-smartparens-global-mode t)
       (diminish 'smartparens-mode))))

これは便利なので、今後も積極的に使っていきたい。


関連記事