#+TITLE: Bash Configuration :DRAWER: #+STARTUP: overview #+LANGUAGE: en #+EMAIL: dehaeze.thomas@gmail.com #+AUTHOR: Dehaeze Thomas #+HTML_LINK_HOME: ./index.html #+HTML_LINK_UP: ./index.html #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: :END: * Bashrc :PROPERTIES: :header-args:bash: :tangle ~/.bashrc :header-args:bash+: :comments both :mkdirp yes :END: ** What does that do? #+BEGIN_SRC bash [[ $- != *i* ]] && return #+END_SRC ** Bash Completion #+BEGIN_SRC bash [ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion #+END_SRC ** Ignore case for autocompletion #+BEGIN_SRC bash bind "set completion-ignore-case on" bind "set show-all-if-ambiguous on" #+END_SRC ** Use Color #+BEGIN_SRC bash use_color=true alias ls='ls -hN --color=auto --group-directories-first' alias grep='grep --colour=auto' #+END_SRC ** 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. #+BEGIN_SRC bash 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}$(/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 #+END_SRC ** Some config #+BEGIN_SRC bash 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 #+END_SRC ** Prompt #+BEGIN_SRC bash 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)\]" #+END_SRC ** SSH Agent #+begin_src bash # 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 #+end_src ** Rebind up and down arrow keys to search through bash history #+BEGIN_SRC bash bind '"\e[A": history-search-backward' bind '"\e[B": history-search-forward' #+END_SRC ** Aliases *** Better defaults for some commands #+BEGIN_SRC bash 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' #+END_SRC *** One letter aliases #+BEGIN_SRC bash 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 *" #+END_SRC *** Neovim #+begin_src bash command -v nvim >/dev/null && alias vim="nvim" vimdiff="nvim -d" # Use neovim for vim if present. #+end_src *** Magit #+BEGIN_SRC bash # alias magit="emacsclient -create-frame --alternate-editor=\"\" --eval '(magit-status)'" alias magit="nvim -c MagitOnly" #+END_SRC *** Vim-like #+BEGIN_SRC bash alias :q=exit alias :e=nvim #+END_SRC *** Print each PATH entry on a separate line #+BEGIN_SRC bash alias path='echo -e ${PATH//:/\\n}' #+END_SRC ** Functions *** Display colors #+BEGIN_SRC bash 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 } #+END_SRC *** Meteo #+BEGIN_SRC bash 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 #+END_SRC *** Upload using transfer.sh #+BEGIN_SRC bash 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 #+END_SRC *** Extract archive usage: ex #+BEGIN_SRC bash 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 } #+END_SRC *** 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. #+BEGIN_SRC bash function tre() { tree -aC -I '.git|node_modules|bower_components' --dirsfirst "$@" | less -FRNX; } #+END_SRC *** Create a new directory and enter it #+BEGIN_SRC bash function mkd() { mkdir -p "$@" && cd "$_"; } #+END_SRC *** Filesize of directory #+BEGIN_SRC bash 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; } #+END_SRC *** Redirect both standard output and standard error, as well as sending to background #+BEGIN_SRC bash function nullify() { "$@" >/dev/null 2>&1 } #+END_SRC *** Send SMS https://doronbehar.com/articles/using-kdeconnect-to-comfortably-send-sms-messages-from-the-shell/#kdeconnects-builtin-sms-interface #+begin_src bash 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 } #+end_src ** Bash History Undocumented feature which sets the size to "unlimited". http://stackoverflow.com/questions/9457233/unlimited-bash-history #+BEGIN_SRC bash export HISTFILESIZE= export HISTSIZE= export HISTTIMEFORMAT="[%F %T] " #+END_SRC 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 #+BEGIN_SRC bash export HISTFILE=~/.bash_eternal_history #+END_SRC Force prompt to write history after every command. http://superuser.com/questions/20900/bash-history-loss #+BEGIN_SRC bash PROMPT_COMMAND="history -a; $PROMPT_COMMAND" #+END_SRC ** Starship Prompt #+begin_src bash eval "$(starship init bash)" #+end_src * Bash Profile :PROPERTIES: :header-args:bash: :tangle ~/.bash_profile :header-args:bash+: :comments both :mkdirp yes :END: #+BEGIN_SRC bash [[ -f ~/.profile ]] && . ~/.profile [[ -f ~/.bashrc ]] && . ~/.bashrc #+END_SRC * Profile :PROPERTIES: :header-args:bash: :tangle ~/.profile :header-args:bash+: :comments both :mkdirp yes :END: ** QT And GTK Themes #+begin_src bash export QT_QPA_PLATFORMTHEME="qt5ct" export GTK2_RC_FILES="$HOME/.gtkrc-2.0" #+END_SRC ** Gui program to ask for sudo password #+begin_src bash export SUDO_ASKPASS=~/.local/bin/askpass-rofi #+END_SRC ** Gnome Keyring Daemon #+begin_src bash if [ -n "$DESKTOP_SESSION" ];then eval $(gnome-keyring-daemon --start) export SSH_AUTH_SOCK fi #+end_src ** Default #+begin_src bash export EDITOR="nvim" export TERMINAL="termite" export BROWSER="qutebrowser" export READER="zathura" export FILE="ranger" #+END_SRC ** Exports #+begin_src bash export TERM=xterm-256color #+END_SRC *** XDG Default #+begin_src bash export XDG_CONFIG_HOME="$HOME/.config" #+end_src *** Better yaourt colors #+begin_src bash 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" #+END_SRC *** Use Ripgrep for FZF #+begin_src bash export FZF_DEFAULT_COMMAND='rg --files --no-ignore --hidden --follow --glob "!.git/*"' export FZF_DEFAULT_OPTS='--layout=reverse --height=20' #+END_SRC *** Goland #+begin_src bash export GOPATH=$HOME/go #+END_SRC ** Path #+begin_src bash 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 #+END_SRC