]> git.eshelyaron.com Git - emacs.git/commitdiff
* lisp/progmodes/sh-script.el (sh-font-lock-quoted-subshell): Try to better
authorStefan Monnier <monnier@iro.umontreal.ca>
Wed, 3 Sep 2014 00:38:49 +0000 (20:38 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Wed, 3 Sep 2014 00:38:49 +0000 (20:38 -0400)
handle multiline elements.

Fixes: debbugs:18380
lisp/ChangeLog
lisp/progmodes/sh-script.el

index 5f89308e59731e6b7b6741f45d3227d9b683a160..3edfdad0cf037736588b9f14b93c35095aafd627 100644 (file)
@@ -1,3 +1,8 @@
+2014-09-03  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+       * progmodes/sh-script.el (sh-font-lock-quoted-subshell): Try to better
+       handle multiline elements (bug#18380).
+
 2014-09-01  Eli Zaretskii  <eliz@gnu.org>
 
        * ls-lisp.el (ls-lisp-use-string-collate)
@@ -7,8 +12,7 @@
        (ls-lisp-version-lessp): New function.
        (ls-lisp-handle-switches): Use it to implement the -v switch of
        GNU ls.
-       (ls-lisp--insert-directory): Mention the -v switch in the doc
-       string.
+       (ls-lisp--insert-directory): Mention the -v switch in the doc string.
 
 2014-08-31  Christoph Scholtes  <cschol2112@gmail.com>
 
@@ -16,8 +20,8 @@
        `quit-window' via `special-mode'.
        (ibuffer-mode-map): Use keybindings from special-mode-map instead
        of local overrides.
-       (ibuffer): Don't store previous windows configuration. Let
-       `quit-window' handle restoring.
+       (ibuffer): Don't store previous windows configuration.
+       Let `quit-window' handle restoring.
        (ibuffer-quit): Remove function. Use `quit-window' instead.
        (ibuffer-restore-window-config-on-quit): Remove variable.
        (ibuffer-prev-window-config): Remove variable.
index 3b0550dcccaaa858aeb60236a5e10f2ba52864cb..5631358b472bcfb4408529892ea45358922edff1 100644 (file)
@@ -1051,13 +1051,11 @@ Point is at the beginning of the next line."
   "Search for a subshell embedded in a string.
 Find all the unescaped \" characters within said subshell, remembering that
 subshells can nest."
-  ;; FIXME: This can (and often does) match multiple lines, yet it makes no
-  ;; effort to handle multiline cases correctly, so it ends up being
-  ;; rather flaky.
   (when (eq ?\" (nth 3 (syntax-ppss))) ; Check we matched an opening quote.
     ;; bingo we have a $( or a ` inside a ""
     (let (;; `state' can be: double-quote, backquote, code.
           (state (if (eq (char-before) ?`) 'backquote 'code))
+          (startpos (point))
           ;; Stacked states in the context.
           (states '(double-quote)))
       (while (and state (progn (skip-chars-forward "^'\\\\\"`$()" limit)
@@ -1088,7 +1086,12 @@ subshells can nest."
                  (`double-quote nil)
                  (_ (setq state (pop states)))))
           (_ (error "Internal error in sh-font-lock-quoted-subshell")))
-        (forward-char 1)))))
+        (forward-char 1))
+      (when (< startpos (line-beginning-position))
+        (put-text-property startpos (point) 'syntax-multiline t)
+        (add-hook 'syntax-propertize-extend-region-functions
+                  'syntax-propertize-multiline nil t))
+      )))
 
 
 (defun sh-is-quoted-p (pos)