2019-01-31 09:41:03 +01:00
#+TITLE : Bash Configuration
2021-01-01 20:12:34 +01:00
#+SETUPFILE : ./setup/org-setup-file.org
2019-01-31 09:41:03 +01:00
2021-01-01 20:12:34 +01:00
* =~/.bashrc=
2019-12-16 08:53:36 +01:00
:PROPERTIES:
:header-args:bash: :tangle ~/.bashrc
:header-args:bash+: :comments both :mkdirp yes
2021-01-01 20:12:34 +01:00
:CUSTOM_ID: bashrc
2019-12-16 08:53:36 +01:00
:END:
2019-01-31 09:41:03 +01:00
2021-01-01 20:12:34 +01:00
** If not running interactively, don't do anything
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2021-01-01 20:12:34 +01:00
[[ $- != *i* ]] && return
2019-01-31 09:41:03 +01:00
#+END_SRC
** Bash Completion
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2021-01-01 20:12:34 +01:00
[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
2019-01-31 09:41:03 +01:00
#+END_SRC
2020-11-16 13:49:12 +01:00
** FZF
#+begin_src bash
source /usr/share/fzf/key-bindings.bash
#+end_src
2021-01-01 20:12:34 +01:00
** Ignore case for auto-completion
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2021-01-01 20:12:34 +01:00
bind "set completion-ignore-case on"
bind "set show-all-if-ambiguous on"
2019-05-30 16:48:02 +02:00
#+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
2019-01-31 09:41:03 +01:00
#+END_SRC
2020-03-01 21:38:57 +01:00
** Some config
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2021-01-01 20:12:34 +01:00
# Unset some variables
2020-03-01 21:38:57 +01:00
unset use_color safe_term match_lhs sh
2019-01-31 09:41:03 +01:00
2021-01-01 20:12:34 +01:00
# Allow local processes with root privileges to connect to the locally running X server
2020-03-01 21:38:57 +01:00
xhost +local:root > /dev/null 2>&1
2019-01-31 09:41:03 +01:00
2021-01-01 20:12:34 +01:00
# Autocomplete sudo commands
2020-03-01 21:38:57 +01:00
complete -cf sudo
2019-01-31 09:41:03 +01:00
2020-03-01 21:38:57 +01:00
# Line wrap on window resize
shopt -s checkwinsize
2019-01-31 09:41:03 +01:00
2021-01-03 22:52:53 +01:00
# Enable history expansion with space
# E.g. typing !!<space > will replace the !! with your last command
bind Space:magic-space
2021-01-01 20:12:34 +01:00
# Expand Aliases
2020-03-01 21:38:57 +01:00
shopt -s expand_aliases
2019-01-31 09:41:03 +01:00
2020-03-01 21:38:57 +01:00
# Auto "cd" when entering just a path
shopt -s autocd
2019-01-31 09:41:03 +01:00
2020-03-01 21:38:57 +01:00
# Enable history appending instead of overwriting
shopt -s histappend
2021-01-03 22:52:53 +01:00
# Save multi-line commands as one command
shopt -s cmdhist
2019-01-31 09:41:03 +01:00
#+END_SRC
2021-01-01 20:12:34 +01:00
** Prompt - =PS1=
2019-05-30 16:48:02 +02:00
#+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-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
2020-12-09 22:14:58 +01:00
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
2019-01-31 09:41:03 +01:00
#+END_SRC
2020-03-01 21:38:57 +01:00
** 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
2021-01-01 20:12:34 +01:00
alias ls='ls -hN --color=auto --group-directories-first'
alias grep='grep --colour=auto'
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 o="xdg-open"
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
*** 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
*** 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
2020-03-01 21:38:57 +01:00
** Functions
2021-01-01 20:12:34 +01:00
*** =colors= - Display colors
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2020-05-26 08:33:44 +02: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
2019-05-30 16:48:02 +02:00
}
2019-01-31 09:41:03 +01:00
#+END_SRC
2021-01-01 20:12:34 +01:00
*** =tre= - Tree display
2019-01-31 09:41:03 +01:00
=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
2020-05-26 08:33:44 +02:00
function tre() {
tree -aC -I '.git|node_modules|bower_components' --dirsfirst "$@" | less -FRNX;
}
2019-01-31 09:41:03 +01:00
#+END_SRC
2021-01-01 20:12:34 +01:00
*** =mkd= - Create a new directory and enter it
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
2020-05-26 08:33:44 +02:00
function mkd() {
mkdir -p "$@" && cd "$_";
}
2019-01-31 09:41:03 +01:00
#+END_SRC
2021-01-01 20:12:34 +01:00
*** =fs= - Filesize of directory
2019-05-30 16:48:02 +02:00
#+BEGIN_SRC bash
function fs() {
2020-05-26 08:33:44 +02:00
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-05-30 16:48:02 +02:00
}
2019-01-31 09:41:03 +01:00
#+END_SRC
2021-01-01 20:12:34 +01:00
*** =nullify= - 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() {
2020-05-26 08:33:44 +02:00
"$@" >/dev/null 2>&1
2019-05-30 16:48:02 +02:00
}
2019-01-31 09:41:03 +01:00
#+END_SRC
2021-01-01 20:12:34 +01:00
*** =sms= - Send SMS
2019-12-15 10:52:36 +01:00
https://doronbehar.com/articles/using-kdeconnect-to-comfortably-send-sms-messages-from-the-shell/ #kdeconnects-builtin-sms-interface
2021-01-01 20:12:34 +01:00
#+begin_src bash :tangle no
2019-12-15 10:52:36 +01:00
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
2021-01-01 20:12:34 +01:00
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
2021-01-03 22:52:53 +01:00
# 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 '
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
2021-01-01 20:12:34 +01:00
* =~/.bash_profile=
2019-12-16 08:53:36 +01:00
:PROPERTIES:
:header-args:bash: :tangle ~/.bash_profile
:header-args:bash+: :comments both :mkdirp yes
2021-01-01 20:12:34 +01:00
:CUSTOM_ID: bash_profile
2019-12-16 08:53:36 +01:00
: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
2021-01-01 20:12:34 +01:00
* =~/.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
2021-01-01 20:12:34 +01:00
:CUSTOM_ID: profile
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
2020-04-06 23:56:37 +02:00
export SUDO_ASKPASS=~/.local/bin/askpass-rofi
2019-01-31 09:41:03 +01:00
#+END_SRC
2020-03-01 21:38:57 +01:00
** Gnome Keyring Daemon
2021-01-01 20:12:34 +01:00
Enable the keyring for applications run through the terminal
2020-03-01 21:38:57 +01:00
#+begin_src bash
if [ -n "$DESKTOP_SESSION" ];then
eval $(gnome-keyring-daemon --start)
export SSH_AUTH_SOCK
fi
#+end_src
2021-01-01 20:12:34 +01:00
** Export some default applications
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
2020-04-16 12:05:32 +02:00
*** Term
This is important for termite to work when sshing in remote machines.
2019-12-16 21:37:12 +01:00
#+begin_src bash
2020-04-16 12:05:32 +02:00
export TERM=xterm-color
2020-04-08 14:38:07 +02:00
#+end_src
2019-05-30 16:48:02 +02:00
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
*** 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'
2020-04-08 14:38:07 +02:00
#+end_src
2019-05-30 16:48:02 +02:00
*** Goland
2019-12-16 21:37:12 +01:00
#+begin_src bash
2019-05-30 16:48:02 +02:00
export GOPATH=$HOME/go
2020-04-08 14:38:07 +02:00
#+end_src
*** Latex Path
#+begin_src bash
export TEXMFHOME=$HOME/.local/share/texmf
#+end_src
2019-05-30 16:48:02 +02:00
2020-11-03 11:37:10 +01:00
*** Bitwarden Session
#+begin_src bash
export BW_SESSION="HH0yycfocRSuGtq/iW1e6v13PQ1sShMXbMhdb/En94S6OcIXFnJlLEyU+dySsmf2YShY4CImoB5FrxgdPsY9Qw= ="
#+end_src
2021-01-01 20:12:34 +01:00
*** Python Path
#+begin_src bash
export PYTHONPATH="${PYTHONPATH}:/usr/lib/python3.9/site-packages/configobj"
#+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
2021-01-03 22:52:53 +01:00
PATH=~/.config/emacs/bin:$PATH
2019-03-05 22:04:20 +01:00
export PATH
#+END_SRC
2020-05-26 08:33:44 +02:00
2020-12-09 22:14:58 +01:00
** Automatically run =startx=
#+begin_src bash
if [ -z "${DISPLAY}" ] && [ "${XDG_VTNR}" -eq 1 ]; then
exec startx
fi
#+end_src
2021-01-01 20:12:34 +01:00
* =~/.inputrc=
2020-05-26 08:33:44 +02:00
:PROPERTIES:
:header-args: :tangle ~/.inputrc
:header-args+: :comments both :mkdirp y es
2021-01-01 20:12:34 +01:00
:CUSTOM_ID: inputrc
2020-05-26 08:33:44 +02:00
: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