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 21:07:29 2013 +0800
@@ -2429,6 +2429,67 @@
     }
 }
 
+/*
+ * List all features aligned in columns, dictionary style.
+ */
+    void
+list_features()
+{
+    int		i;
+    int		ncol;
+    int		nrow;
+    int		nfeat;
+    int		width;
+
+    /* 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);
+
+    for (i = 0; ! got_int && i < nrow * ncol; ++i)
+    {
+	int idx = (i / ncol) + (i % ncol) * nrow;
+
+	if (idx < nfeat)
+	{
+	    int last_col = (i + 1) % ncol == 0;
+
+	    msg_puts(features[idx]);
+	    if (last_col)
+		while (msg_col != 0)
+		    msg_putchar(' ');
+	    else
+		while (msg_col % width)
+		    msg_putchar(' ');
+	}
+    }
+}
     void
 list_version()
 {
@@ -2626,15 +2687,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);
