]> code.delx.au - gnu-emacs/commitdiff
(sh-font-lock-paren): Mark the relevant text with font-lock-multiline.
authorStefan Monnier <monnier@iro.umontreal.ca>
Mon, 18 Jun 2007 20:10:06 +0000 (20:10 +0000)
committerStefan Monnier <monnier@iro.umontreal.ca>
Mon, 18 Jun 2007 20:10:06 +0000 (20:10 +0000)
lisp/progmodes/sh-script.el

index b29cf7fb1417bf09af781007ebfa38e7ad90c8eb..4eea5e4925d58d89b22084323cfb1b8db4d3d10a 100644 (file)
 ;; disadvantages:
 ;; 1. We need to scan the buffer to find which ")" symbols belong to a
 ;;    case alternative, to find any here documents, and handle "$#".
-;; 2. Setting the text property makes the buffer modified.  If the
-;;    buffer is read-only buffer we have to cheat and bypass the read-only
-;;    status.  This is for cases where the buffer started read-only buffer
-;;    but the user issued `toggle-read-only'.
 ;;
 ;;     Bugs
 ;;     ----
 ;;
 ;; - `sh-learn-buffer-indent' is extremely slow.
 ;;
+;; - "case $x in y) echo ;; esac)" the last ) is mis-identified as being
+;;   part of a case-pattern.  You need to add a semi-colon after "esac" to
+;;   coerce sh-script into doing the right thing.
+;;
+;; - "echo $z in ps | head)" the last ) is mis-identified as being part of
+;;   a case-pattern.  You need to put the "in" between quotes to coerce
+;;   sh-script into doing the right thing.
+;;
+;; - A line starting with "}>foo" is not indented like "} >foo".
+;;
 ;; Richard Sharman <rsharman@pobox.com>  June 1999.
 
 ;;; Code:
@@ -1052,7 +1058,18 @@ subshells can nest."
             (backward-char 1))
          (when (eq (char-before) ?|)
            (backward-char 1) t)))
-    (when (save-excursion (backward-char 2) (looking-at ";;\\|in"))
+    ;; FIXME: ";; 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.
+    (when (progn (backward-char 2)
+                 (if (> start (line-end-position))
+                     (put-text-property (point) (1+ start)
+                                        'font-lock-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'.
+                 (looking-at ";;\\|in"))
       sh-st-punc)))
 
 (defun sh-font-lock-backslash-quote ()