[#1378] differences between Module and Class ? — Mathieu Bouchard <matju@...>

25 messages 2003/08/11
[#1387] Re: differences between Module and Class ? — matz@... (Yukihiro Matsumoto) 2003/08/12

Hi,

[#1442] Re: differences between Module and Class ? — Mathieu Bouchard <matju@...> 2003/08/21

[#1406] _id2ref bug? — Ryan Pavlik <rpav@...>

While debugging some caching code, I've come across a segfault related

22 messages 2003/08/14
[#1407] Re: _id2ref bug? — matz@... (Yukihiro Matsumoto) 2003/08/14

Hi,

[#1413] Re: _id2ref bug? (REPRODUCED, short) — Ryan Pavlik <rpav@...> 2003/08/14

On Fri, 15 Aug 2003 01:57:18 +0900

[PATCH] my next attempt... (Was: [PATCH] ruby-mode.el)

From: Ryan Pavlik <rpav@...>
Date: 2003-08-22 21:00:57 UTC
List: ruby-core #1466
On Sat, 23 Aug 2003 01:28:01 +0900
matz@ruby-lang.org (Yukihiro Matsumoto) wrote:

> Hi,
> 
> In message "Re: [PATCH] ruby-mode.el"
>     on 03/08/22, Ryan Pavlik <rpav@mephle.com> writes:
> 
> |I haven't had any problems with this version.
> 
> Looks nice.  But heredoc terminator can be any identifier or string,
> so that regex is better to be extended.
> 
> 							matz.

I did not realize this. :-)  Thanks.  Here's an updated version, plus a
test-case file that I hope catches most variation.

-- 
Ryan Pavlik <rpav@mephle.com>

"Well, I don't like to brag, but I *am* a villain after all." - 8BT

Attachments (2)

ruby-mode.el.patch (2.68 KB, text/x-diff)
--- ruby-mode.el	2003-08-21 11:52:27.000000000 -0700
+++ ruby-mode.el-rpav	2003-08-22 13:52:32.000000000 -0700
@@ -57,11 +57,26 @@
 
 (defconst ruby-block-end-re "end")
 
+(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
   (concat "[?$/%(){}#\"'`.:]\\|\\[\\|\\]\\|\\<\\("
 	  ruby-block-beg-re
 	  "\\|" ruby-block-end-re
-	  "\\)\\>\\|^=begin")
+	  "\\)\\>\\|^=begin\\|" ruby-here-doc-beg-re)
   )
 
 (defconst ruby-negative
@@ -452,6 +467,12 @@
 		    (forward-line 1)
 		  (setq in-string (match-end 0))
 		  (goto-char indent-point)))
+	       ((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
 		(error (format "bad string %s"
 			       (buffer-substring (point) pnt)
@@ -775,6 +796,35 @@
 	    t)
 	nil)))
 
+  (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
     (list
      (cons (concat
@@ -833,6 +883,13 @@
        0 font-lock-comment-face t)
      '(ruby-font-lock-maybe-docs
        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
      '("\\(^\\|[^_]\\)\\b\\([A-Z]+\\(\\w\\|_\\)*\\)"
        2 font-lock-type-face)
test.rb (347 Bytes, text/x-ruby)
puts <<123
abc
   123
123

puts "go about our merry way", 1

puts <<123
   that shouldn\'t have happened
   blah blah lbah
   123
123

puts <<ABC, 1, 2
       this is a test
ABC

puts <<-"abc def"
  hello world
    abc def

puts <<"abc def"
foo bar
abc def

puts <<'ghi jkl#@!#', 4, 5, 6
   bleh bleh
ghi jkl#@!#

puts "and we're all happy again"

In This Thread