#+TITLE: Bash Configuration * Bashrc :PROPERTIES: :header-args:bash: :tangle ~/.bashrc :header-args:bash+: :comments both :mkdirp yes :END: ** TODO 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 ** Change the window title of X terminals #+BEGIN_SRC bash 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 #+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 ** 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. #+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 #+BEGIN_SRC bash unset use_color safe_term match_lhs sh #+END_SRC #+BEGIN_SRC bash 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 ** 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 ** TODO 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" #+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 *** Youtube #+BEGIN_SRC bash alias yt="youtube-dl --add-metadata -ic" # Download video link alias yta="yt -x -f bestaudio/best" # Download only audio #+END_SRC *** Print each PATH entry on a separate line #+BEGIN_SRC bash alias path='echo -e ${PATH//:/\\n}' #+END_SRC *** TODO [#B] IP addresses - Remove the use of =dig= and =ifbashig= Use =addr= instead #+BEGIN_SRC bash # 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 }'" #+END_SRC ** TODO 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 *** TODO Meteo - Is Dig mandatory? To install =dig=, use =yay -S bind-tools= #+BEGIN_SRC bash 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 #+END_SRC *** TODO 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 | xclip -selection clipboard; echo "Copied:" $(cat $tmpfile); rm -f $tmpfile; } alias upload=upload #+END_SRC *** TODO Upload alternative #+BEGIN_SRC bash transfer() { curl --progress-bar --upload-file "$1" https://transfer.sh/$(basename $1) | xclip -in -selection clipboard; } alias transfer=transfer #+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 ** 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:conf: :tangle ~/.profile :header-args:conf+: :comments both :mkdirp yes :END: ** QT And GTK Themes #+BEGIN_SRC conf export QT_QPA_PLATFORMTHEME="qt5ct" export GTK2_RC_FILES="$HOME/.gtkrc-2.0" #+END_SRC ** Gui program to ask for sudo password #+BEGIN_SRC conf export SUDO_ASKPASS=~/bin/askpass-rofi #+END_SRC ** Default #+BEGIN_SRC conf export EDITOR="nvim" export TERMINAL="st" export BROWSER="qutebrowser" export READER="zathura" export FILE="vifm" #+END_SRC ** Exports #+BEGIN_SRC conf export TERM=xterm-256color #+END_SRC *** dpi config for Alacritty #+begin_src conf export WINIT_HIDPI_FACTOR=1. #+end_src *** Better yaourt colors #+BEGIN_SRC conf 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 conf 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 conf export GOPATH=$HOME/go #+END_SRC ** Path #+BEGIN_SRC conf PATH=$HOME/appimages:$PATH PATH=$HOME/.gem/ruby/2.5.0/bin:$PATH PATH=$GOPATH:$GOPATH/bin:$PATH PATH=~/bin:$PATH export PATH #+END_SRC