Correct column width for tab completion and ls
diff --git a/shell/cmdedit.c b/shell/cmdedit.c
index da2b017..2ea6161 100644
--- a/shell/cmdedit.c
+++ b/shell/cmdedit.c
@@ -951,6 +951,44 @@
return command_mode;
}
+/*
+ display by column original ideas from ls applet,
+ very optimize by my :)
+*/
+static void showfiles(char **matches, int nfiles)
+{
+ int ncols, row;
+ int column_width = 0;
+ int nrows = nfiles;
+
+ /* find the longest file name- use that as the column width */
+ for (row = 0; row < nrows; row++) {
+ int l = strlen(matches[row]);
+
+ if (column_width < l)
+ column_width = l;
+ }
+ column_width += 2; /* min space for columns */
+ ncols = cmdedit_termw / column_width;
+
+ if (ncols > 1) {
+ nrows /= ncols;
+ if(nfiles % ncols)
+ nrows++; /* round up fractionals */
+ column_width = -column_width; /* for printf("%-Ns", ...); */
+ } else {
+ ncols = 1;
+ }
+ for (row = 0; row < nrows; row++) {
+ int n = row;
+ int nc;
+
+ for(nc = 1; nc < ncols && n+nrows < nfiles; n += nrows, nc++)
+ printf("%*s", column_width, matches[n]);
+ printf("%s\n", matches[n]);
+ }
+}
+
static void input_tab(int *lastWasTab)
{
@@ -1078,29 +1116,11 @@
* just hit TAB again, print a list of all the
* available choices... */
if (matches && num_matches > 0) {
- int i, col, l;
int sav_cursor = cursor; /* change goto_new_line() */
/* Go to the next line */
goto_new_line();
- for (i = 0, col = 0; i < num_matches; i++) {
- l = strlen(matches[i]);
- if (l < 14)
- l = 14;
- printf("%-14s ", matches[i]);
- col+=l;
- if ((l += 2) > 16)
- while (l % 16) {
- putchar(' ');
- l++;
- }
- if (col > (cmdedit_termw-l-l) && matches[i + 1] != NULL) {
- putchar('\n');
- col = 0;
- }
- }
- /* Go to the next line and rewrite */
- putchar('\n');
+ showfiles(matches, num_matches);
redraw(0, len - sav_cursor);
}
}