From 80a2551f06e115e107daa0c833c4efedd0bb56fb Mon Sep 17 00:00:00 2001 From: aueoiae Date: Sun, 17 Jan 2021 19:34:59 +0000 Subject: [PATCH 1/7] themes: Add "absimple" --- plugins/bash-preexec/README.md | 3 + themes/THEMES.md | 4 + themes/absimple/README.md | 15 ++ themes/absimple/absimple-bash.png | Bin 0 -> 75644 bytes themes/absimple/absimple.theme.sh | 384 ++++++++++++++++++++++++++++++ 5 files changed, 406 insertions(+) create mode 100644 plugins/bash-preexec/README.md create mode 100644 themes/absimple/README.md create mode 100644 themes/absimple/absimple-bash.png create mode 100644 themes/absimple/absimple.theme.sh diff --git a/plugins/bash-preexec/README.md b/plugins/bash-preexec/README.md new file mode 100644 index 0000000..c9b4065 --- /dev/null +++ b/plugins/bash-preexec/README.md @@ -0,0 +1,3 @@ +# bash preexec + +this allows to set the window title on termux diff --git a/themes/THEMES.md b/themes/THEMES.md index bfd5d1a..e900db6 100644 --- a/themes/THEMES.md +++ b/themes/THEMES.md @@ -2,6 +2,10 @@ [![](90210/90210-dark.png)](90210/90210-dark.png) +## `ab+simple` + +[![](absimple/absimple-bash.png)](absimple/absimple-bash.png) + ## `agnoster` [![](agnoster/agnoster-bash-sshot.png)](agnoster/agnoster-bash-sshot.png) diff --git a/themes/absimple/README.md b/themes/absimple/README.md new file mode 100644 index 0000000..222c0f7 --- /dev/null +++ b/themes/absimple/README.md @@ -0,0 +1,15 @@ +# ab+simple theme + +this theme needs a Powerline-patched font to render correctly. i recommend: https://github.com/adi1090x/termux-style + +a colorful theme based on agnoster theme, made shorter and simpler. + +added title support for termux and random dates for fun. + +the aim of this theme is to only show you *relevant* information. + +ie: it will only show git information when in a git working directory. + +also, everything from the current user and hostname to whether the last call exited with an error or whether background jobs are running in this shell will all be displayed automatically when appropriate. + +![bash screenshot](absimple-bash.png) diff --git a/themes/absimple/absimple-bash.png b/themes/absimple/absimple-bash.png new file mode 100644 index 0000000000000000000000000000000000000000..3756ea0f73688ecf3b1c900984415e2e13025225 GIT binary patch literal 75644 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 SD~}NHQd4=LT%=_B?Ee5x#c0+5 literal 0 HcmV?d00001 diff --git a/themes/absimple/absimple.theme.sh b/themes/absimple/absimple.theme.sh new file mode 100644 index 0000000..efbfa5c --- /dev/null +++ b/themes/absimple/absimple.theme.sh @@ -0,0 +1,384 @@ +#!/usr/bin/env bash +# vim: ft=bash ts=2 sw=2 sts=2 +# +# absimple theme +# an agnoster fork for bash +# +# tested on termux at android 2022-02-15 +# +# the aim of this theme is to only show you *relevant* information. +# ie: it will only show git information when in a git working directory. +# also, everything from the current user and hostname to whether the last call exited with an error or whether background jobs are running in this shell will all be displayed automatically when appropriate. + +PROMPT_DIRTRIM=2 # bash4 and above + +###################################################################### +DEBUG=0 +debug() { + if [[ ${DEBUG} -ne 0 ]]; then + >&2 echo -e $* + fi +} + +###################################################################### +### Segment drawing +# A few utility functions to make it easy and re-usable to draw segmented prompts + +CURRENT_BG='NONE' +CURRENT_RBG='NONE' +SEGMENT_SEPARATOR='' +RIGHT_SEPARATOR='' +LEFT_SUBSEG='' +RIGHT_SUBSEG='' + +text_effect() { + case "$1" in + reset) echo 0;; + bold) echo 1;; + underline) echo 4;; + esac +} + +# to add colors, see +# http://bitmote.com/index.php?post/2012/11/19/Using-ANSI-Color-Codes-to-Colorize-Your-Bash-Prompt-on-Linux +# under the "256 (8-bit) Colors" section, and follow the example for orange below +fg_color() { + case "$1" in + black) echo 30;; + red) echo 31;; + green) echo 32;; + yellow) echo 33;; + blue) echo 34;; + magenta) echo 35;; + cyan) echo 36;; + white) echo 37;; + orange) echo 38\;5\;166;; + esac +} + +bg_color() { + case "$1" in + black) echo 40;; + red) echo 41;; + green) echo 42;; + yellow) echo 43;; + blue) echo 44;; + magenta) echo 45;; + cyan) echo 46;; + white) echo 47;; + orange) echo 48\;5\;166;; + esac; +} + +ansi() { + local seq + local -a mycodes=("${!1}") + + debug "ansi: ${!1} all: $* aka ${mycodes[@]}" + + seq="" + local i + for ((i = 0; i < ${#mycodes[@]}; i++)); do + if [[ -n $seq ]]; then + seq="${seq};" + fi + seq="${seq}${mycodes[$i]}" + done + debug "ansi debug:" '\\[\\033['${seq}'m\\]' + echo -ne '\[\033['${seq}'m\]' + # PR="$PR\[\033[${seq}m\]" +} + +ansi_single() { + echo -ne '\[\033['$1'm\]' +} + +# Begin a segment +# Takes two arguments, background and foreground. Both can be omitted, +# rendering default background/foreground. +prompt_segment() { + local bg fg + local -a codes + + debug "Prompting $1 $2 $3" + + # if commented out from kruton's original... I'm not clear + # if it did anything, but it messed up things like + # prompt_status - Erik 1/14/17 + + # if [[ -z $1 || ( -z $2 && $2 != default ) ]]; then + codes=("${codes[@]}" $(text_effect reset)) + # fi + if [[ -n $1 ]]; then + bg=$(bg_color $1) + codes=("${codes[@]}" $bg) + debug "Added $bg as background to codes" + fi + if [[ -n $2 ]]; then + fg=$(fg_color $2) + codes=("${codes[@]}" $fg) + debug "Added $fg as foreground to codes" + fi + + debug "Codes: " + # local -p codes + + if [[ $CURRENT_BG != NONE && $1 != $CURRENT_BG ]]; then + local -a intermediate=($(fg_color $CURRENT_BG) $(bg_color $1)) + debug "pre prompt " $(ansi intermediate[@]) + PR="$PR $(ansi intermediate[@])$SEGMENT_SEPARATOR" + debug "post prompt " $(ansi codes[@]) + PR="$PR$(ansi codes[@]) " + else + debug "no current BG, codes is $codes[@]" + PR="$PR$(ansi codes[@]) " + fi + CURRENT_BG=$1 + [[ -n $3 ]] && PR="$PR$3" +} + +# End the prompt, closing any open segments +prompt_end() { + if [[ -n $CURRENT_BG ]]; then + local -a codes=($(text_effect reset) $(fg_color $CURRENT_BG)) + PR="$PR $(ansi codes[@])$SEGMENT_SEPARATOR" + fi + local -a reset=($(text_effect reset)) + PR="$PR $(ansi reset[@])" + CURRENT_BG='' +} + +### virtualenv prompt +prompt_virtualenv() { + if [[ -n $VIRTUAL_ENV ]]; then + # Python could output the version information in both stdout and + # stderr (e.g. if using pyenv, the output goes to stderr). + VERSION_OUTPUT=$($VIRTUAL_ENV/bin/python --version 2>&1) + + # The last word of the output of `python --version` + # corresponds to the version number. + VENV_VERSION=$(echo $VERSION_OUTPUT | awk '{print $NF}') + + color=cyan + prompt_segment $color $PRIMARY_FG + prompt_segment $color white "$(basename $VENV_VERSION)" + fi +} + +### Prompt components +# Each component will draw itself, and hide itself if no information needs to be shown + +# Context: user@hostname (who am I and where am I) +prompt_context() { + local user=`whoami` + + if [[ $user != $DEFAULT_USER || -n $SSH_CLIENT ]]; then + prompt_segment black default "$user@\h" + fi +} + +# prints history followed by HH:MM, useful for remembering what +# we did previously +prompt_histdt() { + prompt_segment black default "\!" # \A" +} + + +git_status_dirty() { + dirty=$(git status -s 2> /dev/null | tail -n 1) + [[ -n $dirty ]] && echo " ●" +} + +# Git: branch/detached head, dirty status +prompt_git() { + local ref dirty + if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then + ZSH_THEME_GIT_PROMPT_DIRTY='±' + dirty=$(git_status_dirty) + ref=$(git symbolic-ref HEAD 2> /dev/null) || ref="➦ $(git show-ref --head -s --abbrev |head -n1 2> /dev/null)" + if [[ -n $dirty ]]; then + prompt_segment yellow black + else + prompt_segment green black + fi + PR="$PR${ref/refs\/heads\// }$dirty" + fi +} + +# Dir: current working directory +prompt_dir() { + prompt_segment blue black '\W' +} + +# Status: +# - was there an error +# - am I root +# - are there background jobs? +prompt_status() { + local symbols + symbols=() + [[ $RETVAL -ne 0 ]] && symbols+="$(ansi_single $(fg_color red))✘" + [[ $UID -eq 0 ]] && symbols+="$(ansi_single $(fg_color yellow))⚡" + [[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="$(ansi_single $(fg_color cyan))⚙" + + [[ -n "$symbols" ]] && prompt_segment black default "$symbols" +} + +###################################################################### +# +# experimental right prompt stuff +# requires setting prompt_foo to use PRIGHT vs PR +# doesn't quite work per above + +rightprompt() { + printf "%*s" $COLUMNS "$PRIGHT" +} + +# quick right prompt I grabbed to test things. +__command_rprompt() { + local times= n=$COLUMNS tz + for tz in ZRH:Europe/Zurich PIT:US/Eastern \ + MTV:US/Pacific TOK:Asia/Tokyo; do + [ $n -gt 40 ] || break + times="$times ${tz%%:*}\e[30;1m:\e[0;36;1m" + times="$times$(TZ=${tz#*:} date +%H:%M:%S)\e[0m" + n=$(( $n - 10 )) + done + [ -z "$times" ] || printf "%${n}s$times\\r" '' +} +# PROMPT_COMMAND=__command_rprompt + +# this doens't wrap code in \[ \] +ansi_r() { + local seq + local -a mycodes2=("${!1}") + + debug "ansi: ${!1} all: $* aka ${mycodes2[@]}" + + seq="" + local i + for ((i = 0; i < ${#mycodes2[@]}; i++)); do + if [[ -n $seq ]]; then + seq="${seq};" + fi + seq="${seq}${mycodes2[$i]}" + done + debug "ansi debug:" '\\[\\033['${seq}'m\\]' + echo -ne '\033['${seq}'m' + # PR="$PR\[\033[${seq}m\]" +} + +# Begin a segment on the right +# Takes two arguments, background and foreground. Both can be omitted, +# rendering default background/foreground. +prompt_right_segment() { + local bg fg + local -a codes + + debug "Prompt right" + debug "Prompting $1 $2 $3" + + # if commented out from kruton's original... I'm not clear + # if it did anything, but it messed up things like + # prompt_status - Erik 1/14/17 + + # if [[ -z $1 || ( -z $2 && $2 != default ) ]]; then + codes=("${codes[@]}" $(text_effect reset)) + # fi + if [[ -n $1 ]]; then + bg=$(bg_color $1) + codes=("${codes[@]}" $bg) + debug "Added $bg as background to codes" + fi + if [[ -n $2 ]]; then + fg=$(fg_color $2) + codes=("${codes[@]}" $fg) + debug "Added $fg as foreground to codes" + fi + + debug "Right Codes: " + # local -p codes + + # right always has a separator + # if [[ $CURRENT_RBG != NONE && $1 != $CURRENT_RBG ]]; then + # $CURRENT_RBG= + # fi + local -a intermediate2=($(fg_color $1) $(bg_color $CURRENT_RBG) ) + # PRIGHT="$PRIGHT---" + debug "pre prompt " $(ansi_r intermediate2[@]) + PRIGHT="$PRIGHT$(ansi_r intermediate2[@])$RIGHT_SEPARATOR" + debug "post prompt " $(ansi_r codes[@]) + PRIGHT="$PRIGHT$(ansi_r codes[@]) " + # else + # debug "no current BG, codes is $codes[@]" + # PRIGHT="$PRIGHT$(ansi codes[@]) " + # fi + CURRENT_RBG=$1 + [[ -n $3 ]] && PRIGHT="$PRIGHT$3" +} + +###################################################################### +## Emacs prompt --- for dir tracking +# stick the following in your .emacs if you use this: + +# (setq dirtrack-list '(".*DIR *\\([^ ]*\\) DIR" 1 nil)) +# (defun dirtrack-filter-out-pwd-prompt (string) +# "dirtrack-mode doesn't remove the PWD match from the prompt. This does." +# ;; TODO: support dirtrack-mode's multiline regexp. +# (if (and (stringp string) (string-match (first dirtrack-list) string)) +# (replace-match "" t t string 0) +# string)) +# (add-hook 'shell-mode-hook +# #'(lambda () +# (dirtrack-mode 1) +# (add-hook 'comint-preoutput-filter-functions +# 'dirtrack-filter-out-pwd-prompt t t))) + +prompt_emacsdir() { + # no color or other setting... this will be deleted per above + PR="DIR \w DIR$PR" +} + +###################################################################### +## Main prompt + +build_prompt() { + [[ ! -z ${AG_EMACS_DIR+x} ]] && prompt_emacsdir + prompt_status + [[ -z ${AG_NO_HIST+x} ]] && prompt_histdt + #[[ -z ${AG_NO_CONTEXT+x} ]] && prompt_context + prompt_virtualenv + prompt_dir + prompt_git + prompt_end +} + +# from orig... +# export PS1='$(ansi_single $(text_effect reset)) $(build_prompt) ' +# this doesn't work... new model: create a prompt via a PR variable and +# use that. + +set_bash_prompt() { + local RETVAL=$? + local PR="" + local PRIGHT="" + local CURRENT_BG=NONE + + PR="$(ansi_single $(text_effect reset))" + build_prompt + + PS1="" + # date randomly or once per hour + if (( $(shuf -i 1-20 -n 1 --random-source=/dev/urandom) == 1 )) ; then #TK || (($PSDATE != $(date +%H))) ; then + PS1+="\$(date +%a) $(date +%Y-%m-%d) " + fi + PSDATE=$(date +%H) + # ... and time + PS1+="$(date +%H:%M:%S) " + + # uncomment below to use right prompt + # PS1='\[$(tput sc; printf "%*s" $COLUMNS "$PRIGHT"; tput rc)\]'$PR + PS1+=$PR +} + +PROMPT_COMMAND=set_bash_prompt From 1c4685895deb1fd3180a931af9866ab9e8b33b70 Mon Sep 17 00:00:00 2001 From: import Date: Sun, 2 Oct 2022 10:22:15 +0900 Subject: [PATCH 2/7] plugins: import "xterm" from Bash-it --- plugins/xterm/xterm.plugin.bash | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 plugins/xterm/xterm.plugin.bash diff --git a/plugins/xterm/xterm.plugin.bash b/plugins/xterm/xterm.plugin.bash new file mode 100644 index 0000000..740460e --- /dev/null +++ b/plugins/xterm/xterm.plugin.bash @@ -0,0 +1,45 @@ +# shellcheck shell=bash +cite about-plugin +about-plugin 'automatically set your xterm title with host and location info' + +_short-dirname() { + local dir_name="${PWD/~/\~}" + if [[ "${SHORT_TERM_LINE:-}" == true && "${#dir_name}" -gt 8 ]]; then + echo "${dir_name##*/}" + else + echo "${dir_name}" + fi +} + +_short-command() { + local input_command="$*" + if [[ "${SHORT_TERM_LINE:-}" == true && "${#input_command}" -gt 8 ]]; then + echo "${input_command%% *}" + else + echo "${input_command}" + fi +} + +set_xterm_title() { + local title="${1:-}" + echo -ne "\033]0;${title}\007" +} + +precmd_xterm_title() { + set_xterm_title "${SHORT_USER:-${USER}}@${SHORT_HOSTNAME:-${HOSTNAME}} $(_short-dirname) ${PROMPT_CHAR:-\$}" +} + +preexec_xterm_title() { + local command_line="${BASH_COMMAND:-${1:-}}" + local directory_name short_command + directory_name="$(_short-dirname)" + short_command="$(_short-command "${command_line}")" + set_xterm_title "${short_command} {${directory_name}} (${SHORT_USER:-${USER}}@${SHORT_HOSTNAME:-${HOSTNAME}})" +} + +case "${TERM:-dumb}" in + xterm* | rxvt*) + precmd_functions+=(precmd_xterm_title) + preexec_functions+=(preexec_xterm_title) + ;; +esac From 14df64e3816186d812f1d8ecc53717324d72257f Mon Sep 17 00:00:00 2001 From: import Date: Sun, 2 Oct 2022 10:23:25 +0900 Subject: [PATCH 3/7] tools: import "bash-preexec" from the upstream --- tools/bash-preexec.sh | 370 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 370 insertions(+) create mode 100644 tools/bash-preexec.sh diff --git a/tools/bash-preexec.sh b/tools/bash-preexec.sh new file mode 100644 index 0000000..d82b2ec --- /dev/null +++ b/tools/bash-preexec.sh @@ -0,0 +1,370 @@ +# bash-preexec.sh -- Bash support for ZSH-like 'preexec' and 'precmd' functions. +# https://github.com/rcaloras/bash-preexec +# +# +# 'preexec' functions are executed before each interactive command is +# executed, with the interactive command as its argument. The 'precmd' +# function is executed before each prompt is displayed. +# +# Author: Ryan Caloras (ryan@bashhub.com) +# Forked from Original Author: Glyph Lefkowitz +# +# V0.5.0 +# + +# General Usage: +# +# 1. Source this file at the end of your bash profile so as not to interfere +# with anything else that's using PROMPT_COMMAND. +# +# 2. Add any precmd or preexec functions by appending them to their arrays: +# e.g. +# precmd_functions+=(my_precmd_function) +# precmd_functions+=(some_other_precmd_function) +# +# preexec_functions+=(my_preexec_function) +# +# 3. Consider changing anything using the DEBUG trap or PROMPT_COMMAND +# to use preexec and precmd instead. Preexisting usages will be +# preserved, but doing so manually may be less surprising. +# +# Note: This module requires two Bash features which you must not otherwise be +# using: the "DEBUG" trap, and the "PROMPT_COMMAND" variable. If you override +# either of these after bash-preexec has been installed it will most likely break. + +# Tell shellcheck what kind of file this is. +# shellcheck shell=bash + +# Make sure this is bash that's running and return otherwise. +# Use POSIX syntax for this line: +if [ -z "${BASH_VERSION-}" ]; then + return 1; +fi + +# We only support Bash 3.1+. +# Note: BASH_VERSINFO is first available in Bash-2.0. +if [[ -z "${BASH_VERSINFO-}" || BASH_VERSINFO[0] -lt 3 || BASH_VERSINFO[0] -eq 3 && BASH_VERSINFO[1] -lt 1 ]]; then + return 1 +fi + +# Avoid duplicate inclusion +if [[ -n "${bash_preexec_imported:-}" ]]; then + return 0 +fi +bash_preexec_imported="defined" + +# WARNING: This variable is no longer used and should not be relied upon. +# Use ${bash_preexec_imported} instead. +# shellcheck disable=SC2034 +__bp_imported="${bash_preexec_imported}" + +# Should be available to each precmd and preexec +# functions, should they want it. $? and $_ are available as $? and $_, but +# $PIPESTATUS is available only in a copy, $BP_PIPESTATUS. +# TODO: Figure out how to restore PIPESTATUS before each precmd or preexec +# function. +__bp_last_ret_value="$?" +BP_PIPESTATUS=("${PIPESTATUS[@]}") +__bp_last_argument_prev_command="$_" + +__bp_inside_precmd=0 +__bp_inside_preexec=0 + +# Initial PROMPT_COMMAND string that is removed from PROMPT_COMMAND post __bp_install +__bp_install_string=$'__bp_trap_string="$(trap -p DEBUG)"\ntrap - DEBUG\n__bp_install' + +# Fails if any of the given variables are readonly +# Reference https://stackoverflow.com/a/4441178 +__bp_require_not_readonly() { + local var + for var; do + if ! ( unset "$var" 2> /dev/null ); then + echo "bash-preexec requires write access to ${var}" >&2 + return 1 + fi + done +} + +# Remove ignorespace and or replace ignoreboth from HISTCONTROL +# so we can accurately invoke preexec with a command from our +# history even if it starts with a space. +__bp_adjust_histcontrol() { + local histcontrol + histcontrol="${HISTCONTROL:-}" + histcontrol="${histcontrol//ignorespace}" + # Replace ignoreboth with ignoredups + if [[ "$histcontrol" == *"ignoreboth"* ]]; then + histcontrol="ignoredups:${histcontrol//ignoreboth}" + fi; + export HISTCONTROL="$histcontrol" +} + +# This variable describes whether we are currently in "interactive mode"; +# i.e. whether this shell has just executed a prompt and is waiting for user +# input. It documents whether the current command invoked by the trace hook is +# run interactively by the user; it's set immediately after the prompt hook, +# and unset as soon as the trace hook is run. +__bp_preexec_interactive_mode="" + +# These arrays are used to add functions to be run before, or after, prompts. +declare -a precmd_functions +declare -a preexec_functions + +# Trims leading and trailing whitespace from $2 and writes it to the variable +# name passed as $1 +__bp_trim_whitespace() { + local var=${1:?} text=${2:-} + text="${text#"${text%%[![:space:]]*}"}" # remove leading whitespace characters + text="${text%"${text##*[![:space:]]}"}" # remove trailing whitespace characters + printf -v "$var" '%s' "$text" +} + + +# Trims whitespace and removes any leading or trailing semicolons from $2 and +# writes the resulting string to the variable name passed as $1. Used for +# manipulating substrings in PROMPT_COMMAND +__bp_sanitize_string() { + local var=${1:?} text=${2:-} sanitized + __bp_trim_whitespace sanitized "$text" + sanitized=${sanitized%;} + sanitized=${sanitized#;} + __bp_trim_whitespace sanitized "$sanitized" + printf -v "$var" '%s' "$sanitized" +} + +# This function is installed as part of the PROMPT_COMMAND; +# It sets a variable to indicate that the prompt was just displayed, +# to allow the DEBUG trap to know that the next command is likely interactive. +__bp_interactive_mode() { + __bp_preexec_interactive_mode="on"; +} + + +# This function is installed as part of the PROMPT_COMMAND. +# It will invoke any functions defined in the precmd_functions array. +__bp_precmd_invoke_cmd() { + # Save the returned value from our last command, and from each process in + # its pipeline. Note: this MUST be the first thing done in this function. + # BP_PIPESTATUS may be unused, ignore + # shellcheck disable=SC2034 + + __bp_last_ret_value="$?" BP_PIPESTATUS=("${PIPESTATUS[@]}") + + # Don't invoke precmds if we are inside an execution of an "original + # prompt command" by another precmd execution loop. This avoids infinite + # recursion. + if (( __bp_inside_precmd > 0 )); then + return + fi + local __bp_inside_precmd=1 + + # Invoke every function defined in our function array. + local precmd_function + for precmd_function in "${precmd_functions[@]}"; do + + # Only execute this function if it actually exists. + # Test existence of functions with: declare -[Ff] + if type -t "$precmd_function" 1>/dev/null; then + __bp_set_ret_value "$__bp_last_ret_value" "$__bp_last_argument_prev_command" + # Quote our function invocation to prevent issues with IFS + "$precmd_function" + fi + done + + __bp_set_ret_value "$__bp_last_ret_value" +} + +# Sets a return value in $?. We may want to get access to the $? variable in our +# precmd functions. This is available for instance in zsh. We can simulate it in bash +# by setting the value here. +__bp_set_ret_value() { + return ${1:+"$1"} +} + +__bp_in_prompt_command() { + + local prompt_command_array + IFS=$'\n;' read -rd '' -a prompt_command_array <<< "${PROMPT_COMMAND:-}" + + local trimmed_arg + __bp_trim_whitespace trimmed_arg "${1:-}" + + local command trimmed_command + for command in "${prompt_command_array[@]:-}"; do + __bp_trim_whitespace trimmed_command "$command" + if [[ "$trimmed_command" == "$trimmed_arg" ]]; then + return 0 + fi + done + + return 1 +} + +# This function is installed as the DEBUG trap. It is invoked before each +# interactive prompt display. Its purpose is to inspect the current +# environment to attempt to detect if the current command is being invoked +# interactively, and invoke 'preexec' if so. +__bp_preexec_invoke_exec() { + + # Save the contents of $_ so that it can be restored later on. + # https://stackoverflow.com/questions/40944532/bash-preserve-in-a-debug-trap#40944702 + __bp_last_argument_prev_command="${1:-}" + # Don't invoke preexecs if we are inside of another preexec. + if (( __bp_inside_preexec > 0 )); then + return + fi + local __bp_inside_preexec=1 + + # Checks if the file descriptor is not standard out (i.e. '1') + # __bp_delay_install checks if we're in test. Needed for bats to run. + # Prevents preexec from being invoked for functions in PS1 + if [[ ! -t 1 && -z "${__bp_delay_install:-}" ]]; then + return + fi + + if [[ -n "${COMP_LINE:-}" ]]; then + # We're in the middle of a completer. This obviously can't be + # an interactively issued command. + return + fi + if [[ -z "${__bp_preexec_interactive_mode:-}" ]]; then + # We're doing something related to displaying the prompt. Let the + # prompt set the title instead of me. + return + else + # If we're in a subshell, then the prompt won't be re-displayed to put + # us back into interactive mode, so let's not set the variable back. + # In other words, if you have a subshell like + # (sleep 1; sleep 2) + # You want to see the 'sleep 2' as a set_command_title as well. + if [[ 0 -eq "${BASH_SUBSHELL:-}" ]]; then + __bp_preexec_interactive_mode="" + fi + fi + + if __bp_in_prompt_command "${BASH_COMMAND:-}"; then + # If we're executing something inside our prompt_command then we don't + # want to call preexec. Bash prior to 3.1 can't detect this at all :/ + __bp_preexec_interactive_mode="" + return + fi + + local this_command + this_command=$( + export LC_ALL=C + HISTTIMEFORMAT='' builtin history 1 | sed '1 s/^ *[0-9][0-9]*[* ] //' + ) + + # Sanity check to make sure we have something to invoke our function with. + if [[ -z "$this_command" ]]; then + return + fi + + # Invoke every function defined in our function array. + local preexec_function + local preexec_function_ret_value + local preexec_ret_value=0 + for preexec_function in "${preexec_functions[@]:-}"; do + + # Only execute each function if it actually exists. + # Test existence of function with: declare -[fF] + if type -t "$preexec_function" 1>/dev/null; then + __bp_set_ret_value "${__bp_last_ret_value:-}" + # Quote our function invocation to prevent issues with IFS + "$preexec_function" "$this_command" + preexec_function_ret_value="$?" + if [[ "$preexec_function_ret_value" != 0 ]]; then + preexec_ret_value="$preexec_function_ret_value" + fi + fi + done + + # Restore the last argument of the last executed command, and set the return + # value of the DEBUG trap to be the return code of the last preexec function + # to return an error. + # If `extdebug` is enabled a non-zero return value from any preexec function + # will cause the user's command not to execute. + # Run `shopt -s extdebug` to enable + __bp_set_ret_value "$preexec_ret_value" "$__bp_last_argument_prev_command" +} + +__bp_install() { + # Exit if we already have this installed. + if [[ "${PROMPT_COMMAND:-}" == *"__bp_precmd_invoke_cmd"* ]]; then + return 1; + fi + + trap '__bp_preexec_invoke_exec "$_"' DEBUG + + # Preserve any prior DEBUG trap as a preexec function + local prior_trap + # we can't easily do this with variable expansion. Leaving as sed command. + # shellcheck disable=SC2001 + prior_trap=$(sed "s/[^']*'\(.*\)'[^']*/\1/" <<<"${__bp_trap_string:-}") + unset __bp_trap_string + if [[ -n "$prior_trap" ]]; then + eval '__bp_original_debug_trap() { + '"$prior_trap"' + }' + preexec_functions+=(__bp_original_debug_trap) + fi + + # Adjust our HISTCONTROL Variable if needed. + __bp_adjust_histcontrol + + # Issue #25. Setting debug trap for subshells causes sessions to exit for + # backgrounded subshell commands (e.g. (pwd)& ). Believe this is a bug in Bash. + # + # Disabling this by default. It can be enabled by setting this variable. + if [[ -n "${__bp_enable_subshells:-}" ]]; then + + # Set so debug trap will work be invoked in subshells. + set -o functrace > /dev/null 2>&1 + shopt -s extdebug > /dev/null 2>&1 + fi; + + local existing_prompt_command + # Remove setting our trap install string and sanitize the existing prompt command string + existing_prompt_command="${PROMPT_COMMAND:-}" + existing_prompt_command="${existing_prompt_command//${__bp_install_string}[;$'\n']}" # Edge case of appending to PROMPT_COMMAND + existing_prompt_command="${existing_prompt_command//$__bp_install_string}" + __bp_sanitize_string existing_prompt_command "$existing_prompt_command" + + # Install our hooks in PROMPT_COMMAND to allow our trap to know when we've + # actually entered something. + PROMPT_COMMAND=$'__bp_precmd_invoke_cmd\n' + if [[ -n "$existing_prompt_command" ]]; then + PROMPT_COMMAND+=${existing_prompt_command}$'\n' + fi; + PROMPT_COMMAND+='__bp_interactive_mode' + + # Add two functions to our arrays for convenience + # of definition. + precmd_functions+=(precmd) + preexec_functions+=(preexec) + + # Invoke our two functions manually that were added to $PROMPT_COMMAND + __bp_precmd_invoke_cmd + __bp_interactive_mode +} + +# Sets an installation string as part of our PROMPT_COMMAND to install +# after our session has started. This allows bash-preexec to be included +# at any point in our bash profile. +__bp_install_after_session_init() { + # bash-preexec needs to modify these variables in order to work correctly + # if it can't, just stop the installation + __bp_require_not_readonly PROMPT_COMMAND HISTCONTROL HISTTIMEFORMAT || return + + local sanitized_prompt_command + __bp_sanitize_string sanitized_prompt_command "${PROMPT_COMMAND:-}" + if [[ -n "$sanitized_prompt_command" ]]; then + PROMPT_COMMAND=${sanitized_prompt_command}$'\n' + fi; + PROMPT_COMMAND+=${__bp_install_string} +} + +# Run our install so long as we're not delaying it. +if [[ -z "${__bp_delay_install:-}" ]]; then + __bp_install_after_session_init +fi; From b07eaa1ce4ad50690363a463f06d956d64247648 Mon Sep 17 00:00:00 2001 From: Koichi Murase Date: Sun, 2 Oct 2022 10:13:12 +0900 Subject: [PATCH 4/7] themes/absimple: Update description * themes/absimple/amsimple.theme.sh: Update description * themes/absimple/README: Update description --- themes/absimple/README.md | 17 ++++++++--------- themes/absimple/absimple.theme.sh | 14 ++++++++------ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/themes/absimple/README.md b/themes/absimple/README.md index 222c0f7..e71909f 100644 --- a/themes/absimple/README.md +++ b/themes/absimple/README.md @@ -1,15 +1,14 @@ # ab+simple theme -this theme needs a Powerline-patched font to render correctly. i recommend: https://github.com/adi1090x/termux-style +This theme needs a Powerline-patched font to be rendered correctly. The original author of the theme recommends https://github.com/adi1090x/termux-style -a colorful theme based on agnoster theme, made shorter and simpler. +This is a colorful theme based on the agnoster theme, made shorter and simpler. -added title support for termux and random dates for fun. - -the aim of this theme is to only show you *relevant* information. - -ie: it will only show git information when in a git working directory. - -also, everything from the current user and hostname to whether the last call exited with an error or whether background jobs are running in this shell will all be displayed automatically when appropriate. +The aim of this theme is to only show you relevant information: +The git information will only be shown in a git working directory. +Similarly, everything will be displayed automatically when appropriate, +including the current user and the hostname, +whether the last call exited with an error, +and whether background jobs are running in this shell. ![bash screenshot](absimple-bash.png) diff --git a/themes/absimple/absimple.theme.sh b/themes/absimple/absimple.theme.sh index efbfa5c..b0535d3 100644 --- a/themes/absimple/absimple.theme.sh +++ b/themes/absimple/absimple.theme.sh @@ -1,14 +1,16 @@ #!/usr/bin/env bash # vim: ft=bash ts=2 sw=2 sts=2 # -# absimple theme -# an agnoster fork for bash +# absimple theme: a fork of the agnoster theme # -# tested on termux at android 2022-02-15 +# Tested on Termux in Android 2022-02-15 # -# the aim of this theme is to only show you *relevant* information. -# ie: it will only show git information when in a git working directory. -# also, everything from the current user and hostname to whether the last call exited with an error or whether background jobs are running in this shell will all be displayed automatically when appropriate. +# The aim of this theme is to only show you relevant information: The +# git information will only be shown in a git working directory. +# Similarly, everything will be displayed automatically when +# appropriate, including the current user and the hostname, whether +# the last call exited with an error, and whether background jobs are +# running in this shell. PROMPT_DIRTRIM=2 # bash4 and above From 4026ab6380fdddf72dcf057cea8071c800b3f3ce Mon Sep 17 00:00:00 2001 From: Koichi Murase Date: Sun, 2 Oct 2022 11:04:27 +0900 Subject: [PATCH 5/7] plugins/bash-preexec: Add loader * plugins/bash-preexec: Add loader * plugins/bash-preexec/README: Fix description --- plugins/bash-preexec/README.md | 2 +- plugins/bash-preexec/bash-preexec.plugin.sh | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 plugins/bash-preexec/bash-preexec.plugin.sh diff --git a/plugins/bash-preexec/README.md b/plugins/bash-preexec/README.md index c9b4065..ddf0651 100644 --- a/plugins/bash-preexec/README.md +++ b/plugins/bash-preexec/README.md @@ -1,3 +1,3 @@ # bash preexec -this allows to set the window title on termux +This plugin loads `bash-preexec.sh` bundled with OMB if necessary. diff --git a/plugins/bash-preexec/bash-preexec.plugin.sh b/plugins/bash-preexec/bash-preexec.plugin.sh new file mode 100644 index 0000000..22323a9 --- /dev/null +++ b/plugins/bash-preexec/bash-preexec.plugin.sh @@ -0,0 +1,4 @@ +#! bash oh-my-bash.module +if [[ ! ${bash_preexec_imported:-${__bp_imported:-}} ]]; then + source "$OSH/tools/bash-preexec.sh" +fi From 9ac2a92906415f7c91e6d74fd3f94cddb967422e Mon Sep 17 00:00:00 2001 From: Koichi Murase Date: Sun, 2 Oct 2022 10:36:05 +0900 Subject: [PATCH 6/7] plugins/xterm: Refactor * plugins/xterm: Add header line as an OMB plugin * plugins/xterm: Add link to the upstream version * plugins/xterm: Add the list of the configuration variables * plugins/xterm: Do not rely on the function "cite" * plugins/xterm: Add dependency to bash-preexec * plugins/xterm: Use "function func" to avoid aliasing * plugins/xterm: Namespacing function names * plugins/xterm: Namespacing configuration variables * plugins/xterm (_omb_plugin_xterm_set_title): Avoid expanding escapes in directory names, etc. * plugins/xterm: Always enable precmd/preexec because the plugin should be enabled by the users' decision * plugins/xterm: Do no unneccessarily add braces around ${var} * plugins/xterm: Do no uneccessarily quote words * plugins/xterm: Add README --- plugins/xterm/README.md | 3 ++ plugins/xterm/xterm.plugin.bash | 75 ++++++++++++++++++--------------- 2 files changed, 44 insertions(+), 34 deletions(-) create mode 100644 plugins/xterm/README.md diff --git a/plugins/xterm/README.md b/plugins/xterm/README.md new file mode 100644 index 0000000..eca3b5f --- /dev/null +++ b/plugins/xterm/README.md @@ -0,0 +1,3 @@ +# Xterm plugin + +This plugin sets the xterm title for the current directory and the currently running command. diff --git a/plugins/xterm/xterm.plugin.bash b/plugins/xterm/xterm.plugin.bash index 740460e..3dfde12 100644 --- a/plugins/xterm/xterm.plugin.bash +++ b/plugins/xterm/xterm.plugin.bash @@ -1,45 +1,52 @@ -# shellcheck shell=bash -cite about-plugin -about-plugin 'automatically set your xterm title with host and location info' +#! bash oh-my-bash.module +# Description: automatically set your xterm title with host and location info' +# Source: https://github.com/Bash-it/bash-it/blob/bf2034d13d/plugins/available/xterm.plugin.bash +# +# @var[opt] PROMPT_CHAR ... This variable is shared with powerline +# @var[opt] OMB_PLUGIN_XTERM_SHORT_TERM_LINE +# @var[opt] OMB_PLUGIN_XTERM_SHORT_USER +# @var[opt] OMB_PLUGIN_XTERM_SHORT_HOSTNAME +# -_short-dirname() { - local dir_name="${PWD/~/\~}" - if [[ "${SHORT_TERM_LINE:-}" == true && "${#dir_name}" -gt 8 ]]; then - echo "${dir_name##*/}" - else - echo "${dir_name}" - fi +_omb_module_require plugin:bash-preexec + +function _omb_plugin_xterm_short_dirname { + local dir_name=${PWD/~/\~} + if [[ ${OMB_PLUGIN_XTERM_SHORT_TERM_LINE-} == true ]] && ((${#dir_name} > 8)); then + dir_name=${dir_name##*/} + fi + echo "$dir_name" } -_short-command() { - local input_command="$*" - if [[ "${SHORT_TERM_LINE:-}" == true && "${#input_command}" -gt 8 ]]; then - echo "${input_command%% *}" - else - echo "${input_command}" - fi +function _omb_plugin_xterm_short_command { + local input_command="$*" + if [[ ${OMB_PLUGIN_XTERM_SHORT_TERM_LINE-} == true ]] ((${#input_command} > 8)); then + input_command=${input_command%% *} + fi + echo "$input_command" } -set_xterm_title() { - local title="${1:-}" - echo -ne "\033]0;${title}\007" +function _omb_plugin_xterm_set_title { + local title=${1-} + printf '\e]0;%s\e\\' "$title" } -precmd_xterm_title() { - set_xterm_title "${SHORT_USER:-${USER}}@${SHORT_HOSTNAME:-${HOSTNAME}} $(_short-dirname) ${PROMPT_CHAR:-\$}" +function _omb_plugin_xterm_precmd_title { + local user=${OMB_PLUGIN_XTERM_SHORT_USER:-$USER} + local host=${OMB_PLUGIN_XTERM_SHORT_HOSTNAME:-$HOSTNAME} + _omb_plugin_xterm_set_title "$user@$host $(_omb_plugin_xterm_short_dirname) ${PROMPT_CHAR:-\$}" } -preexec_xterm_title() { - local command_line="${BASH_COMMAND:-${1:-}}" - local directory_name short_command - directory_name="$(_short-dirname)" - short_command="$(_short-command "${command_line}")" - set_xterm_title "${short_command} {${directory_name}} (${SHORT_USER:-${USER}}@${SHORT_HOSTNAME:-${HOSTNAME}})" +function _omb_plugin_xterm_preexec_title { + local command_line=${BASH_COMMAND:-${1:-}} + local directory_name=$(_omb_plugin_xterm_short_dirname) + local short_command=$(_omb_plugin_xterm_short_command "$command_line") + local user=${OMB_PLUGIN_XTERM_SHORT_USER:-$USER} + local host=${OMB_PLUGIN_XTERM_SHORT_HOSTNAME:-$HOSTNAME} + _omb_plugin_xterm_set_title "$short_command {$directory_name} ($user@$host)" } -case "${TERM:-dumb}" in - xterm* | rxvt*) - precmd_functions+=(precmd_xterm_title) - preexec_functions+=(preexec_xterm_title) - ;; -esac +function set_xterm_title { _omb_plugin_xterm_set_title "$@"; } + +precmd_functions+=(_omb_plugin_xterm_precmd_title) +preexec_functions+=(_omb_plugin_xterm_preexec_title) From a4c92d60ce4215b0ffab271fb7f9f712f6e28d3e Mon Sep 17 00:00:00 2001 From: Koichi Murase Date: Sun, 2 Oct 2022 11:17:40 +0900 Subject: [PATCH 7/7] themes/absimple: Use the standard way to register PROMPT_COMMAND --- themes/absimple/absimple.theme.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/themes/absimple/absimple.theme.sh b/themes/absimple/absimple.theme.sh index b0535d3..d74a566 100644 --- a/themes/absimple/absimple.theme.sh +++ b/themes/absimple/absimple.theme.sh @@ -360,7 +360,7 @@ build_prompt() { # this doesn't work... new model: create a prompt via a PR variable and # use that. -set_bash_prompt() { +_omb_theme_PROMPT_COMMAND() { local RETVAL=$? local PR="" local PRIGHT="" @@ -382,5 +382,4 @@ set_bash_prompt() { # PS1='\[$(tput sc; printf "%*s" $COLUMNS "$PRIGHT"; tput rc)\]'$PR PS1+=$PR } - -PROMPT_COMMAND=set_bash_prompt +_omb_util_add_prompt_command _omb_theme_PROMPT_COMMAND