2019-01-31 09:41:03 +01:00
#+TITLE : Bash Configuration
* Bashrc
2019-12-16 08:53:36 +01:00
:PROPERTIES:
:header-args:bash: :tangle ~/.bashrc
:header-args:bash+: :comments both :mkdirp yes
:END:
2019-01-31 09:41:03 +01:00
** TODO What does that do?
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-01-31 09:41:03 +01:00
[[ $- != *i* ]] && return
#+END_SRC
** Bash Completion
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-01-31 09:41:03 +01:00
[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
#+END_SRC
2019-05-30 16:48:02 +02:00
** Ignore case for autocompletion
#+BEGIN_SRC bash
bind "set completion-ignore-case on"
bind "set show-all-if-ambiguous on"
#+END_SRC
2019-01-31 09:41:03 +01:00
** Use Color
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-05-16 21:13:08 +02:00
use_color=true
alias ls='ls -hN --color=auto --group-directories-first'
alias grep='grep --colour=auto'
2019-01-31 09:41:03 +01:00
#+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.
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-05-16 21:13:08 +02:00
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
2019-01-31 09:41:03 +01:00
fi
2019-05-16 21:13:08 +02:00
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
2019-01-31 09:41:03 +01:00
else
2019-05-16 21:13:08 +02:00
if [[ ${EUID} == 0 ]] ; then
# show root@ when we don't have colors
PS1='\u@\h \W \$ '
else
PS1='\u@\h \w \$ '
fi
2019-01-31 09:41:03 +01:00
fi
#+END_SRC
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-01-31 09:41:03 +01:00
unset use_color safe_term match_lhs sh
#+END_SRC
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-01-31 09:41:03 +01:00
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
2019-05-30 16:48:02 +02:00
** 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
2019-12-30 17:21:38 +01:00
** 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
2019-01-31 09:41:03 +01:00
** Rebind up and down arrow keys to search through bash history
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-01-31 09:41:03 +01:00
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
#+END_SRC
2019-05-30 16:48:02 +02:00
** TODO Aliases
2019-01-31 09:41:03 +01:00
*** Better defaults for some commands
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-02-03 17:45:02 +01:00
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"
2019-12-16 21:37:12 +01:00
alias tmux='tmux -f $XDG_CONFIG_HOME/tmux/tmux.conf'
2019-01-31 09:41:03 +01:00
#+END_SRC
*** One letter aliases
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-02-03 17:45:02 +01:00
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"
2019-05-16 21:13:08 +02:00
alias x="sxiv -ft *"
2019-01-31 09:41:03 +01:00
#+END_SRC
2019-05-16 21:13:08 +02:00
*** Neovim
2019-05-30 16:48:02 +02:00
#+begin_src bash
2019-05-16 21:13:08 +02:00
command -v nvim >/dev/null && alias vim="nvim" vimdiff= "nvim -d" # Use neovim for vim if present.
#+end_src
2019-01-31 09:41:03 +01:00
*** Magit
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-05-16 21:13:08 +02:00
# alias magit="emacsclient -create-frame --alternate-editor= \"\" --eval '(magit-status)'"
alias magit="nvim -c MagitOnly"
2019-01-31 09:41:03 +01:00
#+END_SRC
*** Vim-like
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-02-03 17:45:02 +01:00
alias :q=exit
alias :e=nvim
2019-01-31 09:41:03 +01:00
#+END_SRC
*** Youtube
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-02-03 17:45:02 +01:00
alias yt="youtube-dl --add-metadata -ic" # Download video link
alias yta="yt -x -f bestaudio/best" # Download only audio
2019-01-31 09:41:03 +01:00
#+END_SRC
*** Print each PATH entry on a separate line
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-02-03 17:45:02 +01:00
alias path='echo -e ${PATH//:/ \\n}'
2019-01-31 09:41:03 +01:00
#+END_SRC
2019-05-30 16:48:02 +02:00
*** TODO [#B] IP addresses - Remove the use of =dig= and =ifbashig=
2019-02-03 17:45:02 +01:00
Use =addr= instead
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-01-31 09:41:03 +01:00
# 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
2019-05-30 16:48:02 +02:00
** TODO Functions
2019-01-31 09:41:03 +01:00
*** Display colors
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-01-31 09:41:03 +01:00
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=
2019-05-30 16:48:02 +02:00
#+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
2019-01-31 09:41:03 +01:00
#+END_SRC
*** TODO Upload using transfer.sh
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-03-26 12:10:43 +01:00
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
2019-01-31 09:41:03 +01:00
#+END_SRC
*** TODO Upload alternative
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-03-26 12:10:43 +01:00
transfer() {
2019-01-31 09:41:03 +01:00
curl --progress-bar --upload-file "$1" https://transfer.sh/ $(basename $1) | xclip -in -selection clipboard;
2019-03-26 12:10:43 +01:00
}
alias transfer=transfer
2019-01-31 09:41:03 +01:00
#+END_SRC
*** Extract archive
usage: ex <file >
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-01-31 09:41:03 +01:00
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.
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-01-31 09:41:03 +01:00
function tre() {
tree -aC -I '.git|node_modules|bower_components' --dirsfirst "$@" | less -FRNX;
}
#+END_SRC
*** Create a new directory and enter it
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-01-31 09:41:03 +01:00
function mkd() {
mkdir -p "$@" && cd "$_";
}
#+END_SRC
*** Filesize of directory
2019-05-30 16:48:02 +02:00
#+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;
}
2019-01-31 09:41:03 +01:00
#+END_SRC
*** Redirect both standard output and standard error, as well as sending to background
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
function nullify() {
"$@" >/dev/null 2>&1
}
2019-01-31 09:41:03 +01:00
#+END_SRC
2019-12-15 10:52:36 +01:00
*** 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
2019-01-31 09:41:03 +01:00
** Bash History
Undocumented feature which sets the size to "unlimited". http://stackoverflow.com/questions/9457233/unlimited-bash-history
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-03-26 12:10:43 +01:00
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
2019-01-31 09:41:03 +01:00
#+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
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-03-26 12:10:43 +01:00
export HISTFILE=~/.bash_eternal_history
2019-01-31 09:41:03 +01:00
#+END_SRC
Force prompt to write history after every command. http://superuser.com/questions/20900/bash-history-loss
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2019-03-26 12:10:43 +01:00
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
2019-01-31 09:41:03 +01:00
#+END_SRC
* Bash Profile
2019-12-16 08:53:36 +01:00
:PROPERTIES:
:header-args:bash: :tangle ~/.bash_profile
:header-args:bash+: :comments both :mkdirp yes
:END:
2019-01-31 09:41:03 +01:00
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
[[ -f ~/.profile ]] && . ~/.profile
[[ -f ~/.bashrc ]] && . ~/.bashrc
2019-01-31 09:41:03 +01:00
#+END_SRC
* Profile
2019-12-16 08:53:36 +01:00
:PROPERTIES:
2019-12-30 17:21:38 +01:00
:header-args:bash: :tangle ~/.profile
:header-args:bash+: :comments both :mkdirp yes
2019-12-16 08:53:36 +01:00
:END:
2019-01-31 09:41:03 +01:00
** QT And GTK Themes
2019-12-16 21:37:12 +01:00
#+begin_src bash
2019-05-30 16:48:02 +02:00
export QT_QPA_PLATFORMTHEME="qt5ct"
export GTK2_RC_FILES="$HOME/.gtkrc-2.0"
2019-01-31 09:41:03 +01:00
#+END_SRC
** Gui program to ask for sudo password
2019-12-16 21:37:12 +01:00
#+begin_src bash
2019-05-30 16:48:02 +02:00
export SUDO_ASKPASS=~/bin/askpass-rofi
2019-01-31 09:41:03 +01:00
#+END_SRC
** Default
2019-12-16 21:37:12 +01:00
#+begin_src bash
2019-05-16 21:13:08 +02:00
export EDITOR="nvim"
2019-12-15 10:52:36 +01:00
export TERMINAL="termite"
2019-05-16 21:13:08 +02:00
export BROWSER="qutebrowser"
export READER="zathura"
2019-12-15 10:52:36 +01:00
export FILE="ranger"
2019-01-31 09:41:03 +01:00
#+END_SRC
2019-03-05 22:04:20 +01:00
2019-05-30 16:48:02 +02:00
** Exports
2019-12-16 21:37:12 +01:00
#+begin_src bash
2019-05-30 16:48:02 +02:00
export TERM=xterm-256color
#+END_SRC
2019-12-16 21:37:12 +01:00
*** XDG Default
#+begin_src bash
export XDG_CONFIG_HOME="$HOME/.config"
#+end_src
2019-05-30 16:48:02 +02:00
*** Better yaourt colors
2019-12-16 21:37:12 +01:00
#+begin_src bash
2019-05-30 16:48:02 +02:00
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
2019-12-16 21:37:12 +01:00
#+begin_src bash
2019-05-30 16:48:02 +02:00
export FZF_DEFAULT_COMMAND='rg --files --no-ignore --hidden --follow --glob "!.git/*"'
export FZF_DEFAULT_OPTS='--layout=reverse --height=20'
#+END_SRC
*** Goland
2019-12-16 21:37:12 +01:00
#+begin_src bash
2019-05-30 16:48:02 +02:00
export GOPATH=$HOME/go
#+END_SRC
2019-12-30 17:21:38 +01:00
*** SSH Agent
#+begin_src bash
export SSH_AUTH_SOCK="${XDG_RUNTIME_DIR}/ssh-agent.socket"
#+end_src
2019-03-05 22:04:20 +01:00
** Path
2019-12-16 21:37:12 +01:00
#+begin_src bash
2019-03-05 22:04:20 +01:00
PATH=$HOME/appimages:$PATH
PATH=$HOME/.gem/ruby/2.5.0/bin:$PATH
2019-05-30 16:48:02 +02:00
PATH=$GOPATH:$GOPATH/bin:$PATH
2019-03-05 22:04:20 +01:00
PATH=~/bin:$PATH
2019-12-30 17:21:38 +01:00
PATH=~/.emacs.d/bin:$PATH
2019-03-05 22:04:20 +01:00
export PATH
#+END_SRC