Fix here-doc highlighting
authorDaniel Colascione <dancol@dancol.org>
Tue, 21 Jan 2014 23:42:59 +0000 (15:42 -0800)
committerDaniel Colascione <dancol@dancol.org>
Tue, 21 Jan 2014 23:42:59 +0000 (15:42 -0800)
lisp/ChangeLog
lisp/progmodes/sh-script.el

index 94966f6..6bdf446 100644 (file)
@@ -1,3 +1,12 @@
+2014-01-21  Daniel Colascione  <dancol@dancol.org>
+
+       * progmodes/sh-script.el (sh--inside-noncommand-expression):
+       Correctly detect when we're inside an arithmetic expansion form
+       containing nested parenthesis.
+       (sh--maybe-here-document): Use `sh--inside-noncommand-expression`
+       to detect cases where we shouldn't expand "<<" to a heredoc
+       skeleton.
+
 2014-01-21  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * emacs-lisp/eldoc.el: Properly remove message in minibuffer case.
index daf8d29..f41378f 100644 (file)
@@ -975,11 +975,14 @@ See `sh-feature'.")
     (let ((ppss (syntax-ppss pos)))
       (when (nth 1 ppss)
         (goto-char (nth 1 ppss))
-        (pcase (char-after)
-          ;; $((...)) or $[...] or ${...}.
-          (`?\( (and (eq ?\( (char-before))
-                     (eq ?\$ (char-before (1- (point))))))
-          ((or `?\{ `?\[) (eq ?\$ (char-before))))))))
+        (or
+         (pcase (char-after)
+           ;; ((...)) or $((...)) or $[...] or ${...}. Nested
+           ;; parenthesis can occur inside the first of these forms, so
+           ;; parse backward recursively.
+           (`?\( (eq ?\( (char-before)))
+           ((or `?\{ `?\[) (eq ?\$ (char-before))))
+         (sh--inside-noncommand-expression (1- (point))))))))
 
 (defun sh-font-lock-open-heredoc (start string eol)
   "Determine the syntax of the \\n after a <<EOF.
@@ -4265,7 +4268,8 @@ The document is bounded by `sh-here-document-word'."
   (or (not (looking-back "[^<]<<"))
       (save-excursion
        (backward-char 2)
-       (sh-quoted-p))
+        (or (sh-quoted-p)
+            (sh--inside-noncommand-expression (point))))
       (nth 8 (syntax-ppss))
       (let ((tabs (if (string-match "\\`-" sh-here-document-word)
                       (make-string (/ (current-indentation) tab-width) ?\t)