#+TITLE: Bash Configuration #+SETUPFILE: ./setup/org-setup-file.org #+PROPERTY: header-args :tangle-mode (identity #o444) * =~/.bashrc= :PROPERTIES: :header-args:bash: :tangle ~/.bashrc :header-args:bash+: :comments both :mkdirp yes :CUSTOM_ID: bashrc :END: ** If not running interactively, don't do anything #+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 auto-completion #+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 #+END_SRC ** Some config #+BEGIN_SRC bash # Unset some variables unset use_color safe_term match_lhs sh # Allow local processes with root privileges to connect to the locally running X server xhost +local:root > /dev/null 2>&1 # Autocomplete sudo commands complete -cf sudo # Line wrap on window resize shopt -s checkwinsize # Enable history expansion with space # E.g. typing !! will replace the !! with your last command bind Space:magic-space # Expand Aliases shopt -s expand_aliases # Auto "cd" when entering just a path shopt -s autocd # Enable history appending instead of overwriting shopt -s histappend # Save multi-line commands as one command shopt -s cmdhist #+END_SRC ** Prompt - =PS1= #+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 ** 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 ls='ls -hN --color=auto --group-directories-first' alias grep='grep --colour=auto' 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 o="xdg-open" #+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 *** 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 *** =colors= - 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 *** =tre= - 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 *** =mkd= - Create a new directory and enter it #+BEGIN_SRC bash function mkd() { mkdir -p "$@" && cd "$_"; } #+END_SRC *** =fs= - 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 *** =nullify= - Redirect both standard output and standard error, as well as sending to background #+BEGIN_SRC bash function nullify() { "$@" >/dev/null 2>&1 } #+END_SRC *** =sms= - Send SMS https://doronbehar.com/articles/using-kdeconnect-to-comfortably-send-sms-messages-from-the-shell/#kdeconnects-builtin-sms-interface #+begin_src bash :tangle no 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 kdeconnect-cli --send-sms "${args}" --destination "${phone_number}" --device 4de3b5de2264a17c fi } #+end_src ** Bash History Undocumented feature which sets the size to "unlimited". http://stackoverflow.com/questions/9457233/unlimited-bash-history #+BEGIN_SRC bash # Huge history. Doesn't appear to slow things down, so why not? HISTSIZE=500000 HISTFILESIZE=100000 # Avoid duplicate entries HISTCONTROL="erasedups:ignoreboth" # Don't record some commands export HISTIGNORE="&:[ ]*:exit:ls:bg:fg:history:clear" # Use standard ISO 8601 timestamp # %F equivalent to %Y-%m-%d # %T equivalent to %H:%M:%S (24-hours format) 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 :CUSTOM_ID: bash_profile :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 :CUSTOM_ID: profile :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 Enable the keyring for applications run through the terminal #+begin_src bash if [ -n "$DESKTOP_SESSION" ];then eval $(gnome-keyring-daemon --start) export SSH_AUTH_SOCK fi #+end_src ** Export some default applications #+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 *** 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 *** Python Path #+begin_src bash export PYTHONPATH="${PYTHONPATH}:/usr/lib/python3.9/site-packages/configobj" #+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=~/.config/emacs/bin:$PATH export PATH #+END_SRC ** Automatically run =startx= #+begin_src bash if [ -z "${DISPLAY}" ] && [ "${XDG_VTNR}" -eq 1 ]; then exec startx fi #+end_src * =~/.inputrc= :PROPERTIES: :header-args: :tangle ~/.inputrc :header-args+: :comments both :mkdirp yes :CUSTOM_ID: inputrc :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