diff -r 327e180af6d9 MoinMoin/macro/RecentChanges.py
--- a/MoinMoin/macro/RecentChanges.py	Mon Feb 22 10:22:19 2010 +0100
+++ b/MoinMoin/macro/RecentChanges.py	Thu Mar 04 01:01:43 2010 +0100
@@ -107,22 +107,70 @@
 
     # print editor name or IP
     d['editors'] = None
+    d['editors_detailed'] = None
     if request.cfg.show_names:
+
+        # one line means only one revision
         if len(lines) > 1:
             counters = {}
-            for idx in range(len(lines)):
-                name = lines[idx].getEditor(request)
-                if not name in counters:
-                    counters[name] = []
-                counters[name].append(idx+1)
-            poslist = [(v, k) for k, v in counters.items()]
-            poslist.sort()
+
+            # track the editor name and build suitable ranges
+            current_name = None
+            current_edit_rev = None
+            current_idx = None
+
+            # visit each line, recording the editor name, change number range
+            # and revision number range
+            for idx, edit_line in enumerate(lines):
+
+                # get the edit details for the log line
+                name = edit_line.getEditor(request)
+                edit_rev = int(edit_line.rev)
+
+                # record the editor and details
+                if current_name != name:
+                    if current_name is not None:
+                        if not counters.has_key(current_name):
+                            counters[current_name] = []
+                        counters[current_name].append((range(current_idx + 1, idx + 1), (edit_rev, current_edit_rev)))
+                    current_name = name
+                    current_edit_rev = edit_rev
+                    current_idx = idx
+
+            # for the final change, get a diff to the revision before
+            else:
+                if current_name is not None:
+                    if not counters.has_key(current_name):
+                        counters[current_name] = []
+                    counters[current_name].append((range(current_idx + 1, idx + 2), (edit_rev - 1, current_edit_rev)))
+
+            # get the editors in order
+            editors = [(v, k) for k, v in counters.items()]
+            editors.sort()
+
+            # prepare a dictionary of editor details for display
             d['editors'] = []
-            for positions, name in poslist:
+            d['editors_detailed'] = []
+
+            for details, name in editors:
+
+                # get the combined index list
+                all_idx_list = []
+                for idx_list, rev_range in details:
+                    all_idx_list += idx_list
+
+                # make the editor summary
                 d['editors'].append("%s&nbsp;[%s]" % (
-                    name, util.rangelist(positions)))
+                    name, util.rangelist(all_idx_list)))
+
+                # make the editor details for display
+                d['editors_detailed'].append((
+                    name, page, details))
+
         else:
-            d['editors'] = [line.getEditor(request)]
+            name = line.getEditor(request)
+            d['editors'] = [name]
+            d['editors_detailed'] = [(name, page, None)]
 
     comments = []
     for idx in range(len(lines)):
diff -r 327e180af6d9 MoinMoin/theme/__init__.py
--- a/MoinMoin/theme/__init__.py	Mon Feb 22 10:22:19 2010 +0100
+++ b/MoinMoin/theme/__init__.py	Thu Mar 04 01:01:43 2010 +0100
@@ -8,7 +8,7 @@
 
 from MoinMoin import i18n, wikiutil, config, version, caching
 from MoinMoin.Page import Page
-from MoinMoin.util import pysupport
+from MoinMoin.util import pysupport, rangelist
 
 modules = pysupport.getPackageModules(__file__)
 
@@ -1404,8 +1404,39 @@
         html.append('<td class="rcicon2">%(info_html)s</td>\n' % d)
 
         html.append('<td class="rceditor">')
-        if d['editors']:
-            html.append('<br>'.join(d['editors']))
+        if d['editors_detailed']:
+            notfirst = 0
+            for name, page, details in d['editors_detailed']:
+                if notfirst:
+                    html.append('<br>')
+
+                html.append(name)
+
+                if details is not None:
+                    html.append("&nbsp;[")
+                    notfirstlink = 0
+
+                    for idx_list, rev_range in details:
+                        if notfirstlink:
+                            html.append(',')
+
+                        # handle pages with previous content
+                        start_rev, end_rev = rev_range
+                        if start_rev > 0:
+                            html.append(
+                                page.link_to_raw(self.request, "%s" % rangelist(idx_list),
+                                    querystr={'action': 'diff', 'rev1': start_rev,
+                                        'rev2': end_rev}, rel='nofollow'))
+
+                        # handle initial edits of pages
+                        else:
+                            html.append(
+                                page.link_to_raw(self.request, "%s" % rangelist(idx_list),
+                                    rel='nofollow'))
+                        notfirstlink = 1
+                    html.append("]")
+
+                notfirst = 1
         html.append('</td>\n')
 
         html.append('<td class="rccomment">')
