summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2017-07-24 18:10:02 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2017-07-24 18:10:02 -0400
commit3d847fa9fd68592c50ea5e18c86b9f3eb5030654 (patch)
tree1f7f061eccffd3cf04c862b62c4d3e2cdb921ea2 /lisp
parent69fb12a66b3d6b9bfb55d8bcd58bec2a8e7ca55b (diff)
downloademacs-3d847fa9fd68592c50ea5e18c86b9f3eb5030654.tar.gz
* lisp/progmodes/perl-mode.el: Add support for indented here docs
* lisp/progmodes/perl-mode.el (perl-syntax-propertize-function): Recognize the new <<~ syntax for indented here docs. (perl-syntax-propertize-special-constructs): Adjust search of the end of here docs accordingly. * test/manual/indent/perl.perl: Add test for indented here docs.
Diffstat (limited to 'lisp')
-rw-r--r--lisp/progmodes/perl-mode.el43
1 files changed, 14 insertions, 29 deletions
diff --git a/lisp/progmodes/perl-mode.el b/lisp/progmodes/perl-mode.el
index 3def37a2ea8..6197a53ee66 100644
--- a/lisp/progmodes/perl-mode.el
+++ b/lisp/progmodes/perl-mode.el
@@ -213,25 +213,6 @@
(regexp-opt perl--syntax-exp-intro-keywords)
"\\|[-?:.,;|&+*=!~({[]\\|\\(^\\)\\)[ \t\n]*")))
-;; FIXME: handle here-docs and regexps.
-;; <<EOF <<"EOF" <<'EOF' (no space)
-;; see `man perlop'
-;; ?...?
-;; /.../
-;; m [...]
-;; m /.../
-;; q /.../ = '...'
-;; qq /.../ = "..."
-;; qx /.../ = `...`
-;; qr /.../ = precompiled regexp =~=~ m/.../
-;; qw /.../
-;; s /.../.../
-;; s <...> /.../
-;; s '...'...'
-;; tr /.../.../
-;; y /.../.../
-;;
-;; <file*glob>
(defun perl-syntax-propertize-function (start end)
(let ((case-fold-search nil))
(goto-char start)
@@ -324,23 +305,25 @@
((concat
"\\(?:"
;; << "EOF", << 'EOF', or << \EOF
- "<<[ \t]*\\('[^'\n]*'\\|\"[^\"\n]*\"\\|\\\\[[:alpha:]][[:alnum:]]*\\)"
+ "<<\\(~\\)?[ \t]*\\('[^'\n]*'\\|\"[^\"\n]*\"\\|\\\\[[:alpha:]][[:alnum:]]*\\)"
;; The <<EOF case which needs perl--syntax-exp-intro-regexp, to
;; disambiguate with the left-bitshift operator.
- "\\|" perl--syntax-exp-intro-regexp "<<\\(?1:\\sw+\\)\\)"
+ "\\|" perl--syntax-exp-intro-regexp "<<\\(?2:\\sw+\\)\\)"
".*\\(\n\\)")
- (3 (let* ((st (get-text-property (match-beginning 3) 'syntax-table))
- (name (match-string 1)))
- (goto-char (match-end 1))
+ (4 (let* ((st (get-text-property (match-beginning 4) 'syntax-table))
+ (name (match-string 2))
+ (indented (match-beginning 1)))
+ (goto-char (match-end 2))
(if (save-excursion (nth 8 (syntax-ppss (match-beginning 0))))
;; Leave the property of the newline unchanged.
st
(cons (car (string-to-syntax "< c"))
;; Remember the names of heredocs found on this line.
- (cons (pcase (aref name 0)
- (`?\\ (substring name 1))
- ((or `?\" `?\' `?\`) (substring name 1 -1))
- (_ name))
+ (cons (cons (pcase (aref name 0)
+ (`?\\ (substring name 1))
+ ((or `?\" `?\' `?\`) (substring name 1 -1))
+ (_ name))
+ indented)
(cdr st)))))))
;; We don't call perl-syntax-propertize-special-constructs directly
;; from the << rule, because there might be other elements (between
@@ -383,7 +366,9 @@
(goto-char (nth 8 state)))
(while (and names
(re-search-forward
- (concat "^" (regexp-quote (pop names)) "\n")
+ (pcase-let ((`(,name . ,indented) (pop names)))
+ (concat "^" (if indented "[ \t]*")
+ (regexp-quote name) "\n"))
limit 'move))
(unless names
(put-text-property (1- (point)) (point) 'syntax-table