/* sea.c - fast sea prompt */ // c99 // cc -std=c99 -W -Wall -pedantic sea.c -o sea #include #include #include #include #define ANSI(n) "\\[\033[" n "m\\]" #define PUNC ANSI("36") #define CLEAR "\\[\033[m\017\\]" #define TEXT CLEAR #define BOLD ANSI("1") #define put(s) fputs((s), stdout) int main(int argc, char **argv) { // we assume argv[0] has no shell-special chars if (argc < 2) { put("argc() { echo ${#@}; }; export -f argc;\n" "export PROMPT_COMMAND='PS1=$('"); printf("$(type -p %s)", argv[0]); put("' $? ers $? $(argc $(jobs -pr)) $(argc $(jobs -ps)))';\n"); return 0; } argv++; int e = atoi(*argv++); /* two arguments guaranteed; must * check hereafter */ put(CLEAR PUNC "["); char *p = *argv ? *argv++ : 0; bool first = 1; while (p && *p && *argv) { int n; if ((n = atoi(*argv))) { printf("%s%c%i", first ? first=0, TEXT : " ", *p, n); } ++argv, ++p; } if (!first) put(PUNC "]["); char *wd = getenv("PWD"); if (!wd) wd = ""; char *home = getenv("HOME"); if (home) { size_t len = strlen(home); if (!strncmp(wd, home, len) && (wd[len] == '/' || wd[len] == '\0')) { wd += len; *--wd = '~'; } } size_t max = 20; size_t len = strlen(wd); if (len > max) { wd += len - max; strncpy(wd, "... ", 4); } printf(TEXT "\\u" PUNC "@" TEXT "\\h" PUNC ":" TEXT "%s" PUNC "]" CLEAR "\\$ ", wd); return e; }