[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Debugging SMIE for sh-script.el
From: |
Kévin Le Gouguec |
Subject: |
Debugging SMIE for sh-script.el |
Date: |
Thu, 02 Sep 2021 12:49:21 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) |
Hello,
I am having a hard time understanding the mechanics of SMIE in the
context of sh-script.el; for starters, I am stumped trying to debug a
call to smie-indent-calculate.
Take this two-line shell snippet:
#+begin_src sh
${foo}/bar --baz \
--quux
#+end_src
With point on "--quux", evaluate (smie-indent-calculate): this yields 6.
Looking at this function, I see that it simply funcalls everything in
smie-indent-functions, which in a shell buffer is
(sh-smie--indent-continuation t).
Instrumenting sh-smie--indent-continuation with C-M-x, I see that we
first go into the catch-all branch of the cond (";; Just make sure a
line-continuation is indented deeper."), which let-binds "indent" to:
#+begin_src elisp
(let ((sh-indent-after-continuation nil))
(smie-indent-calculate))
#+end_src
Stepping through this recursive call with Edebug, I see that we go into
the first branch of sh-smie--indent-continuation's opening cond, which
returns nil. Continuing into the parent call of
sh-smie--indent-continuation… "indent" is set to 6 for some reason??
I struggle to understand whether I am missing something, or whether this
binding is bogus. On the one hand, run-hook-wrapped makes no promises
as to its return value when all functions return nil; on the other hand,
"indent" gets consistently assigned to whatever column "/bar" begins at
(e.g. 6 here, or 9 with "${foobar}/bar"), so there is a method to the
madness…
What am I missing?