literate-dotfiles/dotfiles/bash.org
2019-03-26 12:10:43 +01:00

9.9 KiB
Raw Blame History

Bash Configuration

Bashrc

TODO What does that do?

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

Bash Completion

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

Change the window title of X terminals

case ${TERM} in
  xterm*|rxvt*|Eterm*|aterm|kterm|gnome*|interix|konsole*)
    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/\~}\007"'
    ;;
  screen*)
    PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/\~}\033\\"'
    ;;
esac

Use Color

use_color=true

TODO 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

  alias ls='ls --color=auto'
  alias grep='grep --colour=auto'
  alias egrep='egrep --colour=auto'
  alias fgrep='fgrep --colour=auto'
else
  if [[ ${EUID} == 0 ]] ; then
    # show root@ when we don't have colors
    PS1='\u@\h \W \$ '
  else
    PS1='\u@\h \w \$ '
  fi
fi
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

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"

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"

Magit

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

Vim-like

  alias :q=exit
  alias :e=nvim

Youtube

  alias yt="youtube-dl --add-metadata -ic" # Download video link
  alias yta="yt -x -f bestaudio/best" # Download only audio

Print each PATH entry on a separate line

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

TODO [B] IP addresses - Remove the use of dig and ifconfig

Use addr instead

  # alias ip="dig +short myip.opendns.com @resolver1.opendns.com"
  # alias localip="ip route get 8.8.4.4 | head -1 | awk '{print $7}'"
  # alias ips="ifconfig -a | grep -o 'inet6\? \(addr:\)\?\s\?\(\(\([0-9]\+\.\)\{3\}[0-9]\+\)\|[a-fA-F0-9:]\+\)' | awk '{ sub(/inet6? (addr:)? ?/, \"\"); print }'"

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
}

TODO Meteo - Is Dig mandatory?

To install dig, use yay -S bind-tools

meteo() {
  if [ -n "$*" ]; then
    address="wttr.in/"
    address+=$*
    address+="?lang=fr"
    curl "$address"
  else
    address="wttr.in/"
    address+=$(ip)
    address+="?lang=fr"
    curl "$address"
  fi
}
alias meteo=meteo

TODO Upload using transfer.sh

  upload() {
    # write to output to tmpfile because of progress bar
    tmpfile=$(mktemp -t transferXXX)
    # basefile=$(basename "$1" | sed -e 's/[^a-zA-Z0-9]/-/g')
    curl --progress-bar --upload-file "$1" "https://transfer.sh/" >> $tmpfile;
    cat $tmpfile | xclip -selection clipboard;
    echo "Copied:" $(cat $tmpfile);
    rm -f $tmpfile;
  }
  alias upload=upload

TODO Upload alternative

  transfer() {
  curl --progress-bar --upload-file "$1" https://transfer.sh/$(basename $1) | xclip -in -selection clipboard;
  }
  alias transfer=transfer

Extract archive

usage: ex <file>

ex ()
{
  if [ -f $1 ] ; then
    case $1 in
      *.tar.bz2)   tar xjf $1   ;;
      *.tar.gz)    tar xzf $1   ;;
      *.bz2)       bunzip2 $1   ;;
      *.rar)       unrar x $1     ;;
      *.gz)        gunzip $1    ;;
      *.tar)       tar xf $1    ;;
      *.tbz2)      tar xjf $1   ;;
      *.tgz)       tar xzf $1   ;;
      *.zip)       unzip $1     ;;
      *.Z)         uncompress $1;;
      *.7z)        7z x $1      ;;
      *)           echo "'$1' cannot be extracted via ex()" ;;
    esac
  else
    echo "'$1' is not a valid file"
  fi
}

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
}

Prompt

if [ "`id -u`" -eq 0 ]; then
    PS1="\[\033[m\]|\[\033[1;35m\]\t\[\033[m\]|\[\e[1;31m\]\u\[\e[1;36m\]\[\033[m\]@\[\e[1;36m\]\h\[\033[m\]:\[\e[0m\]\[\e[1;32m\][\W]> \[\e[0m\]"
else
    PS1="\[\033[m\]|\[\033[1;35m\]\t\[\033[m\]|\[\e[1m\]\u\[\e[1;36m\]\[\033[m\]@\[\e[1;36m\]\h\[\033[m\]:\[\e[0m\]\[\e[1;32m\][\W]> \[\e[0m\]"
fi

Exports

  export TERM=xterm-256color

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/*"'

Goland

  export GOPATH=$HOME/go
  PATH=$GOPATH:$GOPATH/bin:$PATH
  export PATH

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"

Base16 Shell

BASE16_SHELL="$HOME/.base16-manager/chriskempson/base16-shell/"
[ -n "$PS1" ] && \
[ -s "$BASE16_SHELL/profile_helper.sh" ] && \
eval "$("$BASE16_SHELL/profile_helper.sh")"

Bash Profile

Ignore case for autocompletion

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

Source bashrc

[[ -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=~/bin/askpass-rofi

Default

export EDITOR=/usr/bin/nvim
export BROWSER=/usr/bin/qutebrowser

Path

  PATH=$HOME/appimages:$PATH
  PATH=$HOME/.gem/ruby/2.5.0/bin:$PATH
  PATH=~/bin:$PATH
  export PATH