diff --git a/README.md b/README.md index 5fa00f73..0d9b8349 100644 --- a/README.md +++ b/README.md @@ -54,11 +54,12 @@ I chose to fork because: - current item in reverse video - number of items in current directory - full name of currently selected file + - Directories first + - Sort numeric names in numeric order - Case-insensitive alphabetic content listing instead of upper case first - Roll over at the first and last entries of a directory (with Up/Down keys) - Removed navigation restriction with relative paths (and let permissions handle it) - Sort entries by file size (largest to smallest) - - Sort numeric names in numeric order - Shortcut to invoke file name copier (set using environment variable `NNN_COPIER`) - File associations - Environment variable `NNN_OPENER` to let desktop opener handle it all. E.g.: diff --git a/nnn.c b/nnn.c index 2939dac2..802030e9 100644 --- a/nnn.c +++ b/nnn.c @@ -395,13 +395,25 @@ visible(regex_t *regex, char *file) static int entrycmp(const void *va, const void *vb) { + static pEntry pa, pb; + + pa = (pEntry)va; + pb = (pEntry)vb; + + /* Sort directories first */ + if (S_ISDIR(pb->mode) && !S_ISDIR(pa->mode)) + return 1; + else if (S_ISDIR(pa->mode) && !S_ISDIR(pb->mode)) + return -1; + + /* Do the actual sorting */ if (mtimeorder) - return ((pEntry)vb)->t - ((pEntry)va)->t; + return pb->t - pa->t; if (sizeorder) - return ((pEntry)vb)->size - ((pEntry)va)->size; + return pb->size - pa->size; - return xstricmp(((pEntry)va)->name, ((pEntry)vb)->name); + return xstricmp(pa->name, pb->name); } static void