Subject: bug#55764: closed (Re: bug#55764: 29.0.50; sh-mode: Support mksh's alternate case brace syntax)

From: [email-masked] (GNU bug Tracking System)
Date: Fri, 12 Jan 2024 03:14:01 +0000

Your bug report

#55764: 29.0.50; sh-mode: Support mksh's alternate case brace syntax

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
55764: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=55764
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#55764: 29.0.50; sh-mode: Support mksh's alternate case brace syntax
From: Stefan Monnier <[email-masked]>
To: Stefan Kangas <[email-masked]>
Cc: Lars Ingebrigtsen <[email-masked]>, [email-masked], Visuwesh <[email-masked]>
Date: Thu, 11 Jan 2024 22:13:10 -0500
List-Id: <debbugs-submit.debbugs.gnu.org>

>> The patch below seems to do the trick.
> If you think it looks good, then please install.  Nothing stood out
> when I read it over, FWIW.

Thanks for the reminder.  Pushed.
Closing,

        Stefan

Subject: 29.0.50; sh-mode: Support mksh's alternate case brace syntax
From: Visuwesh <[email-masked]>
To: [email-masked]
Date: Thu, 02 Jun 2022 19:03:47 +0530
List-Id: <debbugs-submit.debbugs.gnu.org>

mksh and OpenBSD's ksh support an alternative case syntax for historical
reasons [1],

    case $i {
    *pattern) do ;;
    *pattern2) do2 ;;
    }

Currently, sh-mode cannot handle this and the easy way out of writing a
semicolon after $i is out since,

   % case "foo"; { *o) echo 1;; }
   /bin/mksh: syntax error: unexpected ';'

I came with the attached patch after a bit of trial and error but I'm
not sure if it is the right way to do it.

diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el
index 4d2554c087..588d9038e5 100644
--- a/lisp/progmodes/sh-script.el
+++ b/lisp/progmodes/sh-script.el
@@ -1971,9 +1971,10 @@
                              (sh-var-value 'sh-indent-for-case-label)))
     (`(:before . ,(or "(" "{" "[" "while" "if" "for" "case"))
      (cond
-      ((and (equal token "{") (smie-rule-parent-p "for"))
+      ((and (equal token "{") (or (smie-rule-parent-p "for")
+                                  (smie-rule-parent-p "case")))
        (let ((data (smie-backward-sexp "in")))
-         (when (equal (nth 2 data) "for")
+         (when (member (nth 2 data) '("for" "case"))
            `(column . ,(smie-indent-virtual)))))
       ((not (smie-rule-prev-p "&&" "||" "|"))
        (when (smie-rule-hanging-p)

--

[1] Here's what the mksh manual says,

    For historical reasons, open and close braces may be used instead
    of in and esac, for example: “case $foo { (ba[rz]|blah) date ;; }”

and OpenBSD's ksh manual says,

    For historical reasons, open and close braces may be used instead of
    in and esac e.g. case $foo { *) echo bar; }.