]> Sergey Matveev's repositories - nnn.git/commitdiff
Per-context directory color
authorArun Prakash Jana <engineerarun@gmail.com>
Mon, 3 Dec 2018 16:14:33 +0000 (21:44 +0530)
committerArun Prakash Jana <engineerarun@gmail.com>
Mon, 3 Dec 2018 16:14:33 +0000 (21:44 +0530)
README.md
nnn.1
src/nnn.c

index 110430e1b4216a2a62403c5641ee19311b764092..ec70a83ffec05e21016a5339e49d947e25bef336 100644 (file)
--- a/README.md
+++ b/README.md
@@ -50,6 +50,7 @@ It runs on Linux, macOS, Raspberry Pi, Cygwin, Linux subsystem for Windows and T
   - [Keyboard shortcuts](#keyboard-shortcuts)
   - [Leader key](#leader-key)
   - [Contexts](#contexts)
+  - [Directory color](#directory-color)
   - [Filters](#filters)
   - [Navigate-as-you-type mode](#navigate-as-you-type-mode)
   - [File indicators](#file-indicators)
@@ -183,7 +184,7 @@ Search keyword and option completion scripts for Bash, Fish and Zsh can be found
 #### Cmdline options
 
 ```
-usage: nnn [-b key] [-c N] [-e] [-i] [-l]
+usage: nnn [-b key] [-C] [-e] [-i] [-l]
            [-p file] [-S] [-v] [-h] [PATH]
 
 The missing terminal file manager for X.
@@ -193,7 +194,7 @@ positional args:
 
 optional args:
  -b key  bookmark key to open
- -c N    dir color, disables if N>7
+ -C      disable directory color
  -e      use exiftool instead of mediainfo
  -i      start in navigate-as-you-type mode
  -l      start in light mode
@@ -273,6 +274,13 @@ The first time a context is entered, it copies the state of the last visited con
 
 When a context is quit, the next active context is selected. If the last active context is quit, the program quits.
 
+#### Directory color
+
+Each context can have its own color for directories specified:
+
+    export NNN_CONTEXT_COLORS="1234"
+colors: 0-black, 1-red, 2-green, 3-yellow, 4-blue (default), 5-magenta, 6-cyan, 7-white
+
 #### Filters
 
 Filters support regexes to instantly (search-as-you-type) list the matching entries in the current directory.
diff --git a/nnn.1 b/nnn.1
index 98f9c6e3b7a2149db263e78086003b052ad2443a..51ce9e4027e078191843a685858be03aaba4197d 100644 (file)
--- a/nnn.1
+++ b/nnn.1
@@ -7,7 +7,7 @@
 .Sh SYNOPSIS
 .Nm
 .Op Ar -b key
-.Op Ar -c N
+.Op Ar -C
 .Op Ar -e
 .Op Ar -i
 .Op Ar -l
@@ -166,9 +166,8 @@ supports the following options:
 .Fl "b key"
         specify bookmark key to open
 .Pp
-.Fl "c N"
-        specify dir color (default blue), disables if N>7
-        0-black, 1-red, 2-green, 3-yellow, 4-blue, 5-magenta, 6-cyan, 7-white
+.Fl C
+        disable directory color
 .Pp
 .Fl e
         use exiftool instead of mediainfo
@@ -282,6 +281,13 @@ files.
     export NNN_USE_EDITOR=1
 .Ed
 .Pp
+\fBNNN_CONTEXT_COLORS:\fR string of color codes for each context, e.g.:
+.Bd -literal
+    export NNN_CONTEXT_COLORS="1234"
+
+    codes: 0-black, 1-red, 2-green, 3-yellow, 4-blue (default), 5-magenta, 6-cyan, 7-white
+.Ed
+.Pp
 \fBNNN_IDLE_TIMEOUT:\fR set idle timeout (in seconds) to invoke terminal locker.
 .Pp
 \fBNNN_COPIER:\fR set to a clipboard copier script.
index 6c360d8ddda676e4efd0e3159367db860493565e..429c1588e4ede260ed42c523e168da9d52c0b685 100644 (file)
--- a/src/nnn.c
+++ b/src/nnn.c
@@ -180,7 +180,7 @@ disabledbg()
 #define SYMLINK_TO_DIR 0x1
 #define MAX_HOME_LEN 64
 #define MAX_CTX 4
-#define DOT_FILTER_LEN 8
+#define DOT_FILTER_LEN 7
 
 /* Macros to define process spawn behaviour as flags */
 #define F_NONE     0x00  /* no flag set */
@@ -258,9 +258,8 @@ typedef struct {
        uint showcolor  : 1;  /* Set to show dirs in blue */
        uint dircolor   : 1;  /* Current status of dir color */
        uint metaviewer : 1;  /* Index of metadata viewer in utils[] */
-       uint color      : 3;  /* Color code for directories */
        uint ctxactive  : 1;  /* Context active or not */
-       uint reserved   : 10;
+       uint reserved   : 13;
        /* The following settings are global */
        uint curctx     : 2;  /* Current context number */
        uint picker     : 1;  /* Write selection to user-specified file */
@@ -277,12 +276,13 @@ typedef struct {
        char c_name[NAME_MAX + 1]; /* Current file name */
        settings c_cfg; /* Current configuration */
        char c_fltr[DOT_FILTER_LEN]; /* Hidden filter */
+       char color; /* Color code for directories */
 } context;
 
 /* GLOBALS */
 
 /* Configuration, contexts */
-static settings cfg = {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 0, 0, 0, 0, 0};
+static settings cfg = {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0};
 static context g_ctx[MAX_CTX] __attribute__ ((aligned));
 
 static struct entry *dents;
@@ -798,8 +798,12 @@ static void initcurses(void)
        curs_set(FALSE); /* Hide cursor */
        start_color();
        use_default_colors();
-       if (cfg.showcolor)
-               init_pair(1, cfg.color, -1);
+       if (cfg.showcolor) {
+               init_pair(1, g_ctx[0].color, -1);
+               init_pair(2, g_ctx[1].color, -1);
+               init_pair(3, g_ctx[2].color, -1);
+               init_pair(4, g_ctx[3].color, -1);
+       }
        settimeout(); /* One second */
 }
 
@@ -1518,7 +1522,7 @@ static char *get_bm_loc(int key, char *buf)
 static void resetdircolor(mode_t mode)
 {
        if (cfg.dircolor && !S_ISDIR(mode)) {
-               attroff(COLOR_PAIR(1) | A_BOLD);
+               attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
                cfg.dircolor = 0;
        }
 }
@@ -2103,6 +2107,8 @@ static int show_help(char *path)
 
        if (cfg.useeditor)
                dprintf(fd, "NNN_USE_EDITOR: 1\n");
+       if (getenv("NNN_CONTEXT_COLORS"))
+               dprintf(fd, "NNN_CONTEXT_COLORS: %s\n", getenv("NNN_CONTEXT_COLORS"));
        if (idletimeout)
                dprintf(fd, "NNN_IDLE_TIMEOUT: %d secs\n", idletimeout);
        if (copier)
@@ -2478,7 +2484,7 @@ static void redraw(char *path)
                ncols -= 5;
 
        if (cfg.showcolor) {
-               attron(COLOR_PAIR(1) | A_BOLD);
+               attron(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
                cfg.dircolor = 1;
        }
 
@@ -2500,7 +2506,7 @@ static void redraw(char *path)
 
        /* Must reset e.g. no files in dir */
        if (cfg.dircolor) {
-               attroff(COLOR_PAIR(1) | A_BOLD);
+               attroff(COLOR_PAIR(cfg.curctx + 1) | A_BOLD);
                cfg.dircolor = 0;
        }
 
@@ -3511,14 +3517,14 @@ nochange:
 static void usage(void)
 {
        fprintf(stdout,
-               "usage: nnn [-b key] [-c N] [-e] [-i] [-l]\n"
+               "usage: nnn [-b key] [-C] [-e] [-i] [-l]\n"
                "           [-p file] [-S] [-v] [-h] [PATH]\n\n"
                "The missing terminal file manager for X.\n\n"
                "positional args:\n"
                "  PATH   start dir [default: current dir]\n\n"
                "optional args:\n"
                " -b key  bookmark key to open\n"
-               " -c N    dir color, disables if N>7\n"
+               " -C      disable directory color\n"
                " -e      use exiftool instead of mediainfo\n"
                " -i      start in navigate-as-you-type mode\n"
                " -l      start in light mode\n"
@@ -3541,7 +3547,7 @@ int main(int argc, char *argv[])
                exit(1);
        }
 
-       while ((opt = getopt(argc, argv, "Slib:c:ep:vh")) != -1) {
+       while ((opt = getopt(argc, argv, "Slib:Cep:vh")) != -1) {
                switch (opt) {
                case 'S':
                        cfg.blkorder = 1;
@@ -3558,11 +3564,8 @@ int main(int argc, char *argv[])
                case 'b':
                        ipath = optarg;
                        break;
-               case 'c':
-                       if (atoi(optarg) > 7)
-                               cfg.showcolor = 0;
-                       else
-                               cfg.color = (uchar)atoi(optarg);
+               case 'C':
+                       cfg.showcolor = 0;
                        break;
                case 'e':
                        cfg.metaviewer = EXIFTOOL;
@@ -3592,6 +3595,31 @@ int main(int argc, char *argv[])
                }
        }
 
+       /* Get the context colors; copier used as tmp var */
+       if (cfg.showcolor) {
+               copier = getenv("NNN_CONTEXT_COLORS");
+               if (copier) {
+                       opt = 0;
+                       while (*copier && opt < MAX_CTX) {
+                               if (*copier < '0' || *copier > '7') {
+                                       fprintf(stderr, "invalid color code\n");
+                                       exit(1);
+                               } else
+                                       g_ctx[opt].color = *copier - '0';
+
+                               ++copier;
+                               ++opt;
+                       }
+
+                       while (opt != MAX_CTX) {
+                               g_ctx[opt].color = 4;
+                               ++opt;
+                       }
+               } else
+                       for (opt = 0; opt < MAX_CTX; ++opt)
+                               g_ctx[opt].color = 4; /* Default color is blue */
+       }
+
        /* Parse bookmarks string */
         if (parsebmstr() < 0) {
                fprintf(stderr, "ERROR parsing NNN_BMS: set single-char bookmark keys only\n");