update
This commit is contained in:
parent
7a97c460d8
commit
c3c680ecca
11 changed files with 364 additions and 356 deletions
29
bashrc.d/00-core.bash
Normal file
29
bashrc.d/00-core.bash
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
# shellcheck shell=bash
|
||||
|
||||
# Shared colors used by later Bash modules.
|
||||
_WHITE='\033[1;37m'
|
||||
_NC='\033[0m'
|
||||
_RED='\033[0;31m'
|
||||
_YELLOW='\033[0;33m'
|
||||
_BLUE='\033[1;34m'
|
||||
_BRIGHT_GREEN='\033[1;32m'
|
||||
_BRIGHT_RED='\033[1;31m'
|
||||
_BRIGHT_WHITE='\033[1;37m'
|
||||
_DIM_RED='\033[91m'
|
||||
|
||||
export SHELL_CONFIG="${SHELL_CONFIG:+${SHELL_CONFIG}:}.bashrc"
|
||||
|
||||
export HISTCONTROL=ignoreboth:erasedups
|
||||
export HISTFILE="$HOME/.histfile"
|
||||
export HISTSIZE=10000
|
||||
export HISTFILESIZE=10000
|
||||
shopt -s histappend checkwinsize
|
||||
|
||||
# Disable terminal flow-control keys only when stdin is a terminal.
|
||||
[[ -t 0 ]] && stty -ixon
|
||||
|
||||
# If there are multiple completion matches, cycle through them while still
|
||||
# displaying the shared prefix and full candidate list.
|
||||
bind TAB:menu-complete
|
||||
bind "set show-all-if-ambiguous on"
|
||||
bind "set menu-complete-display-prefix on"
|
||||
43
bashrc.d/10-prompt.bash
Normal file
43
bashrc.d/10-prompt.bash
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
# shellcheck shell=bash
|
||||
|
||||
draw_prompt_divider() {
|
||||
local timestamp prefix prefix_length line_length i
|
||||
printf -v timestamp '%(%H:%M:%S)T' -1
|
||||
prefix="$timestamp ├"
|
||||
prefix_length=${#prefix}
|
||||
line_length=$(( ${COLUMNS:-80} - prefix_length ))
|
||||
|
||||
printf '%s' "$prefix"
|
||||
for ((i = 0; i < line_length; i++)); do printf '─'; done
|
||||
echo
|
||||
}
|
||||
|
||||
_CACHED_USER_HOST="$USER@$HOSTNAME"
|
||||
_CACHED_USER_HOST_LENGTH=${#_CACHED_USER_HOST}
|
||||
|
||||
calculate_git_alignment() {
|
||||
[[ -z "$GITSTATUS_PROMPT" ]] && { GIT_ALIGNMENT_PADDING=""; return; }
|
||||
|
||||
local cleaned branch_name needed_padding
|
||||
cleaned=$(echo "$GITSTATUS_PROMPT" | sed -e 's/\x01//g' -e 's/\x02//g' -e 's/\x1b\[[0-9;]*m//g')
|
||||
branch_name="${cleaned%% *}"
|
||||
needed_padding=$((_CACHED_USER_HOST_LENGTH - ${#branch_name}))
|
||||
[[ $needed_padding -lt 8 ]] && needed_padding=8
|
||||
printf -v GIT_ALIGNMENT_PADDING '%*s' "$needed_padding" ''
|
||||
}
|
||||
|
||||
append_new_history() {
|
||||
history -a
|
||||
}
|
||||
|
||||
[ -r "$HOME/.config/bash/gitstatus-custom.sh" ] && . "$HOME/.config/bash/gitstatus-custom.sh"
|
||||
|
||||
PROMPT_COMMAND="append_new_history; draw_prompt_divider; my_gitstatus_prompt_update; calculate_git_alignment"
|
||||
|
||||
command_not_found_handle() {
|
||||
printf '\033[01;31mbash: %s: command not found\033[00m\n' "$1" >&2
|
||||
return 127
|
||||
}
|
||||
|
||||
_error_block='██████'
|
||||
PS1='\[\033[01;32m\]\u@\h\[\033[00m\] \[\033[1;34m\]\w\[\033[00m\]\n${GITSTATUS_PROMPT:+$GIT_ALIGNMENT_PADDING$GITSTATUS_PROMPT\n}$([ "$?" -eq 0 ] && echo "" || echo "\[\033[01;31m\]$_error_block\[\033[00m\] ")\$ \[\e]0;\u@\h: \w\a\]'
|
||||
75
bashrc.d/20-greeting.bash
Normal file
75
bashrc.d/20-greeting.bash
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
# shellcheck shell=bash
|
||||
|
||||
show_date() {
|
||||
local dotfile selected_adjective adjective classification
|
||||
local today day_of_week day_of_month month_name year day_suffix text_color full_date
|
||||
local -a adjectives
|
||||
|
||||
dotfile="$HOME/.adjective_of_the_day"
|
||||
today=$(date +%F)
|
||||
|
||||
if [[ -f "$dotfile" && $(date -r "$dotfile" +%F) == "$today" ]]; then
|
||||
selected_adjective=$(cat "$dotfile")
|
||||
else
|
||||
adjectives=(
|
||||
"beautiful:positive"
|
||||
"engaging:positive"
|
||||
"majestic:positive"
|
||||
"distinguished:positive"
|
||||
"venerable:positive"
|
||||
"formal:positive"
|
||||
"elegant:positive"
|
||||
"serene:positive"
|
||||
"graceful:positive"
|
||||
"regal:positive"
|
||||
"noble:positive"
|
||||
"miserable:negative"
|
||||
"worthless:negative"
|
||||
"depressing:negative"
|
||||
"soulless:negative"
|
||||
"desolate:negative"
|
||||
"archaic:negative"
|
||||
"grim:negative"
|
||||
"dreadful:negative"
|
||||
"forlorn:negative"
|
||||
"wretched:negative"
|
||||
"neutral:neutral"
|
||||
"ordinary:neutral"
|
||||
"common:neutral"
|
||||
"antique:neutral"
|
||||
"ceremonial:neutral"
|
||||
"timeless:neutral"
|
||||
"classic:neutral"
|
||||
"historic:neutral"
|
||||
"ancient:neutral"
|
||||
)
|
||||
|
||||
selected_adjective="${adjectives[$RANDOM % ${#adjectives[@]}]}"
|
||||
printf '%s\n' "$selected_adjective" > "$dotfile"
|
||||
fi
|
||||
|
||||
IFS=':' read -r adjective classification <<< "$selected_adjective"
|
||||
day_of_week=$(date '+%A')
|
||||
day_of_month=$(date '+%d')
|
||||
month_name=$(date '+%B')
|
||||
year=$(date '+%Y')
|
||||
|
||||
case "$day_of_month" in
|
||||
1[0-9]) day_suffix="th" ;;
|
||||
*1) day_suffix="st" ;;
|
||||
*2) day_suffix="nd" ;;
|
||||
*3) day_suffix="rd" ;;
|
||||
*) day_suffix="th" ;;
|
||||
esac
|
||||
|
||||
case "$classification" in
|
||||
positive) text_color="$_BRIGHT_GREEN" ;;
|
||||
negative) text_color="$_BRIGHT_RED" ;;
|
||||
*) text_color="" ;;
|
||||
esac
|
||||
|
||||
full_date="Pray, be informed, on this ${text_color}${adjective}${_NC} day,\n${_BLUE}${day_of_week}${_NC} the ${_BLUE}${day_of_month}${day_suffix}${_NC} day of ${_BLUE}${month_name}${_NC}, in the year of our Lord ${_BLUE}${year}${_NC}!"
|
||||
printf '%b\n\n' "$full_date"
|
||||
}
|
||||
|
||||
show_date
|
||||
16
bashrc.d/30-integrations.bash
Normal file
16
bashrc.d/30-integrations.bash
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
# shellcheck shell=bash
|
||||
|
||||
[ -r "$HOME/.config/profile/interactive.sh" ] && . "$HOME/.config/profile/interactive.sh"
|
||||
[ -r "$HOME/.config/bash/aliases.bash" ] && . "$HOME/.config/bash/aliases.bash"
|
||||
|
||||
export NVM_DIR="$HOME/.nvm"
|
||||
if [[ -s "$NVM_DIR/nvm.sh" ]]; then
|
||||
\. "$NVM_DIR/nvm.sh"
|
||||
nvm use default >/dev/null
|
||||
[[ -s "$NVM_DIR/bash_completion" ]] && \. "$NVM_DIR/bash_completion"
|
||||
fi
|
||||
|
||||
# https://github.com/skywind3000/z.lua
|
||||
if command -v lua >/dev/null 2>&1; then
|
||||
eval "$(lua "$HOME/.z.lua/z.lua" --init bash enhanced once echo)"
|
||||
fi >/dev/null
|
||||
90
bashrc.d/40-status.bash
Normal file
90
bashrc.d/40-status.bash
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
# shellcheck shell=bash
|
||||
|
||||
_mem_available=$(awk '/MemAvailable/ { printf "%.1f \n", $2/1024/1024 }' /proc/meminfo)
|
||||
_package_status_cache="${XDG_CACHE_HOME:-$HOME/.cache}/package-status/status"
|
||||
_package_status_attempt="${XDG_CACHE_HOME:-$HOME/.cache}/package-status/last-attempt"
|
||||
_package_status_max_age=3600
|
||||
_package_status_retry_delay=300
|
||||
_package_status_version=""
|
||||
_package_status_checked_at=""
|
||||
_package_status_pacman_log_signature=""
|
||||
_updates_available="0"
|
||||
_orphans_available="0"
|
||||
|
||||
if [[ -r "$_package_status_cache" ]]; then
|
||||
while IFS='=' read -r _package_status_key _package_status_value; do
|
||||
case "$_package_status_key" in
|
||||
version) _package_status_version="$_package_status_value" ;;
|
||||
updates) _updates_available="$_package_status_value" ;;
|
||||
orphans) _orphans_available="$_package_status_value" ;;
|
||||
checked_at) _package_status_checked_at="$_package_status_value" ;;
|
||||
pacman_log_signature) _package_status_pacman_log_signature="$_package_status_value" ;;
|
||||
esac
|
||||
done < "$_package_status_cache"
|
||||
fi
|
||||
|
||||
_package_status_now=$(date +%s)
|
||||
_package_status_current_pacman_log_signature=$(stat -c '%Y:%s:%i' /var/log/pacman.log 2>/dev/null || echo '0:0:0')
|
||||
|
||||
if ! [[ "$_package_status_version" == "1" \
|
||||
&& "$_updates_available" =~ ^[0-9]+$ \
|
||||
&& "$_orphans_available" =~ ^[0-9]+$ \
|
||||
&& "$_package_status_checked_at" =~ ^[0-9]+$ \
|
||||
&& "$_package_status_pacman_log_signature" =~ ^[0-9]+:[0-9]+:[0-9]+$ \
|
||||
&& $_package_status_now -ge $_package_status_checked_at \
|
||||
&& $((_package_status_now - _package_status_checked_at)) -le $_package_status_max_age \
|
||||
&& "$_package_status_pacman_log_signature" == "$_package_status_current_pacman_log_signature" ]]; then
|
||||
_updates_available="0"
|
||||
_orphans_available="0"
|
||||
|
||||
_package_status_attempt_time=$(stat -c %Y "$_package_status_attempt" 2>/dev/null || echo 0)
|
||||
if ! [[ "$_package_status_attempt_time" =~ ^[0-9]+$ \
|
||||
&& $_package_status_now -ge $_package_status_attempt_time \
|
||||
&& $((_package_status_now - _package_status_attempt_time)) -lt $_package_status_retry_delay ]]; then
|
||||
systemctl --user start --no-block package-status-refresh.service >/dev/null 2>&1 || true
|
||||
fi
|
||||
fi
|
||||
|
||||
if declare -F _command_reminder >/dev/null 2>&1; then
|
||||
printf '%s\n' 'Remember commands:'
|
||||
printf '%b' "$_WHITE"
|
||||
_command_reminder
|
||||
printf '%b\n\n' "$_NC"
|
||||
fi
|
||||
|
||||
if [[ ${_mem_available%.*} -lt 5 ]]; then
|
||||
printf 'Memory available: %b' "$_YELLOW"
|
||||
[[ ${_mem_available%.*} -lt 3 ]] && printf '%b' "$_RED"
|
||||
printf '%sGB%b\n' "$_mem_available" "$_NC"
|
||||
fi
|
||||
|
||||
if [[ $_updates_available -gt 0 ]]; then
|
||||
update_color="$_BRIGHT_WHITE"
|
||||
if [[ $_updates_available -gt 29 ]]; then
|
||||
update_color="$_RED"
|
||||
elif [[ $_updates_available -gt 15 ]]; then
|
||||
update_color="$_YELLOW"
|
||||
fi
|
||||
printf 'Updates available: %b%s%b [ update with: %bupdate%b ]\n' \
|
||||
"$update_color" "$_updates_available" "$_NC" "$update_color" "$_NC"
|
||||
fi
|
||||
|
||||
if [[ $_orphans_available -gt 0 ]]; then
|
||||
orphan_color="$_BRIGHT_WHITE"
|
||||
if [[ $_orphans_available -gt 9 ]]; then
|
||||
orphan_color="$_RED"
|
||||
elif [[ $_orphans_available -gt 4 ]]; then
|
||||
orphan_color="$_YELLOW"
|
||||
fi
|
||||
printf 'Orphaned packages: %b%s%b [ remove with: %bsudo pacman -Rns $(pacman -Qdtq)%b ]\n' \
|
||||
"$orphan_color" "$_orphans_available" "$_NC" "$orphan_color" "$_NC"
|
||||
fi
|
||||
|
||||
printf '\nRemember "%bTODO.md%b" (%bet%b) and "%bautonote.md%b" (%bea%b) files have content automatically displayed.\n\n' \
|
||||
"$_BLUE" "$_NC" "$_BLUE" "$_NC" "$_BLUE" "$_NC" "$_BLUE" "$_NC"
|
||||
|
||||
unset _mem_available _updates_available _orphans_available update_color orphan_color
|
||||
unset _package_status_cache _package_status_attempt _package_status_max_age
|
||||
unset _package_status_retry_delay _package_status_attempt_time _package_status_version
|
||||
unset _package_status_checked_at _package_status_pacman_log_signature _package_status_now
|
||||
unset _package_status_current_pacman_log_signature _package_status_key _package_status_value
|
||||
7
bashrc.d/50-completions.bash
Normal file
7
bashrc.d/50-completions.bash
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# shellcheck shell=bash
|
||||
|
||||
[ -r "$HOME/.config/bash/cheat.bash" ] && . "$HOME/.config/bash/cheat.bash"
|
||||
|
||||
if command -v codex >/dev/null 2>&1; then
|
||||
eval "$(codex completion bash)"
|
||||
fi
|
||||
28
bashrc.d/60-directory-notes.bash
Normal file
28
bashrc.d/60-directory-notes.bash
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# shellcheck shell=bash
|
||||
|
||||
check_todo() {
|
||||
if [[ -f TODO.md ]]; then
|
||||
echo
|
||||
printf '%bTODO.md%b\n' "$_DIM_RED" "$_NC"
|
||||
printf '%s\n' '---------------------------'
|
||||
if command -v mdcat >/dev/null 2>&1; then mdcat TODO.md; else cat TODO.md; fi
|
||||
printf '%s\n\n' '---------------------------'
|
||||
fi
|
||||
}
|
||||
|
||||
check_autonote() {
|
||||
if [[ -f .autonote.md ]]; then
|
||||
echo
|
||||
printf '%bautonote.md%b\n' "$_DIM_RED" "$_NC"
|
||||
printf '%s\n' '---------------------------'
|
||||
if command -v mdcat >/dev/null 2>&1; then mdcat .autonote.md; else cat .autonote.md; fi
|
||||
printf '%s\n\n' '---------------------------'
|
||||
fi
|
||||
}
|
||||
|
||||
cd() {
|
||||
builtin cd "$@" || return
|
||||
check_todo
|
||||
check_autonote
|
||||
return 0
|
||||
}
|
||||
16
bashrc.d/70-development.bash
Normal file
16
bashrc.d/70-development.bash
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
# shellcheck shell=bash
|
||||
|
||||
case ":$PATH:" in
|
||||
*":$HOME/.opencode/bin:"*) ;;
|
||||
*) export PATH="$HOME/.opencode/bin:$PATH" ;;
|
||||
esac
|
||||
|
||||
export PYENV_ROOT="$HOME/.pyenv"
|
||||
case ":$PATH:" in
|
||||
*":$PYENV_ROOT/bin:"*) ;;
|
||||
*) export PATH="$PYENV_ROOT/bin:$PATH" ;;
|
||||
esac
|
||||
|
||||
if [[ -z ${PYENV_SHELL:-} ]] && command -v pyenv >/dev/null 2>&1; then
|
||||
eval "$(pyenv init -)"
|
||||
fi
|
||||
Loading…
Add table
Add a link
Reference in a new issue