From: Stefan Monnier Date: Wed, 10 Jun 2015 02:10:38 +0000 (-0400) Subject: * lisp/progmodes/sh-script.el: Better handle nested quotes X-Git-Tag: emacs-25.0.90~1815 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=06193432f2c38811a4be075274bb5be014f9b594;p=emacs.git * lisp/progmodes/sh-script.el: Better handle nested quotes (sh-here-doc-open-re): Don't mis-match the <<< operator (bug#20683). (sh-font-lock-quoted-subshell): Make sure double quotes within single quotes don't mistakenly end prematurely the surrounding string. --- diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el index 537b180eed6..6709e751ecd 100644 --- a/lisp/progmodes/sh-script.el +++ b/lisp/progmodes/sh-script.el @@ -987,7 +987,7 @@ See `sh-feature'.") "\\(?:\\(?:.*[^\\\n]\\)?\\(?:\\\\\\\\\\)*\\\\\n\\)*.*") (defconst sh-here-doc-open-re - (concat "<<-?\\s-*\\\\?\\(\\(?:['\"][^'\"]+['\"]\\|\\sw\\|[-/~._]\\)+\\)" + (concat "[^<]<<-?\\s-*\\\\?\\(\\(?:['\"][^'\"]+['\"]\\|\\sw\\|[-/~._]\\)+\\)" sh-escaped-line-re "\\(\n\\)"))) (defun sh--inside-noncommand-expression (pos) @@ -1064,7 +1064,16 @@ subshells can nest." (pcase (char-after) (?\' (pcase state (`double-quote nil) - (_ (forward-char 1) (skip-chars-forward "^'" limit)))) + (_ (forward-char 1) + ;; FIXME: mark skipped double quotes as punctuation syntax. + (let ((spos (point))) + (skip-chars-forward "^'" limit) + (save-excursion + (let ((epos (point))) + (goto-char spos) + (while (search-forward "\"" epos t) + (put-text-property (point) (1- (point)) + 'syntax-table '(1))))))))) (?\\ (forward-char 1)) (?\" (pcase state (`double-quote (setq state (pop states)))