]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/progmodes/sh-script.el (sh-font-lock-open-heredoc): Fix case
authorStefan Monnier <monnier@iro.umontreal.ca>
Wed, 9 Feb 2011 18:59:55 +0000 (13:59 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Wed, 9 Feb 2011 18:59:55 +0000 (13:59 -0500)
of here-doc that immediately follows a comment.
* .bzrignore: Ignore globals.h and related stamp.
* test/indent/shell.sh:
* test/indent/shell.rc: New files.

ChangeLog
lisp/ChangeLog
lisp/progmodes/sh-script.el
test/ChangeLog
test/indent/shell.rc [new file with mode: 0755]
test/indent/shell.sh [new file with mode: 0755]

index 8b7b674470c06291a9a4e61f00a6dcaa736720de..d75ec5150f7d45741fabf87660b5bbb9ab65b955 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2011-02-09  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * .bzrignore: Ignore globals.h and related stamp.
+
 2011-02-09  Paul Eggert  <eggert@cs.ucla.edu>
 
        * lib/Makefile.in, lib/gnulib.mk: Regenerate.
index dd3bb3d475ceedaca9d30e28ca94f94777d63e9a..67276ef574de71ca14b3ca7aa38db31d59cc42e3 100644 (file)
@@ -1,3 +1,8 @@
+2011-02-09  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * progmodes/sh-script.el (sh-font-lock-open-heredoc): Fix case
+       of here-doc that immediately follows a comment.
+
 2011-02-09  Deniz Dogan  <deniz.a.m.dogan@gmail.com>
 
        * net/rcirc.el (rcirc-ctcp-sender-PING): Simplifying.
index d80d814156e95742a606c9b1d8f1ae9a83d1a67b..900072fe356965aa1b24129b7459039f270e5855 100644 (file)
@@ -948,12 +948,12 @@ Point is at the beginning of the next line."
     ;; We're looking at <<STRING, so we add "^STRING$" to the syntactic
     ;; font-lock keywords to detect the end of this here document.
     (let ((str (replace-regexp-in-string "['\"]" "" string))
-          (ppss (save-excursion (syntax-ppss (1- (point))))))
+          (ppss (save-excursion (syntax-ppss eol))))
       (if (nth 4 ppss)
           ;; The \n not only starts the heredoc but also closes a comment.
           ;; Let's close the comment just before the \n.
-          (put-text-property (1- (point)) (point) 'syntax-table '(12))) ;">"
-      (if (or (nth 5 ppss) (> (count-lines start (point)) 1))
+          (put-text-property (1- eol) eol 'syntax-table '(12))) ;">"
+      (if (or (nth 5 ppss) (> (count-lines start eol) 1))
           ;; If the sh-escaped-line-re part of sh-here-doc-open-re has matched
           ;; several lines, make sure we refontify them together.
           ;; Furthermore, if (nth 5 ppss) is non-nil (i.e. the \n is
@@ -961,7 +961,7 @@ Point is at the beginning of the next line."
           ;; Don't bother fixing it now, but place a multiline property so
           ;; that when jit-lock-context-* refontifies the rest of the
           ;; buffer, it also refontifies the current line with it.
-          (put-text-property start (point) 'syntax-multiline t))
+          (put-text-property start (1+ eol) 'syntax-multiline t))
       (put-text-property eol (1+ eol) 'sh-here-doc-marker str)
       (prog1 sh-here-doc-syntax
         (goto-char (+ 2 start))))))
@@ -1083,33 +1083,33 @@ subshells can nest."
 (defun sh-syntax-propertize-function (start end)
   (goto-char start)
   (sh-syntax-propertize-here-doc end)
-               (funcall
-                (syntax-propertize-rules
+  (funcall
+   (syntax-propertize-rules
     (sh-here-doc-open-re
      (2 (sh-font-lock-open-heredoc
          (match-beginning 0) (match-string 1) (match-beginning 2))))
     ("\\s|" (0 (prog1 nil (sh-syntax-propertize-here-doc end))))
-                 ;; A `#' begins a comment when it is unquoted and at the
-                 ;; beginning of a word.  In the shell, words are separated by
-                 ;; metacharacters.  The list of special chars is taken from
-                 ;; the single-unix spec of the shell command language (under
-                 ;; `quoting') but with `$' removed.
-                 ("[^|&;<>()`\\\"' \t\n]\\(#+\\)" (1 "_"))
-                 ;; In a '...' the backslash is not escaping.
-                 ("\\(\\\\\\)'" (1 (sh-font-lock-backslash-quote)))
-                 ;; Make sure $@ and $? are correctly recognized as sexps.
-                 ("\\$\\([?@]\\)" (1 "_"))
-                 ;; Distinguish the special close-paren in `case'.
-                 (")" (0 (sh-font-lock-paren (match-beginning 0))))
-                 ;; Highlight (possibly nested) subshells inside "" quoted
-                 ;; regions correctly.
+    ;; A `#' begins a comment when it is unquoted and at the
+    ;; beginning of a word.  In the shell, words are separated by
+    ;; metacharacters.  The list of special chars is taken from
+    ;; the single-unix spec of the shell command language (under
+    ;; `quoting') but with `$' removed.
+    ("[^|&;<>()`\\\"' \t\n]\\(#+\\)" (1 "_"))
+    ;; In a '...' the backslash is not escaping.
+    ("\\(\\\\\\)'" (1 (sh-font-lock-backslash-quote)))
+    ;; Make sure $@ and $? are correctly recognized as sexps.
+    ("\\$\\([?@]\\)" (1 "_"))
+    ;; Distinguish the special close-paren in `case'.
+    (")" (0 (sh-font-lock-paren (match-beginning 0))))
+    ;; Highlight (possibly nested) subshells inside "" quoted
+    ;; regions correctly.
     ("\"\\(?:\\(?:[^\\\"]\\|\\)*?[^\\]\\(?:\\\\\\\\\\)*\\)??\\(\\$(\\|`\\)"
-                  (1 (ignore
-                      ;; Save excursion because we want to also apply other
-                      ;; syntax-propertize rules within the affected region.
+     (1 (ignore
+         ;; Save excursion because we want to also apply other
+         ;; syntax-propertize rules within the affected region.
          (if (nth 8 (syntax-ppss))
              (goto-char (1+ (match-beginning 0)))
-                      (save-excursion
+           (save-excursion
              (sh-font-lock-quoted-subshell end)))))))
    (point) end))
 
index f555878cb496101a995e44a3de6b3b0967f873f2..3f2dbec1e554e1982066596a3687ebbe88694d7b 100644 (file)
@@ -1,3 +1,8 @@
+2011-02-09  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * indent/shell.sh:
+       * indent/shell.rc: New files.
+
 2011-01-27  Chong Yidong  <cyd@stupidchicken.com>
 
        * automated/font-parse-tests.el: Move from
diff --git a/test/indent/shell.rc b/test/indent/shell.rc
new file mode 100755 (executable)
index 0000000..8412235
--- /dev/null
@@ -0,0 +1,30 @@
+#!/bin/rc
+
+if (foo) {
+    echo 1
+}
+if not {
+    echo 2
+}
+
+if (foo)
+   echo 3                      # KNOWN INDENT BUG
+if not
+   echo 4                      # KNOWN INDENT BUG
+
+switch ($a) {
+    case 3
+       echo 4
+    case 5
+       echo 7
+       for (i in a b c) {
+            echo $i
+       }
+        for (i in a b c)
+            echo "$i"           # KNOWN INDENT BUG
+        echo titi
+
+    case *
+       echo other
+}
+
diff --git a/test/indent/shell.sh b/test/indent/shell.sh
new file mode 100755 (executable)
index 0000000..89f47d0
--- /dev/null
@@ -0,0 +1,98 @@
+#!/bin/sh
+
+setlock -n /tmp/getmail.lock && echo getmail isn\'t running
+
+# adsgsdg
+
+foo () {
+
+    bar () {
+        blilbi
+    }
+
+    case toto
+    in a) hello                 # KNOWN INDENT BUG
+    ;; b) hi                    # KNOWN INDENT BUG
+    esac
+
+    case $toto in
+        a) echo 1;; b) echo 2;;
+        c) echo 3;;
+    esac
+    
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+        *${as_nl}ac_space=\ *)
+            # `set' does not quote correctly, so add quotes: double-quote
+            # substitution turns \\\\ into \\, and sed turns \\ into \.
+            sed -n \
+               "s/'/'\\\\''/g;
+                 s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=/\\1=''/p"
+            ;; #(
+        *)
+            # `set' quotes correctly as required by POSIX, so do not add
+            # quotes.
+            sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+            ;;
+    esac |
+        cat                     # KNOWN INDENT BUG
+    
+    case toto in
+        -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+            | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* \
+            | --exec=* | --exe=* | --ex=*)
+            exec_prefix=$ac_optarg ;;
+        5)
+            hello ;;
+        3) hello $(adfad)
+           echo esac ;;         # KNOWN INDENT BUG
+        5) hello ;;
+        4) hello ;&
+        4) hello ;;&
+        5) hello ;;
+        5) hello ;;
+    esac
+    
+    echo "'" wfgfe
+
+    #!/bin/bash
+    cat << EOF \
+        | cat sadfsafd \
+              sadfsafd           "KNOWN INDENT BUG" \
+        | tee -a bug.txt
+asdfsaf
+This is a test case for a bug in bash shell mode text highlighting
+EOF
+
+    cat <<EOF1 <<EOF2           # KNOWN INDENT BUG
+help1
+EOF1
+help2
+EOF2
+}
+bar () {
+    if [ $# == 0 ]; then
+        while
+            f                   # KNOWN INDENT BUG
+        do
+            bla;
+        done
+        echo "Highlighting is screwed up now"
+        if [ 1 = 1 ]; then
+            # adsgsdg
+            echo "screwed up"
+        fi
+        
+        $@ $? $#
+        
+        for f in *
+        do
+            sdfg
+        done
+        
+        if swrgfef
+        then blas
+        else sdf
+        fi
+        
+    fi
+}