cinaeco.zsh-theme 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. ## Set tab title to hostname
  2. print -Pn "\e]1;`hostname | cut -d. -f1`\a"
  3. ## Multiline Prompt
  4. PROMPT='
  5. $(host_name)$(current_folder)$(git_prompt_info)$(background_job_info)
  6. %{$fg[magenta]%}%n - %{$reset_color%}'
  7. RPROMPT='$(vi_mode_prompt_info) %{$reset_color%}%T %{$fg[white]%}%h%{$reset_color%}'
  8. ZSH_THEME_GIT_PROMPT="on"
  9. ZSH_THEME_GIT_PROMPT_PREFIX="["
  10. ZSH_THEME_GIT_PROMPT_SUFFIX="]%{$reset_color%}"
  11. ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[green]%}"
  12. ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}"
  13. ZSH_THEME_GIT_STATUS_MAX=20
  14. ZSH_THEME_GIT_PROMPT_UNMERGED="U"
  15. ZSH_THEME_GIT_PROMPT_UNTRACKED="?"
  16. ZSH_THEME_GIT_TREE_MODIFIED="+"
  17. ZSH_THEME_GIT_TREE_DELETED="x"
  18. ZSH_THEME_GIT_INDEX_MODIFIED="+"
  19. ZSH_THEME_GIT_INDEX_ADDED="±"
  20. ZSH_THEME_GIT_INDEX_DELETED="x"
  21. ZSH_THEME_GIT_INDEX_RENAMED="r"
  22. ZSH_THEME_GIT_INDEX_COPIED="c"
  23. ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE=" BEHIND"
  24. ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE=" AHEAD"
  25. ZSH_THEME_GIT_PROMPT_DIVERGED_REMOTE=" %{$fg[red]%}DIVERGED!"
  26. DISABLE_UNTRACKED_FILES_DIRTY="false"
  27. MODE_INDICATOR="%{$fg[green]%}vi-mode%{$reset_color%}"
  28. ##############################
  29. # FUNCTIONS
  30. ##############################
  31. function host_name() {
  32. echo "%{$fg[cyan]%}[%m]"
  33. }
  34. function current_folder() {
  35. echo " %{$fg[yellow]%}%3~"
  36. }
  37. function background_job_info() {
  38. echo " %(1j.%{$FG[063]%}[jobs]: %{$fg[red]%}%j%{$reset_color%}.)"
  39. }
  40. # Toggle the display of git information in the prompt. Defaults to "on".
  41. function toggle_git_prompt() {
  42. [[ $ZSH_THEME_GIT_PROMPT == "on" ]] && ZSH_THEME_GIT_PROMPT="off" || ZSH_THEME_GIT_PROMPT="on"
  43. }
  44. # Display Git repo information in prompt (override the default omz function)
  45. #
  46. # Displays [repo:branch:commit] BISECT/MERGE/REBASE AHEAD/BEHIND/DIVERGED! +±xcrU?
  47. #
  48. # Git commit id and mode code taken from:
  49. # https://github.com/benhoskings/dot-files/blob/master/files/bin/git_cwd_info
  50. function git_prompt_info() {
  51. [[ $ZSH_THEME_GIT_PROMPT == "off" ]] && return
  52. local GIT_REPO_PATH=$(git rev-parse --git-dir 2>/dev/null)
  53. [[ $GIT_REPO_PATH == "" ]] && return
  54. local GIT_COMMIT_ID=`git rev-parse --short HEAD 2>/dev/null`
  55. local GIT_MODE="%{$fg[magenta]%}"
  56. if [[ -e "$GIT_REPO_PATH/BISECT_LOG" ]]; then
  57. GIT_MODE="$GIT_MODE BISECT"
  58. elif [[ -e "$GIT_REPO_PATH/MERGE_HEAD" ]]; then
  59. GIT_MODE="$GIT_MODE MERGE"
  60. elif [[ -e "$GIT_REPO_PATH/rebase" || -e "$GIT_REPO_PATH/rebase-apply" || -e "$GIT_REPO_PATH/rebase-merge" || -e "$GIT_REPO_PATH/../.dotest" ]]; then
  61. GIT_MODE="$GIT_MODE REBASE"
  62. fi
  63. local GIT_STASH=""
  64. if [[ -e "$GIT_REPO_PATH/refs/stash" ]]; then
  65. GIT_STASH=" %{$fg[red]%}STASH"
  66. fi
  67. get_git_status
  68. echo " $(parse_git_dirty)$ZSH_THEME_GIT_PROMPT_PREFIX$(current_repository):$(current_branch):$GIT_COMMIT_ID$ZSH_THEME_GIT_PROMPT_SUFFIX$GIT_MODE$(git_remote_status)$GIT_STASH$(git_prompt_status)"
  69. }
  70. # Set Up List of Git Status Indicators
  71. #
  72. # This function retrieves a porcelain `git status` for use in other functions,
  73. # `git_prompt_status` and `parse_git_dirty`.
  74. function get_git_status() {
  75. local FLAGS
  76. FLAGS=("--porcelain")
  77. [[ $POST_1_7_2_GIT -gt 0 ]] && FLAGS+="--ignore-submodules=dirty"
  78. [[ $DISABLE_UNTRACKED_FILES_DIRTY == "true" ]] && FLAGS+="--untracked-files=no"
  79. INDEX=$(git status $FLAGS 2> /dev/null)
  80. }
  81. # Git Change Indication (overriding default omz function)
  82. #
  83. # Prints symbol for each change instead of just indicating if change type exists.
  84. # This gives a better visual sense of how much has changed.
  85. #
  86. # As big as it looks, this function's status-string building is
  87. # near-instantaneous. It's just string manipulation after all.
  88. #
  89. # If you find prompt speed slow, it's because of the speed of `git status` in
  90. # any given repo: it's slower than you'd imagine.
  91. function git_prompt_status() {
  92. [[ -z $INDEX ]] && return
  93. local X
  94. local Y
  95. local X_SET=""
  96. local Y_SET=""
  97. local UN_SET=""
  98. local END=""
  99. local COUNT=0
  100. echo $INDEX | while IFS= read LINE; do
  101. ((COUNT+=1))
  102. ((COUNT >= 20)) && END="%{$reset_color%}..." && break
  103. X=$LINE[1]
  104. Y=$LINE[2]
  105. [[ $X$Y == '??' ]] && UN_SET="$UN_SET$ZSH_THEME_GIT_PROMPT_UNTRACKED" && continue
  106. [[ $X == 'U' ]] || [[ $Y == 'U' ]] && UN_SET="$UN_SET$ZSH_THEME_GIT_PROMPT_UNMERGED" && continue
  107. [[ $X$Y == 'DD' ]] || [[ $X$Y == 'AA' ]] && UN_SET="$UN_SET$ZSH_THEME_GIT_PROMPT_UNMERGED" && continue
  108. [[ $Y == 'M' ]] && Y_SET="$Y_SET$ZSH_THEME_GIT_TREE_MODIFIED"
  109. [[ $Y == 'D' ]] && Y_SET="$Y_SET$ZSH_THEME_GIT_TREE_DELETED"
  110. [[ $X == 'M' ]] && X_SET="$X_SET$ZSH_THEME_GIT_INDEX_MODIFIED" && continue
  111. [[ $X == 'A' ]] && X_SET="$X_SET$ZSH_THEME_GIT_INDEX_ADDED" && continue
  112. [[ $X == 'D' ]] && X_SET="$X_SET$ZSH_THEME_GIT_INDEX_DELETED" && continue
  113. [[ $X == 'R' ]] && X_SET="$X_SET$ZSH_THEME_GIT_INDEX_RENAMED" && continue
  114. [[ $X == 'C' ]] && X_SET="$X_SET$ZSH_THEME_GIT_INDEX_COPIED" && continue
  115. done
  116. local STATUS=" %{$FG[070]%}$X_SET%{$FG[124]%}$Y_SET%{$FG[220]%}$UN_SET$END%{$reset_color%}"
  117. echo $STATUS
  118. }
  119. # Read the current repository (override the default omz function)
  120. #
  121. # Check for a name in git remotes, between ':' or '/' and a space.
  122. function current_repository() {
  123. local repo=$(git remote -v | head -1 | sed 's/.*[\/|:]\([^/]*\) .*/\1/')
  124. echo ${repo%.git}
  125. }
  126. # Check if a repo is modified (override the default omz function)
  127. #
  128. # This function is modifed to no longer run `git status`, and to instead rely on
  129. # the output of the single invocation in `get_git_status`. This way, we
  130. # hopefully reduce the time taken to produce a prompt in messy repos.
  131. function parse_git_dirty() {
  132. if [[ -n $INDEX ]]; then
  133. echo "$ZSH_THEME_GIT_PROMPT_DIRTY"
  134. else
  135. echo "$ZSH_THEME_GIT_PROMPT_CLEAN"
  136. fi
  137. }
  138. # Show if a prompt is in vi command mode.
  139. #
  140. # Relies on ZLE widget `zle-keymap-select` in `keybindings.zsh`.
  141. function vi_mode_prompt_info() {
  142. echo "${${KEYMAP/vicmd/$MODE_INDICATOR}/(main|viins)/}"
  143. }