diff -r 2876c01edbad src/version.c
--- a/src/version.c	Sun Feb 17 15:45:37 2013 +0100
+++ b/src/version.c	Wed Feb 20 15:12:03 2013 +0800
@@ -2429,6 +2429,73 @@
     }
 }
 
+/*
+ * List all features aligned in columns, dictionary style.
+ */
+    void
+list_features()
+{
+    int		i;
+    int		ncol;
+    int		nrow;
+    int		nfeat;
+    int		width;
+    char_u	*buf;
+
+    /* Find the length of the longest feature name, use that + 1 as the column
+     * width */
+    for (width = 0, nfeat = 0, i = 0; features[i] != NULL; ++i)
+    {
+	int l = STRLEN(features[i]);
+	if (l > width)
+	    width = l;
+	++nfeat;
+    }
+    width += 1;
+
+    if (Columns < width)
+    {
+	/* Not enough screen columns - show one per line */
+	for (i = 0; features[i] != NULL; ++i)
+	{
+	    version_msg(features[i]);
+	    if (msg_col > 0)
+		msg_putchar('\n');
+	}
+	return;
+    }
+
+    ncol = (int) Columns / width;
+    /* The rightmost column doesn't need a separator.
+     * Sacrifice it to fit in one more column if possible. */
+    if (Columns % width == width - 1)
+	ncol++;
+
+    nrow = nfeat / ncol + (nfeat % ncol ? 1 : 0);
+
+    buf = alloc(width);
+    if (buf == NULL)
+	return;
+
+    for (i = 0; ! got_int && i < nrow * ncol; ++i)
+    {
+	int idx = (i / ncol) + (i % ncol) * nrow;
+	int last_col = (i + 1) % ncol == 0;
+
+	if (idx >= nfeat)
+	{
+	    msg_putchar('\n');
+	    continue;			 /* Keep our missing features secret */
+	}
+
+	sprintf(buf, "%-*s", last_col ? width - 1 : width, features[idx]);
+	msg_puts(buf);
+	if (last_col && msg_col > 0)
+	    msg_putchar('\n');
+    }
+
+    vim_free(buf);
+}
     void
 list_version()
 {
@@ -2626,15 +2693,8 @@
 #endif
     version_msg(_("  Features included (+) or not (-):\n"));
 
-    /* print all the features */
-    for (i = 0; features[i] != NULL; ++i)
-    {
-	version_msg(features[i]);
-	if (msg_col > 0)
-	    version_msg(" ");
-    }
+    list_features();
 
-    version_msg("\n");
 #ifdef SYS_VIMRC_FILE
     version_msg(_("   system vimrc file: \""));
     version_msg(SYS_VIMRC_FILE);
