forked from scmbreeze/scm_breeze
/
aliases_and_bindings.sh
195 lines (170 loc) · 7.18 KB
/
aliases_and_bindings.sh
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
#
# Set up configured aliases & keyboard shortcuts
# --------------------------------------------------------------------
# _alias() ignores errors if alias is not defined. (from lib/scm_breeze.sh)
# Print formatted alias index
list_aliases() { alias | grep "$*" --color=never | sed -e 's/alias //' -e "s/=/::/" -e "s/'//g" | awk -F "::" '{ printf "\033[1;36m%15s \033[2;37m=>\033[0m %-8s\n",$1,$2}'; }
alias git_aliases="list_aliases git"
# Wrap git with the 'hub' github wrapper, if installed
# https://github.com/defunkt/hub
if type hub > /dev/null 2>&1; then alias git=hub; fi
_alias $git_alias='git'
# --------------------------------------------------------------------
# Thanks to Scott Bronson for coming up the following git tab completion workaround,
# which I've altered slightly to be more flexible.
# https://github.com/bronson/dotfiles/blob/731bfd951be68f395247982ba1fb745fbed2455c/.bashrc#L81
# (only works for bash)
__define_git_completion () {
eval "
_git_$1_shortcut () {
COMP_LINE=\"git $2 \${COMP_LINE/$1 }\"
let COMP_POINT+=$((4+${#2}-${#1}))
COMP_WORDS=(git $2 \"\${COMP_WORDS[@]:1}\")
let COMP_CWORD+=1
local cur words cword prev
_get_comp_words_by_ref -n =: cur words cword prev
_git
}
"
}
# Define git alias with tab completion
# Usage: __git_alias <alias> <command_prefix> <command>
__git_alias () {
if [ -n "$1" ]; then
local alias_str="$1"; local cmd_prefix="$2"; local cmd="$3"; local cmd_args="${4-}"
alias $alias_str="$cmd_prefix $cmd${cmd_args:+ }$cmd_args"
if [ "$shell" = "bash" ]; then
__define_git_completion $alias_str $cmd
complete -o default -o nospace -F _git_"$alias_str"_shortcut $alias_str
fi
fi
}
# --------------------------------------------------------------------
# SCM Breeze functions
_alias $git_status_shortcuts_alias="git_status_shortcuts"
_alias $git_add_shortcuts_alias="git_add_shortcuts"
_alias $exec_git_expand_args_alias="exec_git_expand_args"
_alias $git_show_files_alias="git_show_affected_files"
_alias $git_commit_all_alias='git_commit_all'
# Expand numbers and ranges for commands that deal with paths
_exp="exec_git_expand_args"
__git_alias "$git_checkout_alias" "$_exp git" "checkout"
__git_alias "$git_commit_alias" "$_exp git" "commit"
__git_alias "$git_reset_alias" "$_exp git" "reset"
__git_alias "$git_reset_del_alias" "$_exp git" "reset" "--"
__git_alias "$git_reset_hard_alias" "$_exp git" "reset" "--hard"
__git_alias "$git_rm_alias" "$_exp git" "rm"
__git_alias "$git_blame_alias" "$_exp git" "blame"
__git_alias "$git_diff_alias" "$_exp git" "diff"
__git_alias "$git_diff_cached_alias" "$_exp git" "diff" "--cached"
__git_alias "$git_add_patch_alias" "$_exp git" "add" "-p"
# Standard commands
__git_alias "$git_clone_alias" "git" 'clone'
__git_alias "$git_fetch_alias" "git" 'fetch'
__git_alias "$git_checkout_branch_alias" "git" 'checkout' "-b"
__git_alias "$git_pull_alias" "git" 'pull'
__git_alias "$git_push_alias" "git" 'push'
__git_alias "$git_status_original_alias" "git" 'status' # (Standard git status)
__git_alias "$git_status_short_alias" "git" 'status' '-s'
__git_alias "$git_clean_alias" "git" "clean"
__git_alias "$git_clean_force_alias" "git" "clean" "-fd"
__git_alias "$git_remote_alias" "git" 'remote' '-v'
__git_alias "$git_branch_alias" "git" 'branch'
__git_alias "$git_rebase_alias" "git" 'rebase'
__git_alias "$git_rebase_alias_continue" "git" 'rebase' "--continue"
__git_alias "$git_rebase_alias_abort" "git" 'rebase' "--abort"
__git_alias "$git_merge_alias" "git" 'merge'
__git_alias "$git_cherry_pick_alias" "git" 'cherry-pick'
git_log_command="log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
__git_alias "$git_log_alias" "git" "$git_log_command"
__git_alias "$git_show_alias" "git" 'show'
# Compound/complex commands
_alias $git_fetch_all_alias="git fetch --all"
_alias $git_pull_then_push_alias="git pull && git push"
_alias $git_fetch_and_rebase_alias='git fetch && git rebase'
_alias $git_commit_amend_alias='git commit --amend'
# Add staged changes to latest commit without prompting for message
_alias $git_commit_amend_no_msg_alias='git commit --amend -C HEAD'
_alias $git_commit_no_msg_alias='git commit -C HEAD'
_alias $git_log_stat_alias='git log --stat --max-count=5'
_alias $git_log_graph_alias='git log --graph --max-count=5'
_alias $git_add_all_alias='git add -A'
_alias $git_branch_all_alias='git branch -a'
# Git Index alias
_alias $git_index_alias="git_index"
# ZSH tab completion
if [[ $shell == "zsh" ]]; then
# Turn on support for bash completion
autoload -Uz bashcompinit
bashcompinit
# -- zsh
compdef $git_alias=git
compdef _git $git_pull_alias=git-pull
compdef _git $git_push_alias=git-push
compdef _git $git_fetch_alias=git-fetch
compdef _git $git_fetch_and_rebase_alias=git-fetch
compdef _git $git_diff_alias=git-diff
compdef _git $git_commit_alias=git-commit
compdef _git $git_commit_all_alias=git-commit
compdef _git $git_checkout_alias=git-checkout
compdef _git $git_branch_alias=git-branch
compdef _git $git_branch_all_alias=git-branch
compdef _git $git_log_alias=git-log
compdef _git $git_log_stat_alias=git-log
compdef _git $git_log_graph_alias=git-log
compdef _git $git_add_shortcuts_alias=git-add
compdef _git $git_merge_alias=git-merge
else
complete -o default -o nospace -F _git $git_alias
fi
# Git repo management & aliases.
# If you know how to rewrite _git_index_tab_completion() for zsh, please send me a pull request!
complete -o nospace -o filenames -F _git_index_tab_completion git_index
complete -o nospace -o filenames -F _git_index_tab_completion $git_index_alias
# Keyboard Bindings
# -----------------------------------------------------------
# 'git_commit_all' and 'git_add_and_commit' give commit message prompts.
# See [here](http://qntm.org/bash#sec1) for info about why I wanted a prompt.
# Cross-shell key bindings
_bind(){
if [ -n "$1" ]; then
if [[ $shell == "zsh" ]]; then
bindkey -s "$1" "$2"
else # bash
bind "\"$1\": $2"
fi
fi
}
# Keyboard shortcuts for commits
if [[ "$git_keyboard_shortcuts_enabled" = "true" ]]; then
case "$-" in
*i*)
# Uses emacs style keybindings, so vi mode is not supported for now
if ! set -o | grep -q '^vi .*on$'; then
if [[ $shell == "zsh" ]]; then
_bind "$git_commit_all_keys" " git_commit_all""\n"
_bind "$git_add_and_commit_keys" " \e[1~ git_add_and_commit""\n"
else
_bind "$git_commit_all_keys" "\" git_commit_all\n\""
_bind "$git_add_and_commit_keys" "\"\e[1~ git_add_and_commit \n\""
fi
fi
# Commands are prepended with a space so that they won't be added to history.
# Make sure this is turned on with:
# zsh: setopt histignorespace histignoredups
# bash: HISTCONTROL=ignorespace:ignoredups
esac
fi
# Bash command wrapping
# (Works fine with RVM's cd() wrapper)
#~ if [[ "$bash_command_wrapping_enabled" = "true" ]]; then
#~ for cmd in vim cat cd rm cp mv ln; do
#~ alias $cmd="exec_git_expand_args $cmd"
#~ done
#~
#~ if [[ "$(type ls)" =~ "--color=auto" ]]; then
#~ alias ls="exec_git_expand_args ls --color=auto"
#~ else
#~ alias ls="exec_git_expand_args ls"
#~ fi
#~ fi