From: Stefan Monnier Date: Wed, 9 Feb 2011 18:59:55 +0000 (-0500) Subject: * lisp/progmodes/sh-script.el (sh-font-lock-open-heredoc): Fix case X-Git-Tag: emacs-pretest-24.0.90~104^2~275^2~953 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=ccded26c1e57045a8941dd69b2566ac9a49cfe4b;p=emacs.git * lisp/progmodes/sh-script.el (sh-font-lock-open-heredoc): Fix case 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. --- diff --git a/ChangeLog b/ChangeLog index 8b7b674470c..d75ec5150f7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2011-02-09 Stefan Monnier + + * .bzrignore: Ignore globals.h and related stamp. + 2011-02-09 Paul Eggert * lib/Makefile.in, lib/gnulib.mk: Regenerate. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index dd3bb3d475c..67276ef574d 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,8 @@ +2011-02-09 Stefan Monnier + + * progmodes/sh-script.el (sh-font-lock-open-heredoc): Fix case + of here-doc that immediately follows a comment. + 2011-02-09 Deniz Dogan * net/rcirc.el (rcirc-ctcp-sender-PING): Simplifying. diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el index d80d814156e..900072fe356 100644 --- a/lisp/progmodes/sh-script.el +++ b/lisp/progmodes/sh-script.el @@ -948,12 +948,12 @@ Point is at the beginning of the next line." ;; We're looking at <" - (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)) diff --git a/test/ChangeLog b/test/ChangeLog index f555878cb49..3f2dbec1e55 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,8 @@ +2011-02-09 Stefan Monnier + + * indent/shell.sh: + * indent/shell.rc: New files. + 2011-01-27 Chong Yidong * automated/font-parse-tests.el: Move from diff --git a/test/indent/shell.rc b/test/indent/shell.rc new file mode 100755 index 00000000000..841223555b9 --- /dev/null +++ b/test/indent/shell.rc @@ -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 index 00000000000..89f47d0bfe3 --- /dev/null +++ b/test/indent/shell.sh @@ -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 <