123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- #!/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 ###
- ### '''' ###
-
- 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)"
- }
-
- 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
- dnf provides "*bin/$bname" \
- | grep '^.' \
- | grep -E '^[0-9a-zA-Z_:.-]+ :'
- 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 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 SHELLFU_PRETTY=color
- export SHELLFU_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)
- [[ ${!DISPLAY[@]} ]] && xset b off
-
- # get rid of those .pyc files once and for all
- export PYTHONDONTWRITEBYTECODE=1
-
- ssh-add -l >& /dev/null || ssh-add
|