123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744 |
- #!/bin/bash
-
- ## hack to workaround Fedora/Red Hat bug 878428
- #shellcheck disable=SC1091
- 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 ###
- ### '''' ###
-
- prepend() {
- #
- # pre-pend $2 to filename $1
- #
- local path=$1
- local prefix=$2
- local dirpath
- local filename
- local abspath
- abspath=$(readlink -f "$path")
- dirpath=$(dirname "$abspath")
- filename=$(basename "$abspath")
- echo mv "$path" "$dirpath/$prefix-$filename"
- }
-
- smv() {
- #
- # scp but rm the source
- #
- local src=$1
- local dst=$2
- test $# -eq 2 || {
- echo "i can only 2 argz!" >&2
- return 2
- }
- scp "$src" "$dst" && rm "$src"
- }
-
- smvr() {
- #
- # smv but recursive
- #
- local src=$1
- local dst=$2
- test $# -eq 2 || {
- echo "i can only 2 argz!" >&2
- return 2
- }
- scp -r "$src" "$dst" && rm -r "$src"
- }
-
- snore() {
- #
- # Sleep loudly-ish for $1 time
- #
- local stime=${1:-0}
- test "$stime" == 0 || echo -e "sleeping for $BASHUM_COLOR_LGREEN$stime$BASHUM_COLOR_NORMAL"
- sleep "$stime"
- }
-
- dotsleep() {
- #
- # Sleep with dots for $1 seconds
- #
- local secs=$1
- echo -e "sleeping for $BASHUM_COLOR_LGREEN$secs$BASHUM_COLOR_NORMAL seconds"
- local secs_togo=$secs
- while test "$secs_togo" -gt 0; do
- sleep 1
- echo -n .
- ((secs_togo--))
- done
- echo
- }
-
- bb() {
- #
- # Ring the bell after $1 time of sleep
- #
- local stime=${1:-0}
- snore "$stime"
- printf '\a'
- }
-
- nn() {
- #
- # Ring the bell and send notification $1 after $2 time
- #
- local msg=${1:-this is done}
- local stime=$2
- bb "$stime"
- echo -e "hey, $BASHUM_COLOR_LRED$msg$BASHUM_COLOR_NORMAL"
- notify-send -a 'nn()' "hey, $msg"
- }
-
- pp() {
- #
- # Ring the bell and send notification $1 and pause
- #
- local msg=${1:-this is done}
- bb
- echo -e "hey, \033[1;31m$msg\033[1;0m!"
- notify-send -a 'pp()' "hey, $msg"
- read -r junk -p "Press Enter to continue"
- }
-
- lrep() {
- #
- # Print each line on STDIN $1 times
- #
- local rep=${1:-1}; shift
- local line
- local n
- while read -r line; do
- n=$rep
- while test "$n" -gt 0;
- do
- echo "$line"
- ((n--))
- done
- done
- }
-
- prep() {
- #
- # Print STDIN $1 times
- #
- local rep=${1:-1}; shift
- local data
- data=$(cat)
- n=$rep
- while test "$n" -gt 0;
- do
- echo "$data"
- echo
- ((n--))
- done
- }
-
- dt() {
- #
- # Open $1 new terminals
- #
- __bashum_run_n "${1:-1}" urxvt
- }
-
- dT() {
- #
- # Open $1 new alterminals
- #
- __bashum_run_n "${1:-1}" xfce4-terminal
- }
-
- hr() {
- #
- # Make horizontal ruler
- #
- local i
- local line
- for i in $(seq 1 "$COLUMNS"); do
- case $((i%10)) in
- 0) line+='#' ;;
- *) line+='-' ;;
- esac
- done
- echo "$line"
- echo "$line"
- echo "$line"
- }
-
- __bashum_run_n() {
- #
- # Run $2.. in background $1 times
- #
- local n=${1:-1}; shift
- while test "$n" -gt 0;
- do
- "$@" &
- ((n--))
- done
- }
-
- twice() {
- #
- # Run $@ two times
- #
- "$@"
- "$@"
- }
-
- ckyaml() {
- #
- # Check if YAML file $1 is loadable
- #
- local yfile=$1
- test -n "$yfile" || { echo "usage: ckyaml FILE.yaml"; return 2; }
- python -c 'import yaml; import sys; print(yaml.load(sys.stdin)["this"])' <"$yfile"
- }
-
- 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
- }
-
- grepcl() {
- #
- # Grep in common chat log files
- #
- # The order is from older apps to newer as I was moving towards
- # weechat.
- #
- grep "$@" -R \
- "$HOME/.config/xchat2/xchatlogs" \
- "$HOME/.config/xchat2/scrollback" \
- "$HOME/.config/hexchat/logs" \
- "$HOME/.config/hexchat/scrollback" \
- "$HOME/.local/share/weechat/logs.old" \
- "$HOME/.local/share/weechat/logs"
- }
-
- grepfx() {
- #
- # Grep recursively for technical debt
- #
- # '[F]' hack to avoid matching self
- #
- grep --color -n \
- --exclude-dir 'utils' \
- --exclude-dir '.git' \
- -o '#[F]IXME:.*' -R "$@"
- }
-
- 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 "$@"
- }
-
- grepr1() {
- #
- # Like grepr() but only list matching items in this directory
- #
- # Ie. list only files in current directory or names of subdirectories
- # where matches were found "somewhere".
- #
- grepr "$@" -l | cut -d/ -f1 | uniq
- }
-
- 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)" || return 1
- }
-
- 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() {
- #
- # List Vim .swp files in a nice table
- #
- # **Note:** For this ro work, you need to set up Vim to
- # use same swap directory as assigned below. this can
- # be achieved by addoing section such as this to your
- # .vimrc:
- #
- # if isdirectory($HOME . '/.local/share/vim') == 0
- # :silent !mkdir -p ~/.vim/swap >/dev/null 2>&1
- # endif
- # set directory=./.vim-swap//
- # set directory+=~/.local/share/vim/swap//
- # set directory+=~/tmp//
- # set directory+=.
- #
- # Call this after crash or poweroff to remind yourself what
- # files you were editing before fact. Example:
- #
- # 2015-07-10 06:10:48.603953758 +0200 ~/TODO.todo
- #
- # This should make it easier to recover after a little
- # disaster.
- #
- local swap="$HOME/.local/share/vim/swap"
- #shellcheck disable=SC1117
- 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"
- }
-
- nlfor() {
- #
- # Replace $1 (or blank space) with newlines and fix final newline
- #
- # Shorthand for commonly used tr syntax. Example:
- #
- # $ echo "$PATH" | nlat :
- # /foo
- # /bar
- # $
- #
- # is almost like `tr : '\n'` except that it is a bit easier
- # to type and fixes the annoying problem with missing
- # newline at the end of the replaced string.
- #
- local char=$1
- test -n "$char" || char='[:blank:]'
- tr "$char" '\n' \
- | fixnl
- }
-
- nljoin() {
- #
- # Join lines with $1 (or space)
- #
- # Shorthand for commonly used tr syntax. Example:
- #
- # $ { echo foo; echo bar; } | nljoin :
- #
- # is almost like `tr '\n' :` except that it is a bit easier
- # to type and fixes the annoying problem with extraneous
- # newline/colon at the end of final string.
- #
- local char=$1
- test -n "$char" || char=' '
- tr '\n' "$char" \
- | sed "s/$char*$//" \
- | fixnl -c
- }
-
- urle() {
- #
- # Encode or decode (if $1 is '-d') message on stdin as URL encode
- #
- local fn=quote
- case $1 in
- -d) fn=unquote ;;
- -*) echo 'usage: urle [-d] <text' >&2; return 2 ;;
- esac
- python3 -c "import sys; from urllib.parse import $fn; print($fn(sys.stdin.read()));"
- }
-
- qpr() {
- #
- # Encode or decode (if $1 is '-d') message on stdin as Quoted Printable
- #
- local fn=encode
- case $1 in
- -d) fn=decode ;;
- -*) echo 'usage: qpr [-d] <text' >&2; return 2 ;;
- esac
- perl -MMIME::QuotedPrint -pe "\$_=MIME::QuotedPrint::$fn(\$_);"
- }
-
- 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
- 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
- tmp=$(mktemp -d -t "xood.XXXXXXXX")
- xclip -selection clipboard -o > "$tmp/$name"
- echo "$tmp/$name"
- }
-
- xl() {
- #
- # Show primary clipboard in less(1)
- #
- xop o | less -S
- }
-
- xxl() {
- #
- # Show C-C clipboard in less(1)
- #
- xop oo | less -S
- }
-
- xvxx() {
- #
- # Edit text in primary clipboard and save it to C-C clipboard
- #
- # Ideal for editing snippets in browser-based editors: during editing,
- # select the text, open terminal, call `xvxx`, edit the text, move
- # back to the browser and paste it over the old (still selected) text.
- # That's it, no need to make up and save temporary files.
- #
- # If you quickly realize you need to re-edit the text, use xvvx().
- #
- xop o | vipe | xop ii
- }
-
- xcp() {
- #
- # Copy paths of $@ to clipboard
- #
- local path
- find "$@" -maxdepth 0 -mindepth 0 \
- | while read -r path; do
- readlink -e "$path"
- done \
- | xop i
- }
-
- xpst() {
- #
- # Paste paths from clipboard
- #
- { xop o; echo; } \
- | while read -r path; do
- echo "path='$path'" >&2
- test -e "$path" || {
- echo "does not exist: $path"
- continue
- }
- cp -r "$path" .
- done
- }
-
- xvb() {
- #
- # Edit text in primary clipboard and run it using bash
- #
- xop o | vipe | bash
- }
-
- xxvb() {
- #
- # Edit text in C-C clipboard and run it using bash
- #
- xop oo | vipe | bash
- }
-
- vxx() {
- #
- # Edit text on stdin and save it to C-C clipboard
- #
- # Ideal for editing outut of command before pasting ot to browser
- # or another GUI application. Run the command with `vxx`, edit
- # the text, move back to the application and paste it.
- #
- # If you quickly realize you need to re-edit the text, use xvvx().
- #
- vipe | xop ii
- }
-
- xcxx() {
- #
- # Filter text in primary clipboard using command $@ and save it to C-C clipboard
- #
- # Similar to xvvx() but instead of interactive editing, provided filter
- # command is run.
- #
- local cmd=("$@")
- xop o | "${cmd[@]}" | xop ii
- return "${PIPESTATUS[1]}"
- }
-
- vx() {
- #
- # Edit stdin and save it to primary clipboard
- #
- # Ideal for selecting snippets of output of arbitrary commands.
- # select the text, open terminal, call `xvx`, edit the text, move
- # back to the browser and paste it over the old (still selected) text.
- # That's it, no need to make up and save temporary files.
- #
- vipe | xop i
- }
-
- xxvxx() {
- #
- # Edit text in C-C clipboard and save it back
- #
- xop oo | vipe | xop ii
- }
-
- yt2ogg() {
- #
- # Download YouTube video as vorbis audio
- #
- local url=$1
- youtube-dl -x --audio-format vorbis "$url"
- }
-
- 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
- }
-
- cal() {
- #
- # cal with the proper version pick
- #
- local cal_v
- local cal_es
- cal_v=$(command cal -V 2>/dev/null); cal_es=$?
- case $cal_es:$cal_v in
- 0:cal\ from\ util-linux\ 2.*)
- command cal --color=always --monday --week "$@"
- ;;
- 64:*)
- command cal -M "$@"
- ;;
- esac
- }
-
- ### .... ###
- ### 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 st"
- HISTIGNORE="$HISTIGNORE:se *:sc *"
- HISTSIZE=33333
- HISTFILESIZE=33333
- HISTTIMEFORMAT='%F %T '
- GLOBIGNORE=.:..
- # shopt -s histverify
-
- # some more aliases
- alias cls='clear'
- alias czkrates='czkrates -v'
- alias ll='ls -lh'
- alias lla='ls -lha'
- alias lr='ll -lhrt'
- alias open='xdg-open'
- alias diff='colordiff -u'
- alias dmesg='dmesg --time-format iso'
- alias pad4='sed -e "/./s/^/ /"'
- alias mkittool='mkittool -v'
- alias grep='grep --color'
- 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 pstree='pstree -h'
- alias virsh='virsh --connect qemu:///system'
- alias wttr='curl -s "wttr.in/?1&n&q"'
- 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"
-
- x4x() {
- #
- # Pad text from primary clipboard with 4 spaces; save to C-C clipboard
- #
- # ...that is, for inclusion as Markdown verbatim text.
- #
- xo | pad4 | xii
- }
-
- BASHUM__RV_TMP="/tmp/bashum-rv"
- mkdir -p "$BASHUM__RV_TMP"
-
- ### ...... ###
- ### OTHERS ###
- ### '''''' ###
-
- export LC_COLLATE=C # make sort upper first
- export EDITOR=vim
- export LESSOPEN="| /usr/bin/src-hilite-lesspipe.sh %s"
- export LESS=' -R '
-
- export NEATY=color
- export PRETTY=color
- export PRETTY_DEBUG_EXCLUDE=inigrep
-
- export MDVIMB__CONVERTER=cmark
- export MDVIMB__STYLE=darkzen # pergamen
-
- #shellcheck disable=SC2034
- {
- GIT_PS1_SHOWDIRTYSTATE=true
- GIT_PS1_SHOWUNTRACKEDFILES=true
- __SATURNIN_COMPLETE_DEBUG=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
|