This is update against current CVS version of refeed as of 20060705.

It adds following features:

- auto-focus of field after update from server if it has ID autoFocus{item_id}
- added vi-like keybindings for next/previous item (without wrap-around effect):
	j - down
	k - up
- new items keys (or midifications):
	a - archive now moves to next item (and stops at last)
	t - add tags
	! - flag
	i - update Information
	s - Similar
- new feed bindings:
	N - new items
	P - published items
- enlarge item body text (could be comment outed, but example is helpful)

=== script/app.js
==================================================================
--- script/app.js	(revision 2474)
+++ script/app.js	(local)
@@ -185,14 +185,15 @@
  * selection and actual browser scrolling if necessary.
  *
  * @param   int     direction   -1 means scroll up, +1 means scroll down
+ * @param   boolean scrollWrap  wrap when scrolling (default: true)
  * @return  boolean False
  */
-Refeed.App.doScroll = function(direction)
+Refeed.App.doScroll = function(direction, scrollWrap)
 {
     if(this.listedThings.length == 0) {
         return false;
     }
-    
+
     var newThing = null;
     var winBox = this.getWindowBox();
     var docBox = this.getDocumentBox();
@@ -200,6 +201,8 @@
     var scrolledToBottom = winBox.bottom() >= docBox.bottom();
     var scrolledToTop = winBox.top() <= 0;
 
+	if (scrollWrap == null) scrollWrap = true;
+
     if(!scrolledToBottom && !scrolledToTop && (this.selectedThing == null || !winBox.isOverlapping(this.selectedThing.getNodeBox()))) {
         // we're scrolled someplace in the middle, and there's nothing
         // selected in view, so find something appropriate within the
@@ -216,7 +219,7 @@
             // just pick the next thing
             newThing = this.listedThings[newPos];
 
-        } else {
+        } else if (scrollWrap) {
             // looks like we're set to scroll off the edge of the document
             if(this.selectedThing == null) {
                 // ...and nothing is selected,
@@ -242,7 +245,10 @@
                     window.scrollTo(0, docBox.bottom());
                 }
             }
-        }
+        } else {
+			// no scrollWrap
+			return false;
+		}
     }
     
     this.selectThing(newThing);
=== style/dom.js
==================================================================
--- style/dom.js	(revision 2474)
+++ style/dom.js	(local)
@@ -97,16 +97,15 @@
         itemNode.className = itemNode.className.replace(/\b(unread|read-but-visible|read)\b/g, 'read');
         item.toggleRead(true, function() { toggled_read(item_id, true); });
 
+	return true; /* scroll to next */
+
     } else if(itemNode.className.match(/\bread/) && (!a_priori || (a_priori && (a_priori == 'unread')))) {
         itemNode.className = itemNode.className.replace(/\b(unread|read-but-visible|read)\b/g, 'unread');
         item.toggleRead(false, function() { toggled_read(item_id, false); });
 
-    } else {
-        return true;
-
     }
     
-    return false;
+    return false; /* don't scroll */
 }
 
 function toggled_read(item_id, read)
@@ -320,6 +319,9 @@
         }
         itemBody.innerHTML = html;
         itemNode.className = itemNode.className.replace(/\bprocessing\b/g, '');
+	// auto focus field if it exists
+	var f = document.getElementById('autoFocus'+item_id);
+	if (f) f.focus();
     };
 
     var onError = function(error) {
=== style/font.css
==================================================================
--- style/font.css	(revision 2474)
+++ style/font.css	(local)
@@ -87,6 +87,12 @@
 	font-weight: bold;
 	}
 
+.item .body {
+    font-size: 16px;
+    line-height: 20px;
+/*    font-weight: normal; */
+}
+
 table.feeds tr .age *,
 table.feeds tr .publish a
 {
=== style/keyhandlers.js
==================================================================
--- style/keyhandlers.js	(revision 2474)
+++ style/keyhandlers.js	(local)
@@ -10,6 +10,12 @@
 // .: 46, jump down one feed/item
 Refeed.App.assignKeyPressHandler( 46, function(app, event) { return app.doScroll(1); });
 
+// vi-like keybindings (like , and . but without wrapping)
+// j: 106, jump down one feed/item
+Refeed.App.assignKeyPressHandler(106, function(app, event) { return app.doScroll(1, 0); });
+// k: 107, jump up one feed/item
+Refeed.App.assignKeyPressHandler(107, function(app, event) { return app.doScroll(-1, 0); });
+
 // r: 114, reload page
 Refeed.App.assignKeyPressHandler(114, function(app, event) { location.reload(true); return false; });
 
@@ -36,7 +42,7 @@
 Refeed.Feed.prototype.assignKeyPressHandler(117, function(feed, event) { return feed.update(); });
 
 // a: 97
-Refeed.Item.prototype.assignKeyPressHandler( 97, function(item, event) { toggle_read(item.id); return false; });
+Refeed.Item.prototype.assignKeyPressHandler( 97, function(item, event) { if (toggle_read(item.id)) Refeed.App.doScroll(1, 0); return false; });
 Refeed.Feed.prototype.assignKeyPressHandler( 97, function(feed, event) { archive_feed(feed.id); return false; });
 
 // p: 112
@@ -50,6 +56,8 @@
 
 // c: 99, comment form
 Refeed.Item.prototype.assignKeyPressHandler( 99, function(item, event) { populate_item_body(item.id, 'itemCommentFormHTML', 'itemTab'+item.id+'CommentTag'); return false; });
+// t: 116, (tag) comment form
+Refeed.Item.prototype.assignKeyPressHandler(116, function(item, event) { populate_item_body(item.id, 'itemCommentFormHTML', 'itemTab'+item.id+'CommentTag'); return false; });
 
 // digits: 48-57
 for(var keycode = 48; keycode <= 57; keycode += 1) {
@@ -70,3 +78,15 @@
         return true;
     });
 }
+
+// additional keyboard shortcuts
+// !: 92, flag (star) item
+Refeed.Item.prototype.assignKeyPressHandler(92, function(item, event) { toggle_flagged(item.id, 'itemTab'+item.id+'FlaggedEntry', true); return false; });
+// i: 105, show update information
+Refeed.Item.prototype.assignKeyPressHandler(105, function(item, event) { populate_item_body(item.id, 'Update_Logger.updateLogHTML', 'itemTab'+item.id+'UpdateLog'); return false; });
+// s: 115, similar
+Refeed.Item.prototype.assignKeyPressHandler(115, function(item, event) { populate_item_body(item.id, 'Similar_Entries.similarEntriesHTML', 'itemTab'+item.id+'SimilarEntries'); return false; });
+// N: 78, new items
+Refeed.Feed.prototype.assignKeyPressHandler( 78, function(feed, event) { location.href = location.href.replace(/\/[^\/]*$/, '/view.php?how=paged&what=new') ; return false; });
+// P: 80, published items
+Refeed.Feed.prototype.assignKeyPressHandler( 80, function(feed, event) { location.href = location.href.replace(/\/[^\/]*$/, '/view.php?how=paged&what=published') ; return false; });
=== style/templates/form-item-comment.tpl
==================================================================
--- style/templates/form-item-comment.tpl	(revision 2474)
+++ style/templates/form-item-comment.tpl	(local)
@@ -19,7 +19,7 @@
     
     <h3>Tags</h3>
     <p>
-        <input type="text" name="itemtags" value="{foreach from=$item->metadata.tags item="tag"}{$tag|escape} {/foreach}" size="48" />
+        <input type="text" name="itemtags" value="{foreach from=$item->metadata.tags item="tag"}{$tag|escape} {/foreach}" size="48" id="autoFocus{$item->getID()}" />
     </p>
 
     <h3>Comment</h3>
=== style/templates/form-item-edit.tpl
==================================================================
--- style/templates/form-item-edit.tpl	(revision 2474)
+++ style/templates/form-item-edit.tpl	(local)
@@ -46,7 +46,7 @@
     </p>
 
     <p>
-        <input type="submit" name="action" value="Save" />
+        <input type="submit" name="action" value="Save" id="autoFocus{$item->getID()}" />
         <input type="reset" onclick="populate_item_body({$item->getID()}, 'itemBodyHTML', 'itemTab{$item->getID()}View'); return false;" name="action" value="Cancel" />
     </p>
 
=== style/templates/page-feeds.tpl
==================================================================
--- style/templates/page-feeds.tpl	(revision 2474)
+++ style/templates/page-feeds.tpl	(local)
@@ -26,6 +26,7 @@
         {include file="menu.tpl"}
         {include file="list-feeds.tpl" feeds=$RB.feeds}
         {include file="cheatsheet-feeds.tpl}
+        {include file="focus-first.tpl}
 
 	</body>
 </html>
=== style/templates/page-items.tpl
==================================================================
--- style/templates/page-items.tpl	(revision 2474)
+++ style/templates/page-items.tpl	(local)
@@ -25,7 +25,8 @@
 
         {include file="menu.tpl"}
         {include file="list-items.tpl" items=$RB.items}
-        {include file="cheatsheet-items.tpl}
+        {include file="cheatsheet-items.tpl"}
+        {include file="focus-first.tpl"}
 
 	</body>
 </html>
=== style/templates/focus-first.tpl
==================================================================
--- style/templates/focus-first.tpl	(revision 2474)
+++ style/templates/focus-first.tpl	(local)
@@ -0,0 +1,9 @@
+{*----------------------------------------
+focus first item on list
+----------------------------------------*}
+
+<script type="text/javascript" language="javascript1.2">
+// <![CDATA[
+	Refeed.App.doScroll(1);
+// ]]>
+</script>
