fix colored readline prompt bug

This commit is contained in:
Philippe Teuwen 2020-05-07 21:56:09 +02:00
parent a8a9e98ca2
commit edb1c85cd3
3 changed files with 22 additions and 9 deletions

View file

@ -18,15 +18,14 @@
#define PROXPROMPT_COMPOSE "[" "%s%s" "] pm3 --> "
#define PROXPROMPT_CTX_SCRIPTFILE "|" _GREEN_("script")
#define PROXPROMPT_CTX_SCRIPTCMD "|" _GREEN_("script")
#define PROXPROMPT_CTX_STDIN "|" _GREEN_("script")
#define PROXPROMPT_CTX_SCRIPTFILE "|" _RL_GREEN_("script")
#define PROXPROMPT_CTX_SCRIPTCMD "|" _RL_GREEN_("script")
#define PROXPROMPT_CTX_STDIN "|" _RL_GREEN_("script")
#define PROXPROMPT_CTX_INTERACTIVE ""
#define PROXPROMPT_DEV_USB _BOLD_GREEN_("usb")
#define PROXPROMPT_DEV_FPC _BOLD_GREEN_("fpc")
#define PROXPROMPT_DEV_OFFLINE _BOLD_RED_("offline")
#define PROXPROMPT_DEV_USB _RL_BOLD_GREEN_("usb")
#define PROXPROMPT_DEV_FPC _RL_BOLD_GREEN_("fpc")
#define PROXPROMPT_DEV_OFFLINE _RL_BOLD_RED_("offline")
#define PROXHISTORY "history.txt"
#define PROXLOG "log_%Y%m%d.txt"

View file

@ -358,6 +358,10 @@ void memcpy_filter_ansi(void *dest, const void *src, size_t n, bool filter) {
uint8_t *rsrc = (uint8_t *)src;
uint16_t si = 0;
for (uint16_t i = 0; i < n; i++) {
if ((i < n)
&& ((rsrc[i] == '\001') || (rsrc[i] == '\002')))
// skip readline special markers
continue;
if ((i < n - 1)
&& (rsrc[i] == '\x1b')
&& (rsrc[i + 1] >= 0x40)

View file

@ -5,12 +5,22 @@
#define _BLUE_(s) "\x1b[34m" s AEND
#define _RED_(s) "\x1b[31m" s AEND
#define _BOLD_RED_(s) "\x1b[1;31m" s AEND
#define _GREEN_(s) "\x1b[32m" s AEND
#define _BOLD_GREEN_(s) "\x1b[1;32m" s AEND
#define _YELLOW_(s) "\x1b[33m" s AEND
#define _MAGENTA_(s) "\x1b[35m" s AEND
#define _CYAN_(s) "\x1b[36m" s AEND
#define _WHITE_(s) "\x1b[37m" s AEND
// https://wiki.hackzine.org/development/misc/readline-color-prompt.html
// Applications may indicate that the prompt contains
// characters that take up no physical screen space when displayed by
// bracketing a sequence of such characters with the special markers
// RL_PROMPT_START_IGNORE = '\001' and RL_PROMPT_END_IGNORE = '\002'
#define RL_ESC(a) "\001" a "\002"
#define _RL_RED_(s) RL_ESC("\x1b[31m") s RL_ESC(AEND)
#define _RL_GREEN_(s) RL_ESC("\x1b[32m") s RL_ESC(AEND)
#define _RL_BOLD_RED_(s) RL_ESC("\x1b[1;31m") s RL_ESC(AEND)
#define _RL_BOLD_GREEN_(s) RL_ESC("\x1b[1;32m") s RL_ESC(AEND)
#endif