#+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 ** FZF #+begin_src bash source /usr/share/fzf/key-bindings.bash #+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 *** Homelab Relative #+begin_src bash alias dlab="aria2p --port 6800 --host http://dl.tdehaeze.xyz --secret $(pass dl.tdehaeze.xyz/tdehaeze | sed -n 1p)" #+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 *** 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 * 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 *** Term This is important for termite to work when sshing in remote machines. #+begin_src bash export TERM=xterm-color #+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 *** Latex Path #+begin_src bash export TEXMFHOME=$HOME/.local/share/texmf #+end_src *** Bitwarden Session #+begin_src bash export BW_SESSION="HH0yycfocRSuGtq/iW1e6v13PQ1sShMXbMhdb/En94S6OcIXFnJlLEyU+dySsmf2YShY4CImoB5FrxgdPsY9Qw==" #+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 * Input :PROPERTIES: :header-args: :tangle ~/.inputrc :header-args+: :comments both :mkdirp yes :END: Completion: #+BEGIN_SRC conf # Single tab for autocompletion set show-all-if-ambiguous on # Ignore case for completion set completion-ignore-case on #+END_SRC vi mode: #+BEGIN_SRC conf # 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 #+END_SRC Key-bindings for vi-mode: #+BEGIN_SRC conf 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" #+END_SRC Colorized completion #+begin_src conf # 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 #+end_src Don't echo =^C= after =Ctrl+C= is pressed. #+begin_src conf set echo-control-characters off #+end_src