#!/bin/bash ## hack to workaround Fedora/Red Hat bug 878428 test -f /usr/share/git-core/contrib/completion/git-prompt.sh \ && . /usr/share/git-core/contrib/completion/git-prompt.sh ####################################################### ### things to do BEFORE host/user-specific settings ### ####################################################### ### .... ### ### SUBZ ### ### '''' ### dt() { # # Open $1 new terminals # __bashum_run_n "${1:-1}" urxvt } dT() { # # Open $1 new alterminals # __bashum_run_n "${1:-1}" xfce4-terminal } __bashum_run_n() { # # Run $2 in background $1 times # local n=${1:-1} while test "$n" -gt 0; do "$2" & ((n--)) done } git() { # # /usr/bin/git wrapper just to disable dangerous commands # # In particular, `git-am` is a a close typo of my favorite # aliases `ap` (`git-add --patch`) and `cm` (`git-commit`) # but it's dangerous to call by accident as it destroys # workdir changes. # if grep -Fwqse "$1" "$GIT_DISABLED_COMMANDS"; then echo "You don't want this." >&2 return 1 else command git "$@" fi } grepr() { # # Grep recursively, keeping numbers and ignoring common dirs # # Number one tool for refactoring! # local p=$1; shift grep --color -n --exclude-dir=".git" -e "$p" -r "$@" } greph() { # # Grep through bash history # history | sed 's/^ *//; s/ / /' | cut -d' ' -f2- | grep "$@" } gitcd() { # # Deep in git repo, cd to the git root # cd "$(git rev-parse --show-toplevel)" } haste() { # # Send stdin to hastebin.com and print resulting URL # local a=$(cat) curl -X POST -s -d "$a" http://hastebin.com/documents \ | awk -F '"' '{print "http://hastebin.com/"$4}' } clsz() { # # Clear screen and move the prompt to bottom # tput clear; tput cup "$(tput lines)" 0 } bcdiff() { # # Call bcompare only if objects actually differ # test $# -eq 2 && diff "$@" >/dev/null && return bcompare "$@" & } strip_colors() { # # Strip color codes from stdin # # Stolen from http://unix.stackexchange.com/a/4533/9365 # sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" } vims() { # # Show "abandoned" Vim .swp files in a nice table # # Call this after crash or poweroff to get back and recover # files open before the fact. Example: # # 2015-07-10 06:10:48.603953758 +0200 ~/TODO.todo # # Depends on .swp settings defined in my mydots repo. # local swap="$HOME/.local/share/vim/swap" find "$swap" -type f -print0 \ | xargs -0 -r stat -c "%y %n" \ | sed " s| $swap/| | s|%|/|g s|.swp$|| s| $HOME| ~| s| \(..:..\):[^ ]* +.... | \\1 | " \ | sort \ | tac } fixnl() { # # Fix newlines in stdin and pass to stdout # # Note: We need to read whole stdin; this cannot work # for infinite stream. # # Fix annoying cases: # # * If multi-line text is missing newline at the # end---add the missing newline. # # * If -c is passed, and single-line text does have # a newline at the end, remove it. # # This will not touch properly terminated multi-line texts, # or zero-line texts (ie. oly chars with no newline at all). # local arg=$1 # argument passed local cache # cache to keep stream in local nlcount # count of newlines in the stream local lastchr # hex dump (2-digit, lowercase) of last char local single=keep # single-line streams: # keep: do nothing # chop: drop last char if it's a LF case $arg in -c|--chop-single) single=chop ;; esac cache="$(mktemp -t fixnl.XXXXXXXX)" cat >"$cache" nlcount=$(<"$cache" wc -l) lastchr=$(<"$cache" tail -c1 | hexdump -e '"%02x"') case $nlcount:$lastchr:$single in 0:??:*) cat "$cache" ;; # 'abc' => keep as is 1:0a:chop) head -c -1 "$cache" ;; # 'abc\n' => -c passed: chop! 1:0a:keep) cat "$cache" ;; # 'abc\n' => keep as is *:0a:*) cat "$cache" ;; # 'a\nb\nc\n' => keep as is *:??:*) cat "$cache"; echo ;; # 'a\nb\nc' => add the missing NL esac rm "$cache" } xop() { # # Common clipboard operations with fixnl() on top # local op=$1 local file=${2:-/dev/stdin} case $op in oo) xclip -selection clipboard -o | fixnl ;; o) xclip -o | fixnl ;; ii) fixnl -c | xclip -selection clipboard -i ;; i) fixnl -c | xclip -i ;; esac <"$file" } xod() { # # Like mktemp but get the content from clipboard # # Dump xo in a file named $1 somewhere in /tmp; echo the path # usage: scp $(xod useful_name.txt) eg:some/shared/place # instead of xo>useful_name.txt; scp useful_name.txt eg:some/shared/place; rm useful_name.txt # local name="${1:-clipboard_dump.txt}" local tmp=$(mktemp -d -t "xod.XXXXXXXX") xclip -o > "$tmp/$name" echo "$tmp/$name" } xood() { # # Just like xod() but using xoo (i.e. 'clipboard' clipboard) # local name="${1:-clipboard_dump.txt}" local tmp=$(mktemp -d -t "xood.XXXXXXXX") xclip -selection clipboard -o > "$tmp/$name" echo "$tmp/$name" } yum_hasbin() { # # Ask yum who has bin $1 (and make the output actually readable) # local bname for bname in "$@"; do case $bname in */*) dnf provides "$bname" ;; *) dnf provides "*/bin/$bname" ;; esac \ | grep '^.' \ | grep -E '^[[:alnum:]_:.-]+ :' done } ### .... ### ### BASH ### ### '''' ### HISTCONTROL=ignoredups:erasedups shopt -s histappend PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND" HISTIGNORE="$HISTIGNORE:ls:ll:la:cd" HISTIGNORE="$HISTIGNORE:git dc:git st" HISTIGNORE="$HISTIGNORE:reset" #export HISTIGNORE="$HISTIGNORE:se *:sc *" HISTSIZE=-1 HISTFILESIZE=100000 GLOBIGNORE=.:.. shopt -s histverify # some more aliases alias cal='cal -m' alias cls='clear' alias ll='ls -lh' alias lla='ls -lha' alias open='gnome-open' alias diff='colordiff -u' alias dmesg='dmesg --time-format iso' alias pad4='sed -e "/./s/^/ /"' alias grep='grep --color --binary-files=without-match' alias sc='se --direction=encz.cz' alias taskm='task modify' alias tasks='task rc.context:none' alias ts='ts "%F %T"' alias lsblk='lsblk -o +UUID,LABEL' alias virsh='virsh --connect qemu:///system' alias xaa='xclip -o | audit2allow' alias xi='xop i' alias xii='xop ii' alias xo='xop o' alias xoo='xop oo' alias reboot="echo -n . ; sync ; echo -n . ; sync ; echo -n . ; systemctl reboot" alias poweroff="echo -n . ; sync ; echo -n . ; sync ; echo -n . ; systemctl poweroff" RV_TMP="/tmp/bash-rv" mkdir -p "$RV_TMP" ### ...... ### ### OTHERS ### ### '''''' ### export LC_COLLATE=C # make sort upper first export EDITOR=vim export PRETTY=color export PRETTY_DEBUG_EXCLUDE=inigrep # make green git bash trinket even cooler GIT_PS1_SHOWDIRTYSTATE=true GIT_PS1_SHOWUNTRACKEDFILES=true GIT_DISABLED_COMMANDS="$HOME/.gittum/disabled-commands" export GIT_PAGER='less -S' # disable mounting things like SFTP to ~/.gvfs when accessed # via GIO (used by nautilus etc.) export GVFS_DISABLE_FUSE=1 # disable the terrible beep sound (only for X; for tty?, blacklist pcspkr) xhost >& /dev/null && xset b off # get rid of those .pyc files once and for all export PYTHONDONTWRITEBYTECODE=1 ssh-add -l >& /dev/null || ssh-add