summaryrefslogtreecommitdiffstats
path: root/.bashrc
blob: 4d06f2455b3f723d075f0375d63e8837df29981b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# .bashrc

# Some minimal API expected by sourced files
# XXX: check for alias collision
_diralias () {
	local target=$(echo $* | sed -s "s| |/|g")
	test "$(pwd)" = "$(eval echo "$(dirs +1 2>/dev/null)")" && popd -n &>/dev/null
	test "${target}" = "$(eval echo "$(dirs +0)")" || pushd "${target}" >/dev/null
	pwd
}
diralias () {
	alias "$(basename "$1")=_diralias $1"
	# using loose depth from the beginning unnecessarily clutter the offer,
	# so this way, albeit complicated, convenient traversal is achieved
	# XXX could -G be used instead?
	complete -o nospace -C \
	  "f(){ test \"\$3\" != \"$(basename "$1")\" || \
	        find -L \"${1%%* }/\${2%\${2##*/}}\" \
	          -mindepth 1 -maxdepth 1 -type d  -name \"\${2##*/}*\" \
	          -printf \"\${2%\${2##*/}}%P\\n\"; }; f" \
	  "$(basename "$1")"
}

if test -n "${XAUTHORITY:-}"; then
	_linkalias () {
		gnome-open "$(printf "$1" "${@:2}")"
	}
else
	_linkalias () {
		elinks "$(printf "$1" "${@:2}")"
	}
fi
linkalias () { alias "$1=_linkalias $2"; }

# Source the other common definitions
for f in /etc/profile \
        $(find ~ -maxdepth 1 -name '.bashrc-*' \! -name '.bashrc-priv-*'); do
	test -f "${f}" && source "${f}" || :
done

# User specific aliases and functions

set -o vi

shopt -s histappend
HISTSIZE=60000
HISTCONTROL=ignoreboth

# subshell to avoid triggering DEBUG. (src: http://stuff.lhunath.com/.bashrc)
PROMPT_COMMAND='(history -a)'
PS1='\[\033[01;34m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ '

ACK=ack
test "$(ack --version | head -n1 | sed 's|^ack\s\([0-9]\+\).*|\1|')" -ge 2 \
  || ACK+=" -a"

# http://ruslanspivak.com/2010/11/25/bash-history-incremental-search-forward/
stty stop ^X

# op(t)inioned commands
alias tree='tree -a'
alias mc='LESS="-RSX" mc'
alias tmux='tmux -2'
alias acka='$ACK --follow'

# internal, debug, etc.
alias hist-del-last='history -d $(history 1 | cut -d" " -f2)'  # historical NOOP
alias int-usage='echo "usage: $FUNCNAME "'

# dir aliases (use either as "gmy" or "cd $(gmy)" or, e.g., "gmy dotfiles")
diralias ~/wrkspc
diralias ~/wrkspc/gmy
diralias ~/wrkspc/gwork


# internal, debug, etc.

debug-argsep () {
	while [ $# -ne 0 ]; do
		echo $1;
		shift
	done
}

# proper functions

cdup () {
	local up="."
	for i in $(seq 1 $1); do up+="/.."; done
	cd "${up}" 2>/dev/null && pwd || :
	unset up
}

cdmk () {
	cd "$1" 2>/dev/null || { mkdir "$1"; cd "$1";}
}

# Jim Meyring's take on "display the programs with W and X memory"
# http://lists.fedoraproject.org/pipermail/devel/2013-April/181747.html
sec-wx-mem () {
	grep -lE '^[0-9a-f-]+ .wx' /proc/*/maps 2>/dev/null \
	  | perl -ne 'm!^(/proc/(\d+))/.*! and printf qq(%5d %s\n), $2, `cat $1/cmdline`' \
	  | tr '\0' ' '
}

ack-intersection () {
	[ $# -ne 2 ] && int-usage "1st-regexp" "2nd-regexp" && return
	comm <($ACK -l --follow "$1" | sort) <($ACK -l --follow "$2" | sort) -12
}

hist-grep () {
	hist-del-last  # omit hist-grep invocation
	grep $* -- ~/.bash_history
}

img-diff () {
	[ $# -ne 2 ] && int-usage "1st-img" "2nd-img" && return
	#xloadimage <(gm compare "$1" "$2" -highlight-color red -highlight-style threshold -file -)
	#xloadimage <(compare "$1" "$2" -highlight-color violet -lowlight-color darkgray -compose threshold -)
	#xloadimage <(compare "$1" "$2" -highlight-color violet -lowlight-color darkgray \
	#             -compose threshold jpg:- | convert jpg:- -fuzz 2% -fill red -opaque '#915e99' png:-)
	xloadimage <(compare "$1" "$2" -highlight-color violet -lowlight-color darkgray -compose threshold -)
}

img-qr () {
	local title="Piped: "
	[ $# -ge 1 ] \
	  && { input="$1"; title="$1"; } \
	  || { input=$(</dev/stdin); title+="$(echo "${input}" | head -n1)"; }
	xloadimage -fit -shrink -title "${title}" <(qrencode -m0 -s40 -o- "${input}" )
}

# prexec stuff

_preexec_flag=0
# idea is simple: auto-paginate output of selected commads that cannot do it
#                 on their own
# XXX: hacky, not exactly sure why this (and so far only this) works :)
preexec() {
	local cmd=${1%% *}
	#test ${_preexec_flag} -eq 0 && test ${BASH_SUBSHELL} -eq 0 \
	#  || { _preexec_flag=0; return 0; }
	test ${BASH_SUBSHELL} -eq 0 && [[ ! "${1}" =~ .*\|.* ]] \
	  || { _preexec_flag=0; return 0; }
	case "$1" in
	colordiff\ *|diff\ *|find\ *|git\ ls-files|rpm\ *|sdcv\ *|yum\ list*|yum\ search*)
		_preexec_flag=1
		eval "${1} <&- 2>&1 | ${PAGER}"
		trap "_preexec_flag=0; trap - RETURN;" RETURN
		return 2
		;;
	esac
}

preexec_install