-
Notifications
You must be signed in to change notification settings - Fork 4
/
zshrc
308 lines (252 loc) · 9.66 KB
/
zshrc
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
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
ZSH=$HOME/.oh-my-zsh
# Look in ~/.oh-my-zsh/themes/
ZSH_THEME='fletcherm'
# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/custom/plugins/)
plugins=(zsh-syntax-highlighting)
source $ZSH/oh-my-zsh.sh
# Making zsh parse calls correctly
# More info: https://github.com/thoughtbot/dotfiles/pull/194/files
unsetopt nomatch
# macOS Sierra has removed the ability to remember your SSH keys across reboot in order to conform
# to mainstream OpenSSH behavior. More info: http://superuser.com/q/1127067/667812
# The following line solves this problem
ssh-add -A &> /dev/null
# Defang naughty commands; the entire history entry is in $1
# http://unix.stackexchange.com/a/312539
function zshaddhistory() {
if [[ $1 =~ "^ " ]]; then
return 0
elif [[ $1 =~ "cp\ *|mv\ *|rm\ *|cat\ *\>|pv\ *|dd\ *" ]]; then
1="# $1"
fi
# write to usual history location
print -sr -- ${1%%$'\n'}
# do not save the history line. if you have a chain of zshaddhistory
# hook functions, this may be more complicated to manage, depending
# on what those other hooks do (man zshall | less -p zshaddhistory)
return 1
}
############################################# Export #############################################
case $OSTYPE in
linux-gnu)
export EDITOR='vim'
export GEM_EDITOR='vim'
;;
darwin*)
export EDITOR='mvim'
export GEM_EDITOR='mvim'
;;
esac
# PostgreSQL
export PGHOST=localhost
case $OSTYPE in
linux-gnu)
export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export RAILS_ENV=production
;;
darwin*)
export CLICOLOR='auto'
export ARCHFLAGS='-arch x86_64' # Compilation flags
;;
esac
# Ruby
# https://reinteractive.net/posts/266-no-more-bundle-exec-using-the-new-rubygems_gemdeps-environment-variable
# export RUBYGEMS_GEMDEPS=- # This is not ready yet :(
# RVM
export PATH="$PATH:$HOME/.rvm/bin:/usr/local/rvm/bin" # Add RVM to PATH for scripting
# Homebrew
export PATH="$PATH:/usr/local/sbin"
# Load RVM into a shell session *as a function*
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
[[ -s "/usr/local/rvm/scripts/rvm" ]] && source "/usr/local/rvm/scripts/rvm"
######################################## Personal configs ########################################
if [[ -s $HOME/.personal_configs ]] ; then source $HOME/.personal_configs ; fi
if [[ -s $HOME/Dropbox/.personal_configs ]] ; then source $HOME/Dropbox/.personal_configs ; fi
############################################ Aliases #############################################
# Git
alias g='git status'
alias gc='git commit --no-edit'
alias gl='git log --graph --pretty=format:'\''%Cred%h%Creset -%C(yellow)%d%Creset %Cblue%an%Creset - %s %Cgreen(%cr)%Creset'\'' --abbrev-commit --date=relative'
alias gls='git log --graph --pretty=format:'\''%s'\'' --abbrev-commit --date=relative --author="`git config --get user.name`"'
alias gd='git --no-pager diff'
alias gdc='git --no-pager diff --cached'
alias gds='git --no-pager diff HEAD\^ HEAD'
alias gm='git merge --no-edit'
alias gmu='git fetch upstream && git merge upstream/master'
alias ga='git add'
alias gaa='git add --all'
alias gr='git rm'
alias gp='git pull --rebase'
alias gb='git branch'
alias gba='git branch -a'
alias gbd='git branch -d'
alias gbD='git branch -D'
alias scorched_earth='git checkout .; git clean -df'
# Ruby / Rails
alias cap='bundle exec cap'
alias transpec='bundle exec transpec -v example_group,hook_scope,stub_with_hash --explicit-spec-type -f spec'
alias ms='bundle exec middleman server --verbose'
alias js='bundle exec jekyll serve'
alias massa='bundle exec massa'
alias fs='foreman start -f Procfile.dev'
set_rails_aliases_and_functions() {
if [ -f Gemfile.lock ]; then
# Rails 2
if [[ "`cat Gemfile.lock | grep -E ' +rails \([0-9]+' | sed 's/ *rails (\(.\).*)/\1/'`" = "2" ]]; then
alias rs='script/server'
alias rc='script/console --irb=pry'
alias rg='script/generate'
alias spec='bundle exec spec'
alias rspec='bundle exec spec'
alias rake='bundle exec rake'
alias migrate='bundle exec rake db:migrate'
# Rails 3+
else
rs() { if [ "$RAILS_ENV" != 'production' ] && [ -f bin/rails ]; then bin/rails s "$@"; else bundle exec rails s "$@"; fi }
rc() { if [ "$RAILS_ENV" != 'production' ] && [ -f bin/rails ]; then bin/rails c "$@"; else bundle exec rails c "$@"; fi }
rg() { if [ "$RAILS_ENV" != 'production' ] && [ -f bin/rails ]; then bin/rails g "$@"; else bundle exec rails g "$@"; fi }
rspec() { if [ "$RAILS_ENV" != 'production' ] && [ -f bin/rspec ]; then bin/rspec "$@"; else bundle exec rspec "$@"; fi }
rake() { if [ "$RAILS_ENV" != 'production' ] && [ -f bin/rake ]; then bin/rake "$@"; else bundle exec rake "$@"; fi }
migrate() { if [ "$RAILS_ENV" != 'production' ] && [ -f bin/rake ]; then bin/rake db:migrate; else bundle exec rake db:migrate; fi }
assets() { if [ "$RAILS_ENV" != 'production' ] && [ -f bin/rake ]; then bin/rake assets:clean assets:precompile; else bundle exec rake assets:clean assets:precompile; fi }
fi
fi
}
# Others aliases
colorflag="-G"
alias ls="command ls ${colorflag}"
alias l="ls -lhF ${colorflag}" # All files, in long format
alias ll="l"
alias la="ls -laF ${colorflag}" # All files inc dotfiles, in long format
alias ag='ag --hidden --ignore-dir .git --ignore "*.json" --ignore "*.svg" --ignore=*.min.js'
alias agr='ag --ruby'
alias agj='ag --js --coffee'
alias agc='ag --sass --css'
alias agh='ag --html --haml'
alias h='heroku'
alias brewski='brew update && brew upgrade && brew cleanup; brew doctor'
case $OSTYPE in
darwin*)
alias ctags="`brew --prefix`/bin/ctags"
alias m="mvim ."
;;
esac
alias sshkey='cat ~/.ssh/id_rsa.pub | pbcopy && echo "SSH Key copied to clipboard"'
alias bne='curl wttr.in/brisbane'
########################################### Functions ############################################
case $OSTYPE in
linux-gnu)
alias c='cat'
;;
darwin*)
c() { /bin/cat -n $* | ccat } # Colorizing `cat` (https://github.com/jingweno/ccat)
;;
esac
replace() {
# Usage: replace foo bar **/*.rb
# Original function: https://github.com/thoughtbot/dotfiles/blob/master/bin/replace
find_this="$1"
shift
replace_with="$1"
shift
items=("${(@f)$(ag -l --nocolor "$find_this" "$@")}")
temp="${TMPDIR:-/tmp}/replace_temp_file.$$"
for item in $items; do
echo ✓ $item
sed "s/$find_this/$replace_with/g" "$item" > "$temp" && mv "$temp" "$item"
done
}
function npmls() {
npm ls --depth=0 "$@" 2>/dev/null
}
function npmlsg() {
npm ls -g --depth=0 "$@" 2>/dev/null
}
case $OSTYPE in
darwin*)
function rm() {
local path
for path in "$@"; do
# Ignore any arguments
if [[ "$path" = -* ]]; then :
else
local dst=${path##*/}
# Append the time if necessary
while [ -e ~/.Trash/"$dst" ]; do
dst="$dst $RANDOM"
done
/bin/mv "$path" ~/.Trash/"$dst"
fi
done
echo ""
}
# http://br-mac.org/2013/07/fcd-um-atalho-para-mudar-o-diretorio-corrente-do-terminal-para-a-pasta-aberta-no-finder.html
fcd() {
pFinder=`osascript -e 'tell application "Finder" to if (count of Finder windows) > 0 then get POSIX path of (target of front Finder window as text)'`
[ -n "$pFinder" ] && cd "$pFinder"
pwd
}
;;
esac
# Usage: aftermerge <branch> (default: master)
aftermerge() {
branch=`git branch 2> /dev/null | grep \* | sed 's/* //' | sed 's/(detached from \(.*\))/\1/'`
git checkout ${1-master}
git pull --rebase
git remote prune origin
git branch -d $branch
clear
git branch -a
}
# Convert Ruby 1.8 to 1.9 hash syntax
ruby_new_hash_syntax() {
perl -pi -e 's/:([\w\d_]+)(\s*)=>/\1:/g' ${1}**/*.rb
}
# Git History - http://goo.gl/BzdgE3
gh() {
if [ "$#" -ne 2 ]; then
echo "Usage: $0 PATTERN FILE"
echo
echo ' Show all of the various changes to a single line in a specified file over the entire' \
'git history'
echo
return 1
fi
for c in $(git log -G "$1" --format=%H -- $2); do
git --no-pager grep -e "$1" $c -- $2
done
}
############################################## PS1 ###############################################
check_last_exit_code() {
local LAST_EXIT_CODE=$?
if [[ $LAST_EXIT_CODE -ne 0 ]]; then
echo "%{$fg_bold[red]%}Exit code: $LAST_EXIT_CODE%{$reset_color%}"
fi
}
custom_prompt() {
local RUBY_PROMPT=""
if type ruby > /dev/null; then
local RUBY_VERSION=`ruby -e "puts RUBY_VERSION"`
if [ -f Gemfile.lock ]; then
local RAILS_VERSION=`cat Gemfile.lock | grep -E ' +rails \([0-9]+' | sed 's/ *rails (\(.*\))/\1/'`
fi
fi
if [[ "$RUBY_VERSION" != "" ]]; then
if [[ "$RAILS_VERSION" != "" ]]; then
local RAILS_PROMPT=" 🚂 ${RAILS_VERSION}"
fi
RUBY_PROMPT="%{$fg_bold[gray]%}💎 ${RUBY_VERSION}${RAILS_PROMPT}"
else
RUBY_PROMPT=""
fi
if [ -f /usr/local/bin/gitHUD ]; then local GIT_HUD=" $(/usr/local/bin/gitHUD zsh)"; fi
if [ -d 'spec/' ] && [ `grep -re ':\?focus\(:\| =>\) true' spec --exclude spec/spec_helper.rb --exclude spec/rails_helper.rb | wc -l | awk '{ print $1 }'` != '0' ]; then
local FOCUS='🎯 RSpec with focus'
fi
export PROMPT="%F{blue}%~%{$reset_color%} ${RUBY_PROMPT}${GIT_HUD} %F{red}${FOCUS}%{$reset_color%}
\$ "
export RPROMPT='$(check_last_exit_code)'
}
precmd() { custom_prompt; set_rails_aliases_and_functions }