UP | HOME

Bash Configuration

Table of Contents

Bashrc

What does that do?

[[ $- != *i* ]] && return

Bash Completion

[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion

Ignore case for autocompletion

bind "set completion-ignore-case on"
bind "set show-all-if-ambiguous on"

Use Color

use_color=true
alias ls='ls -hN --color=auto --group-directories-first'
alias grep='grep --colour=auto'

Set colorful PS1 only on colorful terminals.

dircolors –print-database uses its own built-in database instead of using /etc/DIR_COLORS. Try to use the external file first to take advantage of user additions. Use internal bash globbing instead of external grep binary.

safe_term=${TERM//[^[:alnum:]]/?}   # sanitize TERM
match_lhs=""
[[ -f ~/.dir_colors   ]] && match_lhs="${match_lhs}$(<~/.dir_colors)"
[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)"
[[ -z ${match_lhs}    ]] \
  && type -P dircolors >/dev/null \
  && match_lhs=$(dircolors --print-database)
[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true

if ${use_color} ; then
  # Enable colors for ls, etc.  Prefer ~/.dir_colors #64489
  if type -P dircolors >/dev/null ; then
    if [[ -f ~/.dir_colors ]] ; then
      eval $(dircolors -b ~/.dir_colors)
    elif [[ -f /etc/DIR_COLORS ]] ; then
      eval $(dircolors -b /etc/DIR_COLORS)
    fi
  fi

  if [[ ${EUID} == 0 ]] ; then
    PS1='\[\033[01;31m\][\h\[\033[01;36m\] \W\[\033[01;31m\]]\$\[\033[00m\] '
  else
    PS1='\[\033[01;32m\][\u@\h\[\033[01;37m\] \W\[\033[01;32m\]]\$\[\033[00m\] '
  fi
else
  if [[ ${EUID} == 0 ]] ; then
    # show root@ when we don't have colors
    PS1='\u@\h \W \$ '
  else
    PS1='\u@\h \w \$ '
  fi
fi

Some config

unset use_color safe_term match_lhs sh

xhost +local:root > /dev/null 2>&1

complete -cf sudo

# Line wrap on window resize
shopt -s checkwinsize

shopt -s expand_aliases

# Auto "cd" when entering just a path
shopt -s autocd

# Enable history appending instead of overwriting
shopt -s histappend

Prompt

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)\]"

SSH Agent

# if ! pgrep -u "$USER" ssh-agent > /dev/null; then
#     ssh-agent > "$XDG_RUNTIME_DIR/ssh-agent.env"
# fi
# if [[ ! "$SSH_AUTH_SOCK" ]]; then
#     eval "$(<"$XDG_RUNTIME_DIR/ssh-agent.env")"
# fi

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 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 y="yadm"
alias o="xdg-open"
alias x="sxiv -ft *"

Neovim

command -v nvim >/dev/null && alias vim="nvim" vimdiff="nvim -d" # Use neovim for vim if present.

Magit

# alias magit="emacsclient -create-frame --alternate-editor=\"\" --eval '(magit-status)'"
alias magit="nvim -c MagitOnly"

Homelab Relative

alias dlab="aria2p --port 6800 --host http://dl.tdehaeze.xyz --secret $(pass dl.tdehaeze.xyz/tdehaeze | sed -n 1p)"

Vim-like

alias :q=exit
alias :e=nvim

Print each PATH entry on a separate line

alias path='echo -e ${PATH//:/\\n}'

Functions

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
}

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;
}

Create a new directory and enter it

function mkd() {
    mkdir -p "$@" && cd "$_";
}

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;
}

Redirect both standard output and standard error, as well as sending to background

function nullify() {
    "$@" >/dev/null 2>&1
}

Send SMS

https://doronbehar.com/articles/using-kdeconnect-to-comfortably-send-sms-messages-from-the-shell/#kdeconnects-builtin-sms-interface

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
        # echo "${name}"$'\t'"${phone_number}"$'\t'"${phone_type}" > ${_KDECONNECT_SMS_LAST_RECIPIENT}
        kdeconnect-cli --send-sms "${args}" --destination "${phone_number}" --device 4de3b5de2264a17c
        # kdeconnect-cli --device ${_KDECONNECT_DEFAULT_DEVICE} --send-sms "${args}" --destination "${phone_number}" && \
            # echo sent sms message to ${name} | fribidi
    fi
}

Bash History

Undocumented feature which sets the size to “unlimited”. http://stackoverflow.com/questions/9457233/unlimited-bash-history

export HISTFILESIZE=
export HISTSIZE=
export 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

if [ -n "$DESKTOP_SESSION" ];then
    eval $(gnome-keyring-daemon --start)
    export SSH_AUTH_SOCK
fi

Default

export EDITOR="nvim"
export TERMINAL="termite"
export BROWSER="qutebrowser"
export READER="zathura"
export FILE="ranger"

Exports

Term

This is important for termite to work when sshing in remote machines.

export TERM=xterm-color

XDG Default

export XDG_CONFIG_HOME="$HOME/.config"

Better yaourt colors

export YAOURT_COLORS="nb=1:pkg=1:ver=1;32:lver=1;45:installed=1;42:grp=1;34:od=1;41;5:votes=1;44:dsc=0:other=1;35"

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

Bitwarden Session

export BW_SESSION="HH0yycfocRSuGtq/iW1e6v13PQ1sShMXbMhdb/En94S6OcIXFnJlLEyU+dySsmf2YShY4CImoB5FrxgdPsY9Qw=="

Path

PATH=$HOME/appimages:$PATH
PATH=$HOME/.gem/ruby/2.5.0/bin:$PATH
PATH=$GOPATH:$GOPATH/bin:$PATH
PATH=~/.local/bin:$PATH
PATH=~/.emacs.d/bin:$PATH
export PATH

Input

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

Author: Dehaeze Thomas

Created: 2020-11-03 mar. 16:26