From e692903c475a9368833b76aafbb9d2f551986a5b Mon Sep 17 00:00:00 2001 From: Cybjit Date: Tue, 18 Nov 2014 20:01:16 -0600 Subject: [PATCH] smem: allow column auto-sizing --- smem | 40 ++++++++++++++++++++++++++++++++++++++++ smem.8 | 4 ++++ 2 files changed, 44 insertions(+) diff --git a/smem b/smem index c692f73..2404835 100755 --- a/smem +++ b/smem @@ -471,6 +471,37 @@ def showfields(fields, f): for l in sorted(fields.keys()): print "%-8s %s" % (l, fields[l][-1]) +def autosize(columns, fields, rows): + colsizes = {} + for c in columns: + sizes = [1] + + if not options.no_header: + sizes.append(len(fields[c][0])) + + if (options.abbreviate or options.percent) and 'a' in fields[c][2]: + sizes.append(7) + else: + for r in rows: + sizes.append(len(str(fields[c][1](r)))) + + colsizes[c] = max(sizes) + + overflowcols = set(["command", "map"]) & set(columns) + if len(overflowcols) > 0: + overflowcol = overflowcols.pop() + totnoflow = sum(colsizes.values()) - colsizes[overflowcol] + try: + ttyrows, ttycolumns = os.popen('stty size', 'r').read().split() + ttyrows, ttycolumns = int(ttyrows), int(ttycolumns) + except: + ttyrows, ttycolumns = (24, 80) + maxflowcol = ttycolumns - totnoflow - len(columns) + maxflowcol = max(maxflowcol, 10) + colsizes[overflowcol] = min(colsizes[overflowcol], maxflowcol) + + return colsizes + def showtable(rows, fields, columns, sort): header = "" format = "" @@ -493,6 +524,11 @@ def showtable(rows, fields, columns, sort): showfields(fields, missing) sys.exit(-1) + if options.autosize: + colsizes = autosize(columns, fields, rows) + else: + colsizes = {} + for n in columns: f = fields[n][2] if 'a' in f: @@ -503,6 +539,8 @@ def showtable(rows, fields, columns, sort): f = f.replace('a', 's') else: formatter.append(lambda x: x) + if n in colsizes: + f = re.sub(r"[0-9]+", str(colsizes[n]), f) format += f + " " header += f % fields[n][0] + " " @@ -626,6 +664,8 @@ parser.add_option("-c", "--columns", type="str", help="columns to show") parser.add_option("-t", "--totals", action="store_true", help="show totals") +parser.add_option("-a", "--autosize", action="store_true", + help="size columns to fit terminal size") parser.add_option("-R", "--realmem", type="str", help="amount of physical RAM") diff --git a/smem.8 b/smem.8 index 6184a16..b71bd32 100644 --- a/smem.8 +++ b/smem.8 @@ -95,6 +95,10 @@ User filter regular expression. .SS OUTPUT FORMATTING +.TP +.B \-a, \-\-autosize +Size columns to fit terminal size. + .TP .BI "\-c " COLUMNS ", \-\-columns=" COLUMNS Columns to show.