changeset 81313:8021008d25bf

(sh-font-lock-backslash-quote, sh-font-lock-flush-syntax-ppss-cache): New funs. (sh-font-lock-syntactic-keywords): Use them to distinguish the different possible cases for \'.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Mon, 11 Jun 2007 22:16:43 +0000
parents b6eaf964a6cf
children 5671bcc5449a
files lisp/ChangeLog lisp/progmodes/sh-script.el
diffstat 2 files changed, 24 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Mon Jun 11 22:10:24 2007 +0000
+++ b/lisp/ChangeLog	Mon Jun 11 22:16:43 2007 +0000
@@ -1,5 +1,10 @@
 2007-06-11  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+	* progmodes/sh-script.el (sh-font-lock-backslash-quote)
+	(sh-font-lock-flush-syntax-ppss-cache): New functions.
+	(sh-font-lock-syntactic-keywords): Use them to distinguish the
+	different possible cases for \'.
+
 	* complete.el (PC-bindings): Don't bind things already bound in the
 	parent keymap.
 
--- a/lisp/progmodes/sh-script.el	Mon Jun 11 22:10:24 2007 +0000
+++ b/lisp/progmodes/sh-script.el	Mon Jun 11 22:16:43 2007 +0000
@@ -884,7 +884,7 @@
 (defconst sh-here-doc-syntax (string-to-syntax "|")) ;; generic string
 
 (defconst sh-escaped-line-re
-  ;; Should match until the real end-of-continued line, but if that is not
+  ;; Should match until the real end-of-continued-line, but if that is not
   ;; possible (because we bump into EOB or the search bound), then we should
   ;; match until the search bound.
   "\\(?:\\(?:.*[^\\\n]\\)?\\(?:\\\\\\\\\\)*\\\\\n\\)*.*")
@@ -1062,6 +1062,19 @@
     (when (save-excursion (backward-char 2) (looking-at ";;\\|in"))
       sh-st-punc)))
 
+(defun sh-font-lock-backslash-quote ()
+  (if (eq (save-excursion (nth 3 (syntax-ppss (match-beginning 0)))) ?\')
+      ;; In a '...' the backslash is not escaping.
+      sh-st-punc
+    nil))
+
+(defun sh-font-lock-flush-syntax-ppss-cache (limit)
+  ;; This should probably be a standard function provided by font-lock.el
+  ;; (or syntax.el).
+  (syntax-ppss-flush-cache (point))
+  (goto-char limit)
+  nil)
+
 (defun sh-apply-quoted-subshell ()
   "Apply the `sh-st-punc' syntax to all the matches in `match-data'.
 This is used to flag quote characters in subshell constructs inside strings
@@ -1080,7 +1093,11 @@
   ;; of the shell command language (under `quoting') but with `$' removed.
   `(("[^|&;<>()`\\\"' \t\n]\\(#+\\)" 1 ,sh-st-symbol)
     ;; In a '...' the backslash is not escaping.
-    ("\\(\\\\\\)'" 1 ,sh-st-punc)
+    ("\\(\\\\\\)'" (1 (sh-font-lock-backslash-quote)))
+    ;; The previous rule uses syntax-ppss, but the subsequent rules may
+    ;; change the syntax, so we have to tell syntax-ppss that the states it
+    ;; has just computed will need to be recomputed.
+    (sh-font-lock-flush-syntax-ppss-cache)
     ;; Make sure $@ and @? are correctly recognized as sexps.
     ("\\$\\([?@]\\)" 1 ,sh-st-symbol)
     ;; Find HEREDOC starters and add a corresponding rule for the ender.