[Fix #88] Allow arbitrary git-info formats

The terms 'prompt' and 'rprompt' are not always appropriate.
A multi-line theme may choose 'line-one' and 'line-two' instead.

@ColinHebert contributed to this commit.
This commit is contained in:
Sorin Ionescu 2012-04-04 18:55:15 -04:00
parent 342f6e94a3
commit aa0c1faa19
2 changed files with 24 additions and 29 deletions

View File

@ -46,21 +46,20 @@
# # %S - Indicator to notify of stashed files. # # %S - Indicator to notify of stashed files.
# zstyle ':omz:module:git' stashed 'stashed:%S' # zstyle ':omz:module:git' stashed 'stashed:%S'
# #
# # %U - Indicator tnotify of unmerged files. # # %U - Indicator to notify of unmerged files.
# zstyle ':omz:module:git' unmerged 'unmerged:%U' # zstyle ':omz:module:git' unmerged 'unmerged:%U'
# #
# # %u - Indicator to notify of untracked files. # # %u - Indicator to notify of untracked files.
# zstyle ':omz:module:git' untracked 'untracked:%u' # zstyle ':omz:module:git' untracked 'untracked:%u'
# #
# # Left prompt.
# zstyle ':omz:module:git' prompt ' git:(%b %D)'
#
# # Right prompt.
# zstyle ':omz:module:git' rprompt ''
#
# # Ignore submodule when it is 'dirty', 'untracked', 'all', or 'none'. # # Ignore submodule when it is 'dirty', 'untracked', 'all', or 'none'.
# zstyle ':omz:module:git:ignore' submodule '' # zstyle ':omz:module:git:ignore' submodule ''
# #
# # Prompts.
# zstyle ':omz:module:git' info \
# 'prompt' ' git:(%b%D)' \
# 'rprompt' ''
#
# Load dependencies. # Load dependencies.
omodload 'trap' omodload 'trap'
@ -197,6 +196,8 @@ function git-info {
local dirty_format local dirty_format
local dirty_formatted local dirty_formatted
local ignore_submodule local ignore_submodule
local -A info_formats
local info_format
local line_number=0 local line_number=0
local modified=0 local modified=0
local modified_format local modified_format
@ -204,7 +205,6 @@ function git-info {
local position local position
local position_format local position_format
local position_formatted local position_formatted
local prompt_format
local remote local remote
local remote_cmd local remote_cmd
local remote_format local remote_format
@ -212,7 +212,6 @@ function git-info {
local renamed=0 local renamed=0
local renamed_format local renamed_format
local renamed_formatted local renamed_formatted
local rprompt_format
local stashed=0 local stashed=0
local stashed_format local stashed_format
local stashed_formatted local stashed_formatted
@ -223,12 +222,10 @@ function git-info {
local untracked=0 local untracked=0
local untracked_format local untracked_format
local untracked_formatted local untracked_formatted
local -A git_info_vars
local git_info_var
# Clean up previous git-info. # Clean up previous $git_info.
unset git_prompt_info unset git_info
unset git_rprompt_info typeset -gA git_info
# Return if not inside a Git repository work tree. # Return if not inside a Git repository work tree.
if ! is-true "$(git rev-parse --is-inside-work-tree 2> /dev/null)"; then if ! is-true "$(git rev-parse --is-inside-work-tree 2> /dev/null)"; then
@ -384,17 +381,10 @@ function git-info {
zformat -f dirty_formatted "$dirty_format" "D:$dirty" zformat -f dirty_formatted "$dirty_format" "D:$dirty"
fi fi
# Format prompts. # Format info.
zstyle -s ':omz:module:git' prompt 'prompt_format' zstyle -a ':omz:module:git' info 'info_formats'
zstyle -s ':omz:module:git' rprompt 'rprompt_format' for info_format in ${(k)info_formats}; do
zformat -f REPLY "$info_formats[$info_format]" \
git_info_vars=(
git_prompt_info "$prompt_format"
git_rprompt_info "$rprompt_format"
)
for git_info_var in ${(k)git_info_vars}; do
zformat -f "$git_info_var" "$git_info_vars[$git_info_var]" \
"A:$ahead_formatted" \ "A:$ahead_formatted" \
"B:$behind_formatted" \ "B:$behind_formatted" \
"D:$dirty_formatted" \ "D:$dirty_formatted" \
@ -410,9 +400,12 @@ function git-info {
"r:$renamed_formatted" \ "r:$renamed_formatted" \
"s:$action_formatted" \ "s:$action_formatted" \
"u:$untracked_formatted" "u:$untracked_formatted"
git_info[$info_format]="$REPLY"
done done
unset REPLY
unset _git_info_executing unset _git_info_executing
return 0 return 0
} }

View File

@ -41,12 +41,14 @@ function prompt_sorin_setup {
zstyle ':omz:module:git' stashed ' %%B%F{cyan}✭%f%%b' zstyle ':omz:module:git' stashed ' %%B%F{cyan}✭%f%%b'
zstyle ':omz:module:git' unmerged ' %%B%F{yellow}═%f%%b' zstyle ':omz:module:git' unmerged ' %%B%F{yellow}═%f%%b'
zstyle ':omz:module:git' untracked ' %%B%F{white}◼%f%%b' zstyle ':omz:module:git' untracked ' %%B%F{white}◼%f%%b'
zstyle ':omz:module:git' prompt ' %F{blue}git%f$(coalesce "%b" "%p" "%c")%s' zstyle ':omz:module:git' info \
zstyle ':omz:module:git' rprompt '%A%B%S%a%d%m%r%U%u' 'prompt' ' %F{blue}git%f$(coalesce "%b" "%p" "%c")%s' \
'rprompt' '%A%B%S%a%d%m%r%U%u'
PROMPT='%F{cyan}%1~%f${(e)git_prompt_info} %(!.%B%F{red}#%f%b.%B%F{green}%f%b) ' PROMPT='%F{cyan}%1~%f${(e)git_info[prompt]} %(!.%B%F{red}#%f%b.%B%F{green}%f%b) '
RPROMPT='${editor_keymap_info}%(?:: %F{red}⏎%f)${VIM:+" %B%F{green}V%f%b"}${git_rprompt_info}' RPROMPT='${editor_keymap_info}%(?:: %F{red}⏎%f)${VIM:+" %B%F{green}V%f%b"}${git_info[rprompt]}'
SPROMPT='zsh: correct %F{red}%R%f to %F{green}%r%f [nyae]? ' SPROMPT='zsh: correct %F{red}%R%f to %F{green}%r%f [nyae]? '
} }
prompt_sorin_setup "$@" prompt_sorin_setup "$@"