literate-dotfiles/dotfiles/bash.org
Thomas Dehaeze 378a67efb3 Remove scripts and bin folders.
Instead, everything is in the =~/.local/bin/= folder
Thus, the home folder is more clean
2020-04-06 23:56:37 +02:00

11 KiB
Raw Blame History

Bash Configuration

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"

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
}

Meteo

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

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 | xsel -ib;
    echo "Copied:" $(cat $tmpfile);
    rm -f $tmpfile;
  }
  alias upload=upload

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
  }

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"

Starship Prompt

  eval "$(starship init bash)"

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

  export TERM=xterm-256color

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

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