.bashrc
author Oleksandr Gavenko <gavenkoa@gmail.com>
Thu, 29 Nov 2018 00:00:11 +0200
changeset 909 a2940bea3a6d
parent 901 5e5c705d2831
child 915 691db6af02e4
permissions -rw-r--r--
Updated mygit-date to accept hour+minute, assume current day + random seconds.


# set -x
# set -u

# XXX
# [[ -f /etc/bashrc ]] && . /etc/bashrc

if [[ -f ~/.env ]]; then
  . ~/.env
fi

_my_ruler() {
  local ruler=''
  for (( i=${COLUMNS:-78}; i>0; i-=1 )) do
      ruler+='='
  done
  echo $ruler
}

PS1='\n$(_my_ruler)\r$?|\u@\h \w \nbash# '
PS2='> '

case "$TERM" in
  xterm*|eterm-color|screen|linux|cygwin)
    PS1=$'\n\e[34m\e[1m$(_my_ruler)\r$?|\e[31m\u\e[35m@\h\e[0m\e[36m \w \n\[\e[1m\e[31m\]bash#\[\e[0m\] '
    PS2=$'\[\e[32m\]> \[\e[0m\]'
  ;;
esac
# Set current directory in terminal emulator title.
case "$TERM" in
  xterm*|screen|linux|cygwin)
    PS1=$'\e]0;bash \u@\h \w\a'"$PS1"
  ;;
esac

if command -v dircolors >/dev/null 2>&1 && [[ -f ~/.dircolors ]]; then
  eval "`dircolors -b ~/.dircolors`"
fi

# Can be XXX /visible. I like bell.
# set bell-style visible

# Don't store duplicate adjacent items in the history.
#   ignorespace     do not save lines that start with space
#   erasedups       all previous lines matching the current line to be removed from
#                   the history list before that line is saved
HISTCONTROL=ignorespace:erasedups

# Don't store noisy/dumb items.
# TIP: MC command start with space.
HISTIGNORE=\
" cd *":\
"vlc *":ls:pwd

# To these options assigned default value, as they satisfy my needs I comment them.
# HISTFILE=~/.bash_history  # where is command history stored
# HISTFILESIZE=500          # how many lines been in $HISTFILE
# HISTSIZE=500              # how many lines been stored in bash process

HISTTIMEFORMAT="%F %T "

# Make Bash append rather than overwrite the history.
shopt -s histappend

shopt -s histreedit
shopt -s histverify

# Technique to share command history across Bash secctions.
# Just run:
#   history -n
# to reload history.
# This setting automatically update history file, but ignore HISTCONTROL=erasedups settings.
# PROMPT_COMMAND='history -a'

# Minor errors in the spelling of a directory component in a cd command will
# be corrected.
shopt -s cdspell

# Save all lines of a multiple-line command in the same history entry.
shopt -s cmdhist

# Allows files beginning with a dot ('.') to be returned in the results of path-name expansion.
shopt -s dotglob

# ksh-88 egrep-style extended pattern matching.
shopt -s extglob

# Enable '**' patttern matching. If the pattern is followed by a /, only dirs match.
shopt -s globstar

# Ignore case in glob.
shopt -s nocaseglob

# Show stopped jobs before exit. Next ^D force to leave bash...
shopt -s checkjobs

# Adjust settings according to current terminal window width
# which may have changed while the last command was running
# (which is a common occurance for vim/less/etc.)
# Note this is already set in /etc/bashrc on Fedora 8 at least.
shopt -s checkwinsize

# Let me have core dumps
ulimit -c unlimited

################################################################
# shortcut aliases

alias ..="cd .."        #go to parent dir
alias ...="cd ../.."    #go to grandparent dir
alias -- -="cd -"       # go to previous dir
alias l.='ls -d .*'     #list hidden files
alias ll='ls -lhrt'     #extra info compared to "l"
alias lld='ls -lUd */'  #list directories
# I prefer EN man pages.
alias man='LANG=C man'

alias j='jobs '

# make and change to a directory
md () { mkdir -p "$1" && cd "$1"; }

myfind() { find . -iname "$1"; }

# Usage example:
#  mypath EMACSLOADPATH '*.el' \;
#  mypath TEXINPUTS "*cyr*"
#  VAR=`cygpath -p '$INCLUDE'` mypath VAR "windows*"
mypath() {
  local var="$2"
  [[ -z $var ]] && var=PATH
  local delim="$3"
  [[ -z $delim ]] && delim=:
  local split
  IFS="$delim" command eval "read -ra split <<< \"\${$var}\""
  for dir in "${split[@]}"; do
    [[ -z "$dir" ]] && continue
    if [[ -f "$dir"/"$1" ]]; then
      echo "$dir"/"$1"
    else
      ls -d "$dir"/$1 2>/dev/null | cat
    fi
  done
}
_mypath() {
  if [[ $COMP_CWORD = 2 ]]; then
    COMPREPLY=( $(compgen -v -- "${COMP_WORDS[2]}") )
  fi
}
complete -F _mypath mypath

# LANG=C for speed.
alias grep='GREP_COLOR="31;47" LANG=C grep --color=auto'
case $OSTYPE in
  linux*|cygwin) alias ls='ls --color=auto' ;;
esac
alias minicom='minicom -c on'

# Weeks start on Monday.
alias ncal='ncal -M'

# alias diff='LC_ALL=C TZ=GMT0 diff -Naur' #normalise diffs for distribution
# alias sudo='sudo env PATH=$PATH' #work around sudo built --with-secure-path (ubuntu)
# alias vim='vim -X' #don't try to contact xserver (which can hang on network issues)
# alias gdb='gdb -tui' #enable the text window interface if possible

alias dquilt="quilt --quiltrc=${HOME}/.quiltrc-dpkg"

# what most people want from od (hexdump)
# alias hd='od -Ax -tx1z -v'

case $OSTYPE in
  # CYGWIN=noglob causes https://github.com/docker/machine/issues/4516
  cygwin) alias docker-machine='CYGWIN= docker-machine' ;;
esac

# --blank-lines-after-procedures --break-before-boolean-operator --braces-on-if-line --braces-on-struct-decl-line
# --comment-indentationn --space-after-cast --line-comments-indentationn --declaration-indentationn --honour-newlines
# --no-space-after-function-call-names --no-tabs --struct-brace-indentationn --start-left-side-of-comments
alias indent-bifit="indent -bap -bbo -br -brs -cdw -ce -cli0 -c0 -cs -d0 -di0 -hnl -l120 -lc90 -i4 -npcs -ppi 3 -npsl -nut -sbi4 -sc"

# canonicalize path (including resolving symlinks)
# alias realpath='readlink -f'

# Fix lang under X.
alias en="dbus-send --dest=ru.gentoo.KbddService /ru/gentoo/KbddService ru.gentoo.kbdd.set_layout uint32:0"
alias ут="dbus-send --dest=ru.gentoo.KbddService /ru/gentoo/KbddService ru.gentoo.kbdd.set_layout uint32:0"

################################################################
# Key binding.

set -o emacs

if [[ $- == *i* ]]; then
  bind '"\e/": dabbrev-expand'
  bind '"\ee": edit-and-execute-command'
fi

################################################################
# Completion.

if [[ -f /etc/bash_completion ]]; then
  # in Debian
  . /etc/bash_completion
  complete -F _quilt_completion dquilt
elif [[ -f /usr/share/bash-completion/bash_completion ]]; then
  # in Cygwin
  . /usr/share/bash-completion/bash_completion
elif [[ -f ~/usr/etc/bash_completion ]]; then
  . ~/usr/etc/bash_completion
fi
# Load local completions.
if [[ -f ~/.bash_completion ]]; then
  . ~/.bash_completion
fi
if [[ -d ~/.bash_completion.d ]]; then
  for f in ~/.bash_completion.d/* ~/.bash_completion.d/.*; do
    [[ -f "$f" ]] && . "$f"
  done
fi

################################################################
# Load custom settings (user editable).
# Placed to the end to allow override skel settings.

if [[ -f ~/.env.local ]]; then
  . ~/.env.local
fi

################################################################
# Useful functions.

datediff() {
  [[ -n "$1" ]] || { echo first argument is missing; return 1; }
  [[ -n "$2" ]] || { echo second argument is missing; return 1; }
  local diff=$(( $(date -d "$1" +%s) - $(date -d "$2" +%s) ))
  local sec=$(( diff % 60 ))
  diff=$(( diff / 60 ))
  local min=$(( diff % 60 ))
  diff=$(( diff / 60 ))
  local hour=$(( diff % 24 ))
  local day=$(( diff / 24 ))
  echo $day days $hour hours $min minutes $sec seconds
}

# For linguistic analysis.
myfreq() {
  ag --nofilename -C1 -- "$1"
  printf '\n\n\e[31mtotal:\e[0m '
  ag --nofilename --count -- "$1" | awk '{c += $1} END {print c}'
}

# "YYYY-MM-DD hh:mm:ss" or "hh:mm" for current day and random sec.
mygit-date() {
  if [[ "02:23" =~ ^[0-9]{2}:[0-9]{2}$ ]]; then
      local sec=$(($RANDOM % 60))
      if [[ ${#sec} = 1 ]]; then
          sec=0$sec
      fi
      local yyyymmdd=`date +%F`
      set "$yyyymmdd $1:$sec"
  fi
  echo GIT_COMMITTER_DATE='"'"$1"'"' git commit --amend --no-edit --date '"'"$1"'"'
  GIT_COMMITTER_DATE="$1" git commit --amend --no-edit --date "$1"
}