Show indicators in column

This commit is contained in:
Arun Prakash Jana 2017-04-01 12:56:25 +05:30
parent 54a307767c
commit f3d95b6d0d
No known key found for this signature in database
GPG Key ID: A75979F35C080412
1 changed files with 64 additions and 52 deletions

116
nnn.c
View File

@ -41,8 +41,8 @@
#define CONTROL(c) ((c) ^ 0x40)
#define TOUPPER(ch) \
(((ch) >= 'a' && (ch) <= 'z') ? ((ch) - 'a' + 'A') : (ch))
#define MAX_LEN 1024
#define cur(flag) (flag ? CURSR : EMPTY)
#define MAX_CMD_LEN (PATH_MAX << 1)
#define CURSYM(flag) (flag ? CURSR : EMPTY)
struct assoc {
char *regex; /* Regex to match on filename */
@ -82,12 +82,12 @@ struct key {
#include "config.h"
struct entry {
typedef struct entry {
char name[PATH_MAX];
mode_t mode;
time_t t;
off_t size;
};
} *pEntry;
/* Global context */
struct entry *dents;
@ -96,7 +96,6 @@ int idle;
char *opener = NULL;
char *fallback_opener = NULL;
char *copier = NULL;
char size_buf[12]; /* Buffer to hold human readable size */
const char* size_units[] = {"B", "K", "M", "G", "T", "P", "E", "Z", "Y"};
/*
@ -281,12 +280,12 @@ int
entrycmp(const void *va, const void *vb)
{
if (mtimeorder)
return ((struct entry *)vb)->t - ((struct entry *)va)->t;
return ((pEntry)vb)->t - ((pEntry)va)->t;
if (sizeorder)
return ((struct entry *)vb)->size - ((struct entry *)va)->size;
return ((pEntry)vb)->size - ((pEntry)va)->size;
return xstricmp(((struct entry *)va)->name, ((struct entry *)vb)->name);
return xstricmp(((pEntry)va)->name, ((pEntry)vb)->name);
}
void
@ -442,6 +441,7 @@ void (*printptr)(struct entry *ent, int active) = &printent;
char*
coolsize(off_t size)
{
static char size_buf[12]; /* Buffer to hold human readable size */
int i = 0;
long double fsize = (double)size;
@ -467,21 +467,29 @@ printent_long(struct entry *ent, int active)
attron(A_REVERSE);
if (S_ISDIR(ent->mode))
printw("%s%-17.17s %s/\n", cur(active), buf, ent->name);
printw("%s%-17.17s / %s/\n",
CURSYM(active), buf, ent->name);
else if (S_ISLNK(ent->mode))
printw("%s%-17.17s %s@\n", cur(active), buf, ent->name);
printw("%s%-17.17s @ %s@\n",
CURSYM(active), buf, ent->name);
else if (S_ISSOCK(ent->mode))
printw("%s%-17.17s %s=\n", cur(active), buf, ent->name);
printw("%s%-17.17s = %s=\n",
CURSYM(active), buf, ent->name);
else if (S_ISFIFO(ent->mode))
printw("%s%-17.17s %s|\n", cur(active), buf, ent->name);
printw("%s%-17.17s | %s|\n",
CURSYM(active), buf, ent->name);
else if (S_ISBLK(ent->mode))
printw("%s%-17.17s b %s\n", cur(active), buf, ent->name);
printw("%s%-17.17s b %s\n",
CURSYM(active), buf, ent->name);
else if (S_ISCHR(ent->mode))
printw("%s%-17.17s c %s\n", cur(active), buf, ent->name);
printw("%s%-17.17s c %s\n",
CURSYM(active), buf, ent->name);
else if (ent->mode & S_IXUSR)
printw("%s%-17.17s %8.8s %s*\n", cur(active), buf, coolsize(ent->size), ent->name);
printw("%s%-17.17s %8.8s* %s*\n", CURSYM(active),
buf, coolsize(ent->size), ent->name);
else
printw("%s%-17.17s %8.8s %s\n", cur(active), buf, coolsize(ent->size), ent->name);
printw("%s%-17.17s %8.8s %s\n", CURSYM(active),
buf, coolsize(ent->size), ent->name);
if (active)
attroff(A_REVERSE);
@ -585,10 +593,9 @@ populate(char *path, char *oldpath, char *fltr)
void
redraw(char *path)
{
char cwd[PATH_MAX], cwdresolved[PATH_MAX];
size_t ncols;
int nlines, odd;
int i;
static char cwd[PATH_MAX];
static int nlines, odd;
static int i;
nlines = MIN(LINES - 4, ndents);
@ -606,17 +613,12 @@ redraw(char *path)
DPRINTF_S(path);
/* No text wrapping in cwd line */
ncols = COLS;
if (ncols > PATH_MAX)
ncols = PATH_MAX;
strlcpy(cwd, path, ncols);
cwd[ncols - strlen(CWD) - 1] = '\0';
if (!realpath(path, cwdresolved)) {
if (!realpath(path, cwd)) {
printmsg("Cannot resolve path");
return;
}
printw(CWD "%s\n\n", cwdresolved);
printw(CWD "%s\n\n", cwd);
/* Print listing */
odd = ISODD(nlines);
@ -648,9 +650,10 @@ redraw(char *path)
else if (dents[cur].mode & S_IXUSR)
ind = '*';
ind
? sprintf(cwd, "%d items [%s%c]", ndents, dents[cur].name, ind)
: sprintf(cwd, "%d items [%s]", ndents, dents[cur].name);
ind ? sprintf(cwd, "%d items [%s%c]",
ndents, dents[cur].name, ind)
: sprintf(cwd, "%d items [%s]",
ndents, dents[cur].name);
printmsg(cwd);
} else
@ -661,8 +664,8 @@ redraw(char *path)
void
browse(char *ipath, char *ifilter)
{
char path[PATH_MAX], oldpath[PATH_MAX], newpath[PATH_MAX];
char fltr[LINE_MAX];
static char path[PATH_MAX], oldpath[PATH_MAX], newpath[PATH_MAX];
static char fltr[LINE_MAX];
char *bin, *dir, *tmp, *run, *env;
struct stat sb;
regex_t re;
@ -671,6 +674,7 @@ browse(char *ipath, char *ifilter)
strlcpy(path, ipath, sizeof(path));
strlcpy(fltr, ifilter, sizeof(fltr));
oldpath[0] = '\0';
newpath[0] = '\0';
begin:
r = populate(path, oldpath, fltr);
if (r == -1) {
@ -736,43 +740,47 @@ nochange:
strlcpy(fltr, ifilter, sizeof(fltr));
goto begin;
case S_IFREG:
{
static char cmd[MAX_CMD_LEN];
static char *runvi = "vi";
static int status;
static FILE *fp;
/* If default mime opener is set, use it */
if (opener) {
char cmd[MAX_LEN];
int status;
snprintf(cmd, MAX_LEN, "%s \"%s\" > /dev/null 2>&1",
opener, newpath);
snprintf(cmd, MAX_CMD_LEN,
"%s \"%s\" > /dev/null 2>&1",
opener, newpath);
status = system(cmd);
continue;
}
/* Try custom applications */
bin = openwith(newpath);
char *execvi = "vi";
if (bin == NULL) {
/* If a custom handler application is not set, open
plain text files with vi, then try fallback_opener */
FILE *fp;
char cmd[MAX_LEN];
int status;
snprintf(cmd, MAX_LEN, "file \"%s\"", newpath);
/* If a custom handler application is
not set, open plain text files with
vi, then try fallback_opener */
snprintf(cmd, MAX_CMD_LEN,
"file \"%s\"", newpath);
fp = popen(cmd, "r");
if (fp == NULL)
goto nochange;
if (fgets(cmd, MAX_LEN, fp) == NULL) {
if (fgets(cmd, MAX_CMD_LEN, fp) == NULL) {
pclose(fp);
goto nochange;
}
pclose(fp);
if (strstr(cmd, "ASCII text") != NULL)
bin = execvi;
bin = runvi;
else if (fallback_opener) {
snprintf(cmd, MAX_LEN, "%s \"%s\" > /dev/null 2>&1",
fallback_opener, newpath);
snprintf(cmd, MAX_CMD_LEN,
"%s \"%s\" > \
/dev/null 2>&1",
fallback_opener,
newpath);
status = system(cmd);
continue;
} else {
@ -784,6 +792,7 @@ nochange:
spawn(bin, newpath, NULL);
initcurses();
continue;
}
default:
printmsg("Unsupported file");
goto nochange;
@ -872,7 +881,8 @@ nochange:
goto begin;
case SEL_DETAIL:
showdetail = !showdetail;
showdetail ? (printptr = &printent_long) : (printptr = &printent);
showdetail ? (printptr = &printent_long)
: (printptr = &printent);
/* Save current */
if (ndents > 0)
mkpath(path, dents[cur].name, oldpath, sizeof(oldpath));
@ -901,9 +911,11 @@ nochange:
char abspath[PATH_MAX];
if (strcmp(path, "/") == 0)
snprintf(abspath, PATH_MAX, "/%s", dents[cur].name);
snprintf(abspath, PATH_MAX, "/%s",
dents[cur].name);
else
snprintf(abspath, PATH_MAX, "%s/%s", path, dents[cur].name);
snprintf(abspath, PATH_MAX, "%s/%s",
path, dents[cur].name);
spawn(copier, abspath, NULL);
printmsg(abspath);
} else if (!copier)