summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/cmd.py65
1 files changed, 58 insertions, 7 deletions
diff --git a/Lib/cmd.py b/Lib/cmd.py
index 6d9efff..bd4e3cb 100644
--- a/Lib/cmd.py
+++ b/Lib/cmd.py
@@ -319,10 +319,61 @@ class Cmd:
print header
if self.ruler:
print self.ruler * len(header)
- (cmds_per_line,junk)=divmod(maxcol,cmdlen)
- col=cmds_per_line
- for cmd in cmds:
- if col==0: print
- print (("%-"+`cmdlen`+"s") % cmd),
- col = (col+1) % cmds_per_line
- print "\n"
+ self.columnize(cmds, maxcol-1)
+ print
+
+ def columnize(self, list, displaywidth=80):
+ """Display a list of strings as a compact set of columns.
+
+ Each column is only as wide as necessary.
+ Columns are separated by two spaces (one was not legible enough).
+ """
+ if not list:
+ print "<empty>"
+ return
+ nonstrings = [i for i in range(len(list))
+ if not isinstance(list[i], str)]
+ if nonstrings:
+ raise TypeError, ("list[i] not a string for i in %s" %
+ ", ".join(map(str, nonstrings)))
+ size = len(list)
+ if size == 1:
+ print list[0]
+ return
+ # Try every row count from 1 upwards
+ for nrows in range(1, len(list)):
+ ncols = (size+nrows-1) // nrows
+ colwidths = []
+ totwidth = -2
+ for col in range(ncols):
+ colwidth = 0
+ for row in range(nrows):
+ i = row + nrows*col
+ if i >= size:
+ break
+ x = list[i]
+ colwidth = max(colwidth, len(x))
+ colwidths.append(colwidth)
+ totwidth += colwidth + 2
+ if totwidth > displaywidth:
+ break
+ if totwidth <= displaywidth:
+ break
+ else:
+ nrows = len(list)
+ ncols = 1
+ colwidths = [0]
+ for row in range(nrows):
+ texts = []
+ for col in range(ncols):
+ i = row + nrows*col
+ if i >= size:
+ x = ""
+ else:
+ x = list[i]
+ texts.append(x)
+ while texts and not texts[-1]:
+ del texts[-1]
+ for col in range(len(texts)):
+ texts[col] = texts[col].ljust(colwidths[col])
+ print " ".join(texts)