From a6b4aead43cf7ecaa3f4d01503244a13e67b3f09 Mon Sep 17 00:00:00 2001 From: Yorhel Date: Wed, 12 May 2021 16:30:31 +0200 Subject: [PATCH] Add $NCDU_LEVEL environment variable when spawning a shell Similar to $SHLVL and $RANGER_LEVEL. --- doc/ncdu.pod | 6 ++++++ src/shell.c | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/doc/ncdu.pod b/doc/ncdu.pod index 7fc04f5..02ac48a 100644 --- a/doc/ncdu.pod +++ b/doc/ncdu.pod @@ -287,6 +287,12 @@ run ncdu as follows: export NCDU_SHELL=vifm ncdu +Ncdu will set the C environment variable or increment it before +spawning the shell. This variable allows you to detect when your shell is +running from within ncdu, which can be useful to avoid nesting multiple +instances of ncdu. Ncdu itself does not (currently) warn when attempting to run +nested instances. + =item q Quit diff --git a/src/shell.c b/src/shell.c index fd589e6..b881700 100644 --- a/src/shell.c +++ b/src/shell.c @@ -34,6 +34,22 @@ #include #include +static void set_level(void) { + static int done = 0; + char nlvl[2]; + if(done) + return; + const char *lvl = getenv("NCDU_LEVEL"); + // too lazy to count beyond 9 + if(lvl && *lvl >= '1' && *lvl < '9' && lvl[1] == 0) { + nlvl[0] = 1 + *lvl; + nlvl[1] = 0; + setenv("NCDU_LEVEL", nlvl, 1); + } else + setenv("NCDU_LEVEL", "1", 1); + done++; +} + void shell_draw() { const char *full_path; int res; @@ -59,6 +75,7 @@ void shell_draw() { shell = DEFAULT_SHELL; } + set_level(); res = system(shell); /* resume ncurses mode */