Bash Configuration
Table of Contents
~/.bashrc
If not running interactively, don’t do anything
[[ $- != *i* ]] && return
Bash Completion
[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
FZF
source /usr/share/fzf/key-bindings.bash
Ignore case for auto-completion
bind "set completion-ignore-case on" bind "set show-all-if-ambiguous on"
Use Color
use_color=true
Some config
# Unset some variables unset use_color safe_term match_lhs sh # Allow local processes with root privileges to connect to the locally running X server xhost +local:root > /dev/null 2>&1 # Autocomplete sudo commands complete -cf sudo # Line wrap on window resize shopt -s checkwinsize # Enable history expansion with space # E.g. typing !!<space> will replace the !! with your last command bind Space:magic-space # Expand Aliases shopt -s expand_aliases # Auto "cd" when entering just a path shopt -s autocd # Enable history appending instead of overwriting shopt -s histappend # Save multi-line commands as one command shopt -s cmdhist
Prompt - PS1
export PS1="\[$(tput bold)\]\[$(tput setaf 1)\][\[$(tput setaf 3)\]\u\[$(tput setaf 2)\]@\[$(tput setaf 4)\]\h \[$(tput setaf 5)\]\W\[$(tput setaf 1)\]]\[$(tput setaf 7)\]\\$ \[$(tput sgr0)\]"
Rebind up and down arrow keys to search through bash history
bind '"\e[A": history-search-backward' bind '"\e[B": history-search-forward'
Aliases
Better defaults for some commands
alias ls='ls -hN --color=auto --group-directories-first' alias grep='grep --colour=auto' alias cp="cp -i" # confirm before overwriting something alias df='df -h' # human-readable sizes alias free='free -m' # show sizes in MB alias mutt="neomutt" alias tmux='tmux -f $XDG_CONFIG_HOME/tmux/tmux.conf'
One letter aliases
alias r="ranger" alias t="tmux" alias v="nvim" alias sv='sudo -E nvim' alias g="git" alias m="neomutt" alias o="xdg-open"
Neovim
command -v nvim >/dev/null && alias vim="nvim" vimdiff="nvim -d" # Use neovim for vim if present.
Vim-like
alias :q=exit alias :e=nvim
Print each PATH entry on a separate line
alias path='echo -e ${PATH//:/\\n}'
Functions
colors
- Display colors
colors() { local fgc bgc vals seq0 printf "Color escapes are %s\n" '\e[${value};...;${value}m' printf "Values 30..37 are \e[33mforeground colors\e[m\n" printf "Values 40..47 are \e[43mbackground colors\e[m\n" printf "Value 1 gives a \e[1mbold-faced look\e[m\n\n" # foreground colors for fgc in {30..37}; do # background colors for bgc in {40..47}; do fgc=${fgc#37} # white bgc=${bgc#40} # black vals="${fgc:+$fgc;}${bgc}" vals=${vals%%;} seq0="${vals:+\e[${vals}m}" printf " %-9s" "${seq0:-(default)}" printf " ${seq0}TEXT\e[m" printf " \e[${vals:+${vals+$vals;}}1mBOLD\e[m" done echo; echo done }
tre
- Tree display
tre
is a shorthand for tree
with hidden files and color enabled, ignoring
the .git
directory, listing directories first. The output gets piped into
less
with options to preserve color and line numbers, unless the output is
small enough for one screen.
function tre() { tree -aC -I '.git|node_modules|bower_components' --dirsfirst "$@" | less -FRNX; }
mkd
- Create a new directory and enter it
function mkd() { mkdir -p "$@" && cd "$_"; }
fs
- Filesize of directory
function fs() { if du -b /dev/null > /dev/null 2>&1; then local arg=-sbh; else local arg=-sh; fi if [[ -n "$@" ]]; then du $arg -- "$@"; else du $arg .[^.]* ./*; fi; }
nullify
- Redirect both standard output and standard error, as well as sending to background
function nullify() { "$@" >/dev/null 2>&1 }
sms
- Send SMS
sms(){ local args="$@" # local phone_number name phone_type # khard phone --parsable | sort -u | fzf | IFS=$'\t' read -r phone_number name phone_type local phone_number=$(khard phone --parsable | sort -u | fzf | cut -f1 -d$'\t') if [[ -z "${phone_number}" ]]; then echo No recipient was chosen >&2 return else kdeconnect-cli --send-sms "${args}" --destination "${phone_number}" --device 4de3b5de2264a17c fi }
Bash History
Undocumented feature which sets the size to “unlimited”. http://stackoverflow.com/questions/9457233/unlimited-bash-history
# 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 '
Change the file location because certain bash sessions truncate .bash_history
file upon close. http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
Force prompt to write history after every command. http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
~/.bash_profile
[[ -f ~/.profile ]] && . ~/.profile [[ -f ~/.bashrc ]] && . ~/.bashrc
~/.profile
QT And GTK Themes
export QT_QPA_PLATFORMTHEME="qt5ct" export GTK2_RC_FILES="$HOME/.gtkrc-2.0"
Gui program to ask for sudo password
export SUDO_ASKPASS=~/.local/bin/askpass-rofi
Gnome Keyring Daemon
Enable the keyring for applications run through the terminal
if [ -n "$DESKTOP_SESSION" ];then eval $(gnome-keyring-daemon --start) export SSH_AUTH_SOCK fi
Export some default applications
export EDITOR="nvim" export TERMINAL="alacritty" export BROWSER="qutebrowser" export READER="zathura" export FILE="ranger"
Exports
XDG Default
export XDG_CONFIG_HOME="$HOME/.config"
Use Ripgrep for FZF
export FZF_DEFAULT_COMMAND='rg --files --no-ignore --hidden --follow --glob "!.git/*"' export FZF_DEFAULT_OPTS='--layout=reverse --height=20'
Goland
export GOPATH=$HOME/go
Latex Path
export TEXMFHOME=$HOME/.local/share/texmf
Python Path
export PYTHONPATH="${PYTHONPATH}:/usr/lib/python3.9/site-packages/configobj"
Linkding
export LINKDING_URL=`pass nas/linkding_url` export LINKDING_TOKEN=`pass nas/linkding_token`
Path
PATH=$HOME/appimages:$PATH PATH=$HOME/.gem/ruby/2.5.0/bin:$PATH PATH=$GOPATH:$GOPATH/bin:$PATH PATH=~/.config/emacs/bin:$PATH export PATH
Automatically run startx
if [ -z "${DISPLAY}" ] && [ "${XDG_VTNR}" -eq 1 ]; then exec startx fi
~/.inputrc
Completion:
# Single tab for autocompletion set show-all-if-ambiguous on # Ignore case for completion set completion-ignore-case on
vi mode:
# VI mode (works in bash and zsh) set editing-mode vi # Show which mode (normal or insert) set show-mode-in-prompt on # Show the mode by changing the cursor set vi-ins-mode-string \1\e[6 q\2 set vi-cmd-mode-string \1\e[2 q\2
Key-bindings for vi-mode:
set keymap vi-command # these are for vi-command mode Control-l: clear-screen Control-a: beginning-of-line Control-e: end-of-line Control-w: "\C-aisudo \C-e" set keymap vi-insert # these are for vi-insert mode Control-l: clear-screen Control-a: beginning-of-line Control-e: end-of-line Control-w: "\C-asudo \C-e"
Colorized completion
# Color files by types set colored-stats On # Append char to indicate type set visible-stats On # Mark symlinked directories set mark-symlinked-directories On # Color the common prefix set colored-completion-prefix On # Color the common prefix in menu-complete set menu-complete-display-prefix On
Don’t echo ^C
after Ctrl+C
is pressed.
set echo-control-characters off