Repository: sudofox/shell-mommy Branch: master Commit: c9bf8e8187b8 Files: 3 Total size: 8.2 KB Directory structure: gitextract_ggeaoiuy/ ├── .github/ │ └── FUNDING.yml ├── README.md └── shell-mommy.sh ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/FUNDING.yml ================================================ ko_fi: sudofox ================================================ FILE: README.md ================================================ # sudofox/shell-mommy Inspired by [Gankra/cargo-mommy](https://github.com/Gankra/cargo-mommy) This is a shell script that provides a `mommy` function which emulates a nurturing and supportive figure. The `mommy` function can be used to offer praise and encouraging responses to a user's actions, depending on the exit status of the command that is passed to it. By default, the text will be output in a light pink to stderr. You can change this to a light blue if you find that more encouraging. Example I hope this will serve to improve the efficiency of your workflow and general mental health. Please use responsibly. ## Installation To use the `mommy` function, you can source the `shell-mommy.sh` script in your current shell or add it to your `~/.bashrc` file to have it available every time you open a new terminal. ``` . /path/to/shell-mommy.sh ``` If you'd like it to always show a message after each command, you can define a custom `PROMPT_COMMAND` like so: ``` export PROMPT_COMMAND="mommy \\$\\(exit \$?\\); $PROMPT_COMMAND" ``` if that doesn't work for you, try: ``` export PS1="\$(mommy \$\(exit \$?\))$PS1" ``` ## Configuration The `mommy` function has several customizable options that can be set using environment variables: - `SHELL_MOMMYS_LITTLE`: Sets the affectionate term that `mommy` will use to refer to the user. The default value is "girl". - `SHELL_MOMMYS_PRONOUNS`: Sets the pronouns that `mommy` will use to refer to itself. The default value is "her". - `SHELL_MOMMYS_ROLES`: Sets the role that `mommy` will have. The default value is "mommy". - `SHELL_MOMMYS_COLOR`: Sets the color of the text output by `mommy`. The default value is a light pink color. - `SHELL_MOMMYS_ONLY_NEGATIVE`: If set to `true`, `mommy` will provide encouragement (on non-zero exit status) but not praise. This will keep clutter down if you intend to use `mommy` as a `PROMPT_COMMAND`. - `SHELL_MOMMYS_NEGATIVE_RESPONSES`/`SHELL_MOMMYS_POSITIVE_RESPONSES`: Sets the possible responses that `mommy` will use. This should be in the form of a bash array and will override the default responses. Want Samuel L. Jackson to chastise or compliment you? [Now you can!](https://github.com/sudofox/shell-mommy/issues/5#issuecomment-1381029744) To add multiple possible values, separate them with a forward slash, for example: ```sh export SHELL_MOMMYS_LITTLE="child/girl/boy" # ... $ mommy ls README.md shell-mommy.sh awe, what a good boy~ mommy knew you could do it~ ❤️ $ mommy ls README.md shell-mommy.sh good girl~ mommy's so proud of you~ ❤️ $ mommy ls README.md shell-mommy.sh mommy thinks her little child earned a big hug~ ❤️ ``` ## Usage To use the `mommy` function, simply pass a command as an argument and `mommy` will provide a supportive response based on the exit status of the command. Depending on the exit status, `mommy` will provide a response of praise or encouragement. ```sh mommy ls # Output: Good girl! mommy's so proud of you! ❤️ mommy this-command-does-not-exist # Output: Just a little further, sweetie~ ❤️ ``` ## Example ``` # Set custom affectionate term and pronouns export SHELL_MOMMYS_LITTLE="kiddo" export SHELL_MOMMYS_PRONOUNS="them" # Use the mommy function to run a command mommy ls # Output: # That's a good kiddo~ ❤️ ``` ================================================ FILE: shell-mommy.sh ================================================ # sudofox/shell-mommy.sh mommy() ( # SHELL_MOMMYS_LITTLE - what to call you~ (default: "girl") # SHELL_MOMMYS_PRONOUNS - what pronouns mommy will use for themself~ (default: "her") # SHELL_MOMMYS_ROLES - what role mommy will have~ (default "mommy") COLORS_LIGHT_PINK='\033[38;5;217m' #\e[38;5;217m COLORS_LIGHT_BLUE='\033[38;5;117m' #'\e[38;5;117m COLORS_FAINT='\033[2m' #'\e[2m COLORS_RESET='\033[0m' #'\e[0m DEF_WORDS_LITTLE="girl" DEF_WORDS_PRONOUNS="her" DEF_WORDS_ROLES="mommy" DEF_MOMMY_COLOR="${COLORS_LIGHT_PINK}" DEF_ONLY_NEGATIVE="false" NEGATIVE_RESPONSES="do you need MOMMYS_ROLE's help~? ❤️ Don't give up, my love~ ❤️ Don't worry, MOMMYS_ROLE is here to help you~ ❤️ I believe in you, my sweet AFFECTIONATE_TERM~ ❤️ It's okay to make mistakes, my dear~ ❤️ just a little further, sweetie~ ❤️ Let's try again together, okay~? ❤️ MOMMYS_ROLE believes in you, and knows you can overcome this~ ❤️ MOMMYS_ROLE believes in you~ ❤️ MOMMYS_ROLE is always here for you, no matter what~ ❤️ MOMMYS_ROLE is here to help you through it~ ❤️ MOMMYS_ROLE is proud of you for trying, no matter what the outcome~ ❤️ MOMMYS_ROLE knows it's tough, but you can do it~ ❤️ MOMMYS_ROLE knows MOMMYS_PRONOUN little AFFECTIONATE_TERM can do better~ ❤️ MOMMYS_ROLE knows you can do it, even if it's tough~ ❤️ MOMMYS_ROLE knows you're feeling down, but you'll get through it~ ❤️ MOMMYS_ROLE knows you're trying your best~ ❤️ MOMMYS_ROLE loves you, and is here to support you~ ❤️ MOMMYS_ROLE still loves you no matter what~ ❤️ You're doing your best, and that's all that matters to MOMMYS_ROLE~ ❤️ MOMMYS_ROLE is always here to encourage you~ ❤️" POSITIVE_RESPONSES="*pets your head* awe, what a good AFFECTIONATE_TERM~\nMOMMYS_ROLE knew you could do it~ ❤️ good AFFECTIONATE_TERM~\nMOMMYS_ROLE's so proud of you~ ❤️ Keep up the good work, my love~ ❤️ MOMMYS_ROLE is proud of the progress you've made~ ❤️ MOMMYS_ROLE is so grateful to have you as MOMMYS_PRONOUN little AFFECTIONATE_TERM~ ❤️ I'm so proud of you, my love~ ❤️ MOMMYS_ROLE is so proud of you~ ❤️ MOMMYS_ROLE loves seeing MOMMYS_PRONOUN little AFFECTIONATE_TERM succeed~ ❤️ MOMMYS_ROLE thinks MOMMYS_PRONOUN little AFFECTIONATE_TERM earned a big hug~ ❤️ that's a good AFFECTIONATE_TERM~ ❤️ you did an amazing job, my dear~ ❤️ you're such a smart cookie~ ❤️" # allow for overriding of default words (IF ANY SET) if [ -n "$SHELL_MOMMYS_LITTLE" ]; then DEF_WORDS_LITTLE="${SHELL_MOMMYS_LITTLE}" fi if [ -n "$SHELL_MOMMYS_PRONOUNS" ]; then DEF_WORDS_PRONOUNS="${SHELL_MOMMYS_PRONOUNS}" fi if [ -n "$SHELL_MOMMYS_ROLES" ]; then DEF_WORDS_ROLES="${SHELL_MOMMYS_ROLES}" fi if [ -n "$SHELL_MOMMYS_COLOR" ]; then DEF_MOMMY_COLOR="${SHELL_MOMMYS_COLOR}" fi # allow overriding to true if [ "$SHELL_MOMMYS_ONLY_NEGATIVE" = "true" ]; then DEF_ONLY_NEGATIVE="true" fi # if the variable is set for positive/negative responses, overwrite it if [ -n "$SHELL_MOMMYS_POSITIVE_RESPONSES" ]; then POSITIVE_RESPONSES="$SHELL_MOMMYS_POSITIVE_RESPONSES" fi if [ -n "$SHELL_MOMMYS_NEGATIVE_RESPONSES" ]; then NEGATIVE_RESPONSES="$SHELL_MOMMYS_NEGATIVE_RESPONSES" fi # split a string on forward slashes and return a random element pick_word() { echo "$1" | tr '/' '\n' | shuf | sed 1q } pick_response() { # given a response type, pick an entry from the list if [ "$1" = "positive" ]; then element=$(echo "$POSITIVE_RESPONSES" | shuf | sed 1q) elif [ "$1" = "negative" ]; then element=$(echo "$NEGATIVE_RESPONSES" | shuf | sed 1q) else echo "Invalid response type: $1" exit 1 fi # Return the selected response echo "$element" } sub_terms() { # given a response, sub in the appropriate terms response="$1" # pick_word for each term affectionate_term="$(pick_word "${DEF_WORDS_LITTLE}")" pronoun="$(pick_word "${DEF_WORDS_PRONOUNS}")" role="$(pick_word "${DEF_WORDS_ROLES}")" # sub in the terms, store in variable response="$(echo "$response" | sed "s/AFFECTIONATE_TERM/$affectionate_term/g")" response="$(echo "$response" | sed "s/MOMMYS_PRONOUN/$pronoun/g")" response="$(echo "$response" | sed "s/MOMMYS_ROLE/$role/g")" # we have string literal newlines in the response, so we need to printf it out # print faint and colorcode printf "${DEF_MOMMY_COLOR}$response${COLORS_RESET}\n" } success() { ( # if we're only supposed to show negative responses, return if [ "$DEF_ONLY_NEGATIVE" = "true" ]; then return 0 fi # pick_response for the response type response="$(pick_response "positive")" sub_terms "$response" >&2 ) return 0 } failure() { rc=$? ( response="$(pick_response "negative")" sub_terms "$response" >&2 ) return $rc } # eval is used here to allow for alias resolution # TODO: add a way to check if we're running from PROMPT_COMMAND to use the previous exit code instead of doing things this way eval "$@" && success || failure return $? )