From 8262c1e6620ca79db9ce43e08a17352f6501d30f Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 10 Feb 2020 21:40:22 +0100 Subject: [PATCH] Shell: Build prompt based on the PROMPT environment variable if present --- Shell/main.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/Shell/main.cpp b/Shell/main.cpp index f66b39becb..a9ff6c3776 100644 --- a/Shell/main.cpp +++ b/Shell/main.cpp @@ -55,12 +55,50 @@ static int run_command(const String&); static String prompt() { - if (g.uid == 0) - return "# "; + auto* ps1 = getenv("PROMPT"); + if (!ps1) { + if (g.uid == 0) + return "# "; + + StringBuilder builder; + builder.appendf("\033]0;%s@%s:%s\007", g.username.characters(), g.hostname, g.cwd.characters()); + builder.appendf("\033[31;1m%s\033[0m@\033[37;1m%s\033[0m:\033[32;1m%s\033[0m$> ", g.username.characters(), g.hostname, g.cwd.characters()); + return builder.to_string(); + } StringBuilder builder; - builder.appendf("\033]0;%s@%s:%s\007", g.username.characters(), g.hostname, g.cwd.characters()); - builder.appendf("\033[31;1m%s\033[0m@\033[37;1m%s\033[0m:\033[32;1m%s\033[0m$> ", g.username.characters(), g.hostname, g.cwd.characters()); + for (char* ptr = ps1; *ptr; ++ptr) { + if (*ptr == '\\') { + ++ptr; + if (!*ptr) + break; + switch (*ptr) { + case 'X': + builder.append("\033]0;"); + break; + case 'a': + builder.append(0x07); + break; + case 'e': + builder.append(0x1b); + break; + case 'u': + builder.append(g.username); + break; + case 'h': + builder.append(g.hostname); + break; + case 'w': + builder.append(g.cwd); + break; + case 'p': + builder.append(g.uid == 0 ? '#' : '$'); + break; + } + continue; + } + builder.append(*ptr); + } return builder.to_string(); }