From 06193432f2c38811a4be075274bb5be014f9b594 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Tue, 9 Jun 2015 22:10:38 -0400 Subject: [PATCH] * 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. --- lisp/progmodes/sh-script.el | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) 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))) -- 2.39.2