]> code.delx.au - gnu-emacs/commitdiff
* lisp/progmodes/sh-script.el (sh-font-lock-paren): Also put punctuation
authorStefan Monnier <monnier@iro.umontreal.ca>
Mon, 29 Oct 2012 00:06:39 +0000 (20:06 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Mon, 29 Oct 2012 00:06:39 +0000 (20:06 -0400)
syntax to the matching opener, if any.
(sh-smie-sh-forward-token, sh-smie-sh-backward-token): Recognize this
matching open as a "case-(".
(sh-smie-rc-grammar): Add a corresponding rule for it.

Fixes: debbugs:12547
lisp/ChangeLog
lisp/progmodes/sh-script.el

index 999a06648aca2086f1fbbc0164d391154a96ccf3..3265f8acf41553e968bafa71671cbf3ba6b73228 100644 (file)
@@ -1,3 +1,11 @@
+2012-10-29  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * progmodes/sh-script.el (sh-font-lock-paren): Also put punctuation
+       syntax to the matching opener, if any (bug#12547).
+       (sh-smie-sh-forward-token, sh-smie-sh-backward-token): Recognize this
+       matching open as a "case-(".
+       (sh-smie-rc-grammar): Add a corresponding rule for it.
+
 2012-10-28  Daniel Hackney  <dan@haxney.org>
 
        * emacs-lisp/package.el (package-generate-autoloads): Kill buffer
index 06ded5fb53da137e2f9393c58df49de63efd3e78..daa83620051ddd21efe0fbe16d1eb4f6410a741f 100644 (file)
@@ -1033,51 +1033,57 @@ subshells can nest."
 (defun sh-font-lock-paren (start)
   (unless (nth 8 (syntax-ppss))
     (save-excursion
-      (goto-char start)
-      ;; Skip through all patterns
-      (while
-          (progn
-            (while
-                (progn
-                  (forward-comment (- (point-max)))
-                  (when (and (eolp) (sh-is-quoted-p (point)))
-                    (forward-char -1)
-                    t)))
-            ;; Skip through one pattern
-            (while
-                (or (/= 0 (skip-syntax-backward "w_"))
-                    (/= 0 (skip-chars-backward "-$=?[]*@/\\\\"))
-                    (and (sh-is-quoted-p (1- (point)))
-                         (goto-char (- (point) 2)))
-                    (when (memq (char-before) '(?\" ?\' ?\}))
-                      (condition-case nil (progn (backward-sexp 1) t)
-                        (error nil)))))
-            ;; Patterns can be preceded by an open-paren (Bug#1320).
-            (if (eq (char-before (point)) ?\()
+      (let ((open nil))
+        (goto-char start)
+        ;; Skip through all patterns
+        (while
+            (progn
+              (while
+                  (progn
+                    (forward-comment (- (point-max)))
+                    (when (and (eolp) (sh-is-quoted-p (point)))
+                      (forward-char -1)
+                      t)))
+              ;; Skip through one pattern
+              (while
+                  (or (/= 0 (skip-syntax-backward "w_"))
+                      (/= 0 (skip-chars-backward "-$=?[]*@/\\\\"))
+                      (and (sh-is-quoted-p (1- (point)))
+                           (goto-char (- (point) 2)))
+                      (when (memq (char-before) '(?\" ?\' ?\}))
+                        (condition-case nil (progn (backward-sexp 1) t)
+                          (error nil)))))
+              ;; Patterns can be preceded by an open-paren (bug#1320).
+              (when (eq (char-before (point)) ?\()
+                (backward-char 1)
+                (setq open (point)))
+              (while (progn
+                       (forward-comment (- (point-max)))
+                       ;; Maybe we've bumped into an escaped newline.
+                       (sh-is-quoted-p (point)))
                 (backward-char 1))
-            (while (progn
-                     (forward-comment (- (point-max)))
-                     ;; Maybe we've bumped into an escaped newline.
-                     (sh-is-quoted-p (point)))
-              (backward-char 1))
-            (when (eq (char-before) ?|)
-              (backward-char 1) t)))
-      (and (> (point) (1+ (point-min)))
-           (progn (backward-char 2)
-                  (if (> start (line-end-position))
-                      (put-text-property (point) (1+ start)
-                                         'syntax-multiline t))
-                  ;; FIXME: The `in' may just be a random argument to
-                  ;; a normal command rather than the real `in' keyword.
-                  ;; I.e. we should look back to try and find the
-                  ;; corresponding `case'.
-                  (and (looking-at ";[;&]\\|\\_<in")
-                       ;; ";; esac )" is a case that looks like a case-pattern
-                       ;; but it's really just a close paren after a case
-                       ;; statement.  I.e. if we skipped over `esac' just now,
-                       ;; we're not looking at a case-pattern.
-                       (not (looking-at "..[ \t\n]+esac[^[:word:]_]"))))
-           sh-st-punc))))
+              (when (eq (char-before) ?|)
+                (backward-char 1) t)))
+        (and (> (point) (1+ (point-min)))
+             (progn (backward-char 2)
+                    (if (> start (line-end-position))
+                        (put-text-property (point) (1+ start)
+                                           'syntax-multiline t))
+                    ;; FIXME: The `in' may just be a random argument to
+                    ;; a normal command rather than the real `in' keyword.
+                    ;; I.e. we should look back to try and find the
+                    ;; corresponding `case'.
+                    (and (looking-at ";[;&]\\|\\_<in")
+                         ;; ";; esac )" is a case that looks
+                         ;; like a case-pattern but it's really just a close
+                         ;; paren after a case statement.  I.e. if we skipped
+                         ;; over `esac' just now, we're not looking
+                         ;; at a case-pattern.
+                         (not (looking-at "..[ \t\n]+esac[^[:word:]_]"))))
+             (progn
+               (when open
+                 (put-text-property open (1+ open) 'syntax-table sh-st-punc))
+               sh-st-punc))))))
 
 (defun sh-font-lock-backslash-quote ()
   (if (eq (save-excursion (nth 3 (syntax-ppss (match-beginning 0)))) ?\')
@@ -1629,7 +1635,8 @@ before the newline and in that case point should be just before the token."
            (cmd "|" cmd) (cmd "|&" cmd)
            (cmd "&&" cmd) (cmd "||" cmd)
            (cmd ";" cmd) (cmd "&" cmd))
-      (pattern (pattern "|" pattern))
+      (rpattern (rpattern "|" rpattern))
+      (pattern (rpattern) ("case-(" rpattern))
       (branches (branches ";;" branches)
                 (branches ";&" branches) (branches ";;&" branches) ;bash.
                 (pattern "case-)" cmd)))
@@ -1715,6 +1722,7 @@ Does not preserve point."
              (tok (smie-default-forward-token)))
         (cond
          ((equal tok ")") "case-)")
+         ((equal tok "(") "case-(")
          ((and tok (string-match "\\`[a-z]" tok)
                (assoc tok smie-grammar)
                (not
@@ -1759,6 +1767,7 @@ Does not preserve point."
       (let ((tok (smie-default-backward-token)))
         (cond
          ((equal tok ")") "case-)")
+         ((equal tok "(") "case-(")
          ((and tok (string-match "\\`[a-z]" tok)
                (assoc tok smie-grammar)
                (not (save-excursion (sh-smie--sh-keyword-p tok))))