diff options
author | Stefan Monnier <monnier@iro.umontreal.ca> | 2015-06-09 22:10:38 -0400 |
---|---|---|
committer | Stefan Monnier <monnier@iro.umontreal.ca> | 2015-06-09 22:10:38 -0400 |
commit | 06193432f2c38811a4be075274bb5be014f9b594 (patch) | |
tree | ed22a002bb71e1149df785f4cc3be114a37ef27d /lisp | |
parent | 26a17f5ac9b5b996cb1598607441b3e29be8e00b (diff) | |
download | emacs-06193432f2c38811a4be075274bb5be014f9b594.tar.gz |
* 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.
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/progmodes/sh-script.el | 13 |
1 files 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))) |