From: matz@... (Yukihiro Matsumoto) Date: 2003-08-23T11:45:31+09:00 Subject: Re: [PATCH] my next attempt... (Was: [PATCH] ruby-mode.el) Hi, In message "[PATCH] my next attempt... (Was: [PATCH] ruby-mode.el)" on 03/08/23, Ryan Pavlik writes: |I did not realize this. :-) Thanks. Here's an updated version, plus a |test-case file that I hope catches most variation. Nice. Here's the one I made from the latest CVS. Can you confirm? matz. Index: ruby-mode.el =================================================================== RCS file: /src/ruby/misc/ruby-mode.el,v retrieving revision 1.69 diff -p -u -1 -r1.69 ruby-mode.el --- ruby-mode.el 15 Apr 2003 15:14:15 -0000 1.69 +++ ruby-mode.el 23 Aug 2003 02:44:17 -0000 @@ -49,2 +49,17 @@ +(defconst ruby-here-doc-beg-re + (concat "<<\\([-]\\)?\\([a-zA-Z0-9]+\\)\\|" + "<<\\([-]\\)?[\"]\\([^\"]+\\)[\"]\\|" + "<<\\([-]\\)?[']\\([^']+\\)[']")) + +(defun ruby-here-doc-end-match () + (concat "^" + (if (or (match-string 1) + (match-string 3) + (match-string 5)) + "[ \t]*" nil) + (or (match-string 2) + (match-string 4) + (match-string 6)))) + (defconst ruby-delimiter @@ -53,3 +68,3 @@ "\\|" ruby-block-end-re - "\\)\\>\\|^=begin") + "\\)\\>\\|^=begin\\|" ruby-here-doc-beg-re) ) @@ -520,2 +535,8 @@ The variable ruby-indent-level controls (goto-char pnt)) + ((looking-at ruby-here-doc-beg-re) + (if (re-search-forward (ruby-here-doc-end-match) + indent-point t) + (forward-line 1) + (setq in-string (match-end 0)) + (goto-char indent-point))) (t @@ -1049,2 +1070,31 @@ balanced expression is found." + (defun ruby-font-lock-here-docs (limit) + (if (re-search-forward ruby-here-doc-beg-re limit t) + (let (beg) + (beginning-of-line) + (forward-line) + (setq beg (point)) + (if (re-search-forward (ruby-here-doc-end-match) nil t) + (progn + (set-match-data (list beg (point))) + t))))) + + (defun ruby-font-lock-maybe-here-docs (limit) + (let (beg) + (save-excursion + (if (re-search-backward ruby-here-doc-beg-re nil t) + (progn + (beginning-of-line) + (forward-line) + (setq beg (point))))) + (let ((end-match (ruby-here-doc-end-match))) + (if (and beg + (not (re-search-backward end-match beg t)) + (re-search-forward end-match nil t)) + (progn + (set-match-data (list beg (point))) + t) + nil)))) + + (defvar ruby-font-lock-keywords @@ -1111,2 +1161,9 @@ balanced expression is found." 0 font-lock-comment-face t) + ;; "here" document + '(ruby-font-lock-here-docs + 0 font-lock-string-face t) + '(ruby-font-lock-maybe-here-docs + 0 font-lock-string-face t) + `(,ruby-here-doc-beg-re + 0 font-lock-string-face t) ;; constants