-
Notifications
You must be signed in to change notification settings - Fork 2
/
.bashrc
237 lines (213 loc) · 7.15 KB
/
.bashrc
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
#!/bin/bash
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
if [ -t 1 ]; then
stty -ixon -ixoff # disable tty flow control (^s and ^q)
stty werase undef # disable the ttys ^w which overrides readlines backward-kill-word
fi
# Useful bash options
# shopt -s cdable_vars # if cd arg is not valid, assumes its a var defining a dir
# shopt -s cdspell # autocorrects cd misspellings
# shopt -s checkwinsize # update the value of LINES and COLUMNS after each command if altered
# shopt -s cmdhist # save multi-line commands in history as single line
# shopt -s dotglob # include dotfiles in pathname expansion
# shopt -s expand_aliases # expand aliases
# shopt -s extglob # enable extended pattern-matching features
# shopt -s histappend # append to (not overwrite) the history file
# shopt -s histverify # readline goodness for history substitutions
# shopt -s histreedit # allow re-editing failed history substitutions
# shopt -s hostcomplete # attempt hostname expansion when @ is at the beginning of a word
# shopt -s nocaseglob # pathname expansion will be treated as case-insensitive
shopt -s cdable_vars cdspell checkwinsize cmdhist dotglob expand_aliases extglob histappend histverify histreedit hostcomplete nocaseglob
[[ ${BASH_VERSINFO[0]} -ge 4 ]] && shopt -s globstar # allow recursive globbing with ** (bash 4.0 and later only)
function source_if_exists() {
for file in "$@"; do
if [[ -f "$file" ]]
then
# shellcheck disable=SC1090
. "$file"
fi
done
}
function command_is_defined() {
type -t "$1" &> /dev/null
}
function __eval_output_cached() {
local base_dir="$TMPDIR/${FUNCNAME[0]}"
mkdir -p "$base_dir"
local cmdline=("$@")
local cmdline_string="${cmdline[*]}"
local cached_output_filepath="$base_dir/${cmdline_string//[^A-Za-z0-9._-]/_}"
if [[ -f "$cached_output_filepath" ]]; then
# shellcheck disable=SC1090
. "$cached_output_filepath"
else
"${cmdline[@]}" > "$cached_output_filepath"
"${FUNCNAME[0]}" "${cmdline[@]}"
fi
}
case "$OSTYPE" in
linux*)
# shellcheck source=.bash.d/linux
. ~/.bash.d/linux
;;
darwin*)
# shellcheck source=.bash.d/osx
. ~/.bash.d/osx
;;
esac
function __exit_status_ps1() {
local status="$?"
# if [[ $status -gt 0 ]]
# then
# color='\033[0;31m'
# else
# color='\033[0;32m'
# fi
# printf "\\[${color}\\]%03s\\[\\033[0m\\]" "$status" #color formatting/escape condes doesn't work fsr
printf "%03s" "$status"
}
PS1='$(__exit_status_ps1) \[\033[0;34m\]\h\[\033[0;36m\] \w\[\033[0m\] $ '
export PS1
# Set dircolors
if [[ -x /usr/bin/dircolors ]]
then
__eval_output_cached dircolors -b
fi
# enable completion for pip
if command_is_defined pip
then
__eval_output_cached pip completion --bash 2>/dev/null
fi
# Change the window title of X terminals
case "$TERM" in
aterm|eterm|*xterm*|konsole|kterm|rxvt*|wterm)
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}: ${PWD/$HOME/~}\007"'
;;
screen*)
PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~} \033\\"'
;;
esac
# Exports
if [[ -d "$HOME/bin" ]]
then
export PATH="$PATH:$HOME/bin"
fi
export PAGER=less
export MANPAGER=less
export EDITOR="emacs -nw"
export VISUAL=$EDITOR
export ALTERNATE_EDITOR="" # this makes emacsclient start the emacs daemon
if { [[ ${BASH_VERSINFO[0]} -eq 4 ]] && [[ ${BASH_VERSINFO[1]} -ge 3 ]]; } || [[ ${BASH_VERSINFO[0]} -gt 4 ]]; then
export HISTSIZE=-1
export HISTFILESIZE=-1
else
export HISTSIZE=500000
export HISTFILESIZE=500000
fi
export HISTCONTROL=ignoredups
export HISTTIMEFORMAT='%Y-%m-%d %H:%M:%S '
export IGNOREEOF=1 # ignore 1 EOF (^D) before killing the shell
export PROMPT_DIRTRIM=3 # truncate long paths in PS1 prompt
#export PROMPT_COMMAND="history -a && history -c && history -r && $PROMPT_COMMAND" # append to and reread histfile on prompt
export PROMPT_COMMAND="history -a && $PROMPT_COMMAND" # append to and reread histfile on prompt
# colorize manpages in less
export LESS_TERMCAP_mb=$'\E[01;31m' # begin blinking
export LESS_TERMCAP_md=$'\E[0;34m' # begin bold
export LESS_TERMCAP_me=$'\E[0m' # end bold
export LESS_TERMCAP_so=$'\E[01;40;33m' # begin standout mode
export LESS_TERMCAP_se=$'\E[0m' # end standout mode
export LESS_TERMCAP_us=$'\E[0;36m' #begin underline
export LESS_TERMCAP_ue=$'\E[0m' # end underline
# Useful aliases
alias ..="cd .." # lazy
alias ll='ls -lh' # long listing
alias l=ll
alias la='ls -lah' # include hidden files
alias cp='cp -iv' # verbose + idiot proofing...
alias mv='mv -iv' # verbose + idiot proofing...
alias rm='rm -iv' # verbose + idiot proofing...
alias g=git
alias diga='dig +nocmd -tANY +multiline +noall +answer'
alias digx='dig +nocmd -tANY +multiline +noall +answer -x'
# Useful functions
function hex2dec {
printf "%d\n" "$1"
}
function dec2hex {
printf "0x%x\n" "$1"
}
# extract files based on file extension
function x() {
for arg in "$@"
do
if [ -f "$arg" ]
then
case "$arg" in
*.tar.bz2) tar xjvf "$arg" ;;
*.tar.gz) tar xzvf "$arg" ;;
*.tar.xz) tar xJvf "$arg" ;;
*.bz2) bunzip2 -v "$arg" ;;
*.rar) unrar x "$arg" ;;
*.gz) gunzip -v "$arg" ;;
*.tar) tar xvf "$arg" ;;
*.tbz2) tar xjvf "$arg" ;;
*.tgz) tar xzvf "$arg" ;;
*.txz) tar xJvf "$arg" ;;
*.zip) unzip "$arg" ;;
*.jar) jar xvf "$arg" ;;
*.Z) uncompress "$arg" ;;
*.xpi) unzip "$arg" ;;
*.7z) 7z x "$arg" ;;
*.crx) unzip "$arg" ;;
*) echo "'$arg' cannot be extracted via x (extract)" ;;
esac
else
echo "'$arg' is not a valid file"
fi
done
}
# cd up to a named dir in the current working directory
function upto() {
local p="$PWD";
while [[ -n $p ]];
do
if [[ ${p##*/} = "$1" ]];
then
cd "$p" || return 1
return;
fi;
p=${p%/*};
done;
return 1;
}
function __upto() {
local cur
_get_comp_words_by_ref cur
mapfile -t COMPREPLY < <(compgen -W "${PWD//\// }" -- "$cur")
}
complete -o default -F __upto upto
function _cd_subdir() {
local name="$1"
local subdirectory="$2"
# intentionally don't expand $1; quiet shellcheck
# shellcheck disable=SC2016
echo 'function '"$name"'() {
cd '"${subdirectory}"'/$1 || return 1
}
function __'"$name"'() {
local subdirectory=$1
local cur
_get_comp_words_by_ref cur
COMPREPLY=( $(cd '"$subdirectory"' && compgen -d -- "$cur") )
}
complete -o nospace -S / -o dirnames -F __'"$name $name"
}
source_if_exists ~/.bashrc_local
enable_bash_completion
unset enable_bash_completion
# Add git status to prompt if __git_ps1 is available
if command_is_defined __git_ps1
then
export PS1="${PS1% $ }"'\[\033[1;35m\]$(__git_ps1 " (%s)")\[\033[0m\] $ '
fi