column: add dense layout support

Normally all cells (and in turn columns) share the same width. This
layout mode can waste space because one long item can stretch our all
columns.

With COL_DENSE enabled, column width is calculated indepdendently. All
columns are shrunk to minimum, then it attempts to push cells of the
last row over to the next column with hope that everything still fits
even there's one row less. The process is repeated until the new layout
cannot fit in given width any more, or there's only one row left
(perfect!).

Apparently, this mode consumes more cpu than the old one, but it makes
better use of terminal space. For layouting one or two screens, cpu
usage should not be detectable.

This patch introduces option handling code besides layout modes and
enable/disable to expose this feature as "dense". The feature can be
turned off by specifying "nodense".

Thanks-to: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nguyễn Thái Ngọc Duy
2012-04-13 17:54:36 +07:00
committed by Junio C Hamano
parent f78b1c5f82
commit 3f8eccbe16
4 changed files with 137 additions and 1 deletions

View File

@@ -90,6 +90,30 @@ EOF
test_cmp expected actual
'
test_expect_success '20 columns, nodense' '
cat >expected <<\EOF &&
one seven
two eight
three nine
four ten
five eleven
six
EOF
git column --mode=column,nodense < lista > actual &&
test_cmp expected actual
'
test_expect_success '20 columns, dense' '
cat >expected <<\EOF &&
one five nine
two six ten
three seven eleven
four eight
EOF
git column --mode=column,dense < lista > actual &&
test_cmp expected actual
'
test_expect_success '20 columns, padding 2' '
cat >expected <<\EOF &&
one seven
@@ -129,4 +153,28 @@ EOF
test_cmp expected actual
'
test_expect_success '20 columns, row first, nodense' '
cat >expected <<\EOF &&
one two
three four
five six
seven eight
nine ten
eleven
EOF
git column --mode=row,nodense <lista >actual &&
test_cmp expected actual
'
test_expect_success '20 columns, row first, dense' '
cat >expected <<\EOF &&
one two three
four five six
seven eight nine
ten eleven
EOF
git column --mode=row,dense <lista >actual &&
test_cmp expected actual
'
test_done