diff options
| author | Florian Fischer <florian.fischer@muhq.space> | 2022-03-25 13:27:18 +0100 |
|---|---|---|
| committer | Florian Fischer <florian.fischer@muhq.space> | 2022-03-25 13:27:18 +0100 |
| commit | a4f85b46c231656fcd47e51cbeef8ae333aea5d0 (patch) | |
| tree | 077d1d776f81709f9b37783d495d4ebe8e92c53f /files/bashrc | |
| download | bash-a4f85b46c231656fcd47e51cbeef8ae333aea5d0.tar.gz bash-a4f85b46c231656fcd47e51cbeef8ae333aea5d0.zip | |
inital commit
The role is extracted from the uberspace-configuration repository.
Diffstat (limited to 'files/bashrc')
| -rw-r--r-- | files/bashrc | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/files/bashrc b/files/bashrc new file mode 100644 index 0000000..41542e2 --- /dev/null +++ b/files/bashrc @@ -0,0 +1,157 @@ +# Source global definitions +if [ -f /etc/bashrc ]; then + source /etc/bashrc +fi + +# If not running interactively, don't do anything +[[ $- != *i* ]] && return + +# Set umask to allow only the user to write or execute new files +# https://en.wikipedia.org/wiki/Umask +umask 033 + +# Simple helper to add directory to $PATH if they are not included yet +pathadd() { + if [ -d "$1" ] && [[ "$PATH" != *"$1"* ]]; then + PATH="$1":$PATH + fi +} + +pathadd "${HOME}"/.local/bin + +source "${HOME}"/.aliases + +# navigate to first parent directory matching a regex +upto() { + if [ -z "$1" ]; then + echo 'Usage: upto <pattern>' >&2 + return 1 + fi + + local upto="$1" + cd "${PWD/\/$upto\/*//$upto}" || return +} + +# Rather simple prompt inspired by: +# https://code.mendhak.com/simple-bash-prompt-for-developers-ps1-git/ + +# Our prompt should show the user and the hostname because the uberspace +# connection is always a remote connection to different hosts. +# Having the user and the host in the prompt allows a better overview where +# we actually are. + +# Also git information should be presented if available. +# Source git-prompt code to have the git prompt helpers available +# Found via: `locate git-prompt` +source /usr/share/git-core/contrib/completion/git-prompt.sh + +__prompt() { + # This must be the first thing done to not override the last exit code + local last_status=$? + + local -r RESET='\[\033[00m\]' + local -r RED='\[\033[31m\]' + local -r GREEN='\[\033[32m\]' + local -r YELLOW='\[\033[33m\]' + + if [[ "$last_status" -gt 0 ]]; then + last_status=" ${RED}""${last_status}" + else + last_status="" + fi + + PS1="\u@\h ${GREEN}\W${YELLOW}$(GIT_PS1_SHOWUNTRACKEDFILES=1 GIT_PS1_SHOWDIRTYSTATE=1 __git_ps1)${last_status}${RESET}\$ " +} + +PROMPT_COMMAND=(__prompt) + +# Sensible Bash - An attempt at saner Bash defaults +# Maintainer: mrzool <http://mrzool.cc> +# Repository: https://github.com/mrzool/bash-sensible +# Version: 0.2.2 + +# Unique Bash version check +if ((BASH_VERSINFO[0] < 4)) +then + echo "sensible.bash: Looks like you're running an older version of Bash." + echo "sensible.bash: You need at least bash-4.0 or some options will not work correctly." + echo "sensible.bash: Keep your software up-to-date!" +fi + +## GENERAL OPTIONS ## + +# Prevent file overwrite on stdout redirection +# Use `>|` to force redirection to an existing file +set -o noclobber + +# Update window size after every command +shopt -s checkwinsize + +# Automatically trim long paths in the prompt (requires Bash 4.x) +PROMPT_DIRTRIM=2 + +# Enable history expansion with space +# E.g. typing !!<space> will replace the !! with your last command +bind Space:magic-space + +# Turn on recursive globbing (enables ** to recurse all directories) +shopt -s globstar 2> /dev/null + +# Case-insensitive globbing (used in pathname expansion) +shopt -s nocaseglob; + +## SMARTER TAB-COMPLETION (Readline bindings) ## + +# Perform file completion in a case insensitive fashion +bind "set completion-ignore-case on" + +# Treat hyphens and underscores as equivalent +bind "set completion-map-case on" + +# Display matches for ambiguous patterns at first tab press +bind "set show-all-if-ambiguous on" + +# Immediately add a trailing slash when autocompleting symlinks to directories +bind "set mark-symlinked-directories on" + +## SANE HISTORY DEFAULTS ## + +# Append to the history file, don't overwrite it +shopt -s histappend + +# Save multi-line commands as one command +shopt -s cmdhist + +# Record each line as it gets issued +PROMPT_COMMAND+=('history -a') + +# Huge history. Doesn't appear to slow things down, so why not? +HISTSIZE=500000 +HISTFILESIZE=100000 + +# Avoid duplicate entries +HISTCONTROL="erasedups:ignoreboth" + +# Don't record some commands +export HISTIGNORE="&:[ ]*:exit:ls:bg:fg:history:clear" + +# Use standard ISO 8601 timestamp +# %F equivalent to %Y-%m-%d +# %T equivalent to %H:%M:%S (24-hours format) +HISTTIMEFORMAT='%F %T ' + +# Enable incremental history search with up/down arrows (also Readline goodness) +# Learn more about this here: http://codeinthehole.com/writing/the-most-important-command-line-tip-incremental-history-searching-with-inputrc/ +bind '"\e[A": history-search-backward' +bind '"\e[B": history-search-forward' +bind '"\e[C": forward-char' +bind '"\e[D": backward-char' + +## BETTER DIRECTORY NAVIGATION ## + +# Prepend cd to directory names automatically +shopt -s autocd 2> /dev/null +# Correct spelling errors during tab-completion +shopt -s dirspell 2> /dev/null +# Correct spelling errors in arguments supplied to cd +shopt -s cdspell 2> /dev/null |
