浏览代码

Merge branch 'master' into fabric_task_description

Marc Cornellà 4 年之前
父节点
当前提交
cad48e38bf
共有 100 个文件被更改,包括 4913 次插入901 次删除
  1. 10 0
      .editorconfig
  2. 38 0
      .github/ISSUE_TEMPLATE/bug_report.md
  3. 26 0
      .github/ISSUE_TEMPLATE/feature_request.md
  4. 12 0
      .github/ISSUE_TEMPLATE/support.md
  5. 0 2
      .gitignore
  6. 76 0
      CODE_OF_CONDUCT.md
  7. 125 0
      CONTRIBUTING.md
  8. 1 1
      LICENSE.txt
  9. 118 31
      README.md
  10. 4 0
      custom/themes/example.zsh-theme
  11. 4 4
      lib/clipboard.zsh
  12. 14 30
      lib/compfix.zsh
  13. 4 1
      lib/completion.zsh
  14. 1 0
      lib/correction.zsh
  15. 9 5
      lib/directories.zsh
  16. 11 18
      lib/functions.zsh
  17. 11 37
      lib/git.zsh
  18. 36 20
      lib/history.zsh
  19. 6 13
      lib/misc.zsh
  20. 14 5
      lib/prompt_info_functions.zsh
  21. 1 1
      lib/spectrum.zsh
  22. 2 2
      lib/termsupport.zsh
  23. 31 22
      lib/theme-and-appearance.zsh
  24. 38 30
      oh-my-zsh.sh
  25. 1 1
      plugins/adb/README.md
  26. 19 0
      plugins/adb/_adb
  27. 46 0
      plugins/alias-finder/README.md
  28. 46 0
      plugins/alias-finder/alias-finder.plugin.zsh
  29. 34 0
      plugins/ansible/README.md
  30. 28 0
      plugins/ansible/ansible.plugin.zsh
  31. 12 0
      plugins/ant/README.md
  32. 77 0
      plugins/archlinux/README.md
  33. 128 12
      plugins/archlinux/archlinux.plugin.zsh
  34. 16 4
      plugins/asdf/asdf.plugin.zsh
  35. 14 0
      plugins/autoenv/README.md
  36. 1 1
      plugins/autoenv/autoenv.plugin.zsh
  37. 11 0
      plugins/autojump/README.md
  38. 32 19
      plugins/autojump/autojump.plugin.zsh
  39. 8 0
      plugins/autopep8/README.md
  40. 0 0
      plugins/autopep8/autopep8.plugin.zsh
  41. 38 0
      plugins/aws/README.md
  42. 80 21
      plugins/aws/aws.plugin.zsh
  43. 13 0
      plugins/battery/README.md
  44. 51 2
      plugins/battery/battery.plugin.zsh
  45. 3 3
      plugins/bbedit/README.md
  46. 2 2
      plugins/bgnotify/README.md
  47. 1 1
      plugins/bgnotify/bgnotify.plugin.zsh
  48. 18 0
      plugins/bower/README.md
  49. 21 0
      plugins/brew/README.md
  50. 20 0
      plugins/brew/brew.plugin.zsh
  51. 4 2
      plugins/bundler/README.md
  52. 10 6
      plugins/bundler/bundler.plugin.zsh
  53. 0 13
      plugins/bwana/bwana.plugin.zsh
  54. 9 0
      plugins/cabal/README.md
  55. 15 0
      plugins/cake/README.md
  56. 16 0
      plugins/cakephp3/README.md
  57. 14 0
      plugins/capistrano/README.md
  58. 2 2
      plugins/capistrano/capistrano.plugin.zsh
  59. 11 0
      plugins/cargo/README.md
  60. 407 0
      plugins/cargo/_cargo
  61. 8 4
      plugins/cask/README.md
  62. 35 0
      plugins/catimg/README.md
  63. 2 2
      plugins/catimg/catimg.plugin.zsh
  64. 2 2
      plugins/catimg/catimg.sh
  65. 9 0
      plugins/celery/README.md
  66. 20 0
      plugins/chruby/README.md
  67. 26 4
      plugins/chruby/chruby.plugin.zsh
  68. 0 2
      plugins/chucknorris/LICENSE
  69. 20 0
      plugins/chucknorris/README.md
  70. 2091 454
      plugins/chucknorris/fortunes/chucknorris
  71. 24 0
      plugins/cloudapp/README.md
  72. 6 2
      plugins/cloudapp/cloudapp.plugin.zsh
  73. 58 0
      plugins/cloudfoundry/README.md
  74. 34 0
      plugins/cloudfoundry/cloudfoundry.plugin.zsh
  75. 2 2
      plugins/coffee/_coffee
  76. 48 0
      plugins/colemak/README.md
  77. 15 0
      plugins/colored-man-pages/README.md
  78. 6 2
      plugins/colored-man-pages/colored-man-pages.plugin.zsh
  79. 35 0
      plugins/colorize/README.md
  80. 45 16
      plugins/colorize/colorize.plugin.zsh
  81. 32 0
      plugins/command-not-found/README.md
  82. 8 1
      plugins/command-not-found/command-not-found.plugin.zsh
  83. 121 0
      plugins/common-aliases/README.md
  84. 12 11
      plugins/common-aliases/common-aliases.plugin.zsh
  85. 8 0
      plugins/compleat/README.md
  86. 29 0
      plugins/composer/README.md
  87. 10 2
      plugins/composer/composer.plugin.zsh
  88. 10 0
      plugins/copydir/README.md
  89. 10 0
      plugins/copyfile/README.md
  90. 32 0
      plugins/cp/README.md
  91. 4 14
      plugins/cp/cp.plugin.zsh
  92. 9 0
      plugins/cpanm/README.md
  93. 0 3
      plugins/cpanm/_cpanm
  94. 28 0
      plugins/dash/README.md
  95. 80 0
      plugins/dash/dash.plugin.zsh
  96. 85 0
      plugins/debian/README.md
  97. 57 62
      plugins/debian/debian.plugin.zsh
  98. 78 0
      plugins/dircycle/README.md
  99. 14 7
      plugins/dircycle/dircycle.plugin.zsh
  100. 0 0
      plugins/dirhistory/README.md

+ 10 - 0
.editorconfig

@@ -0,0 +1,10 @@
+root = true
+
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
+
+[*.sh]
+indent_size = 4
+indent_style = tab

+ 38 - 0
.github/ISSUE_TEMPLATE/bug_report.md

@@ -0,0 +1,38 @@
+---
+name: Bug report
+about: Create a report to help us improve
+
+---
+
+<!--
+Fill this out before posting. You can delete irrelevant sections, but
+an issue where no sections have been filled will be deleted without comment.
+-->
+
+**Describe the bug**
+<!-- A clear and concise description of what the bug is. -->
+
+**To Reproduce**
+<!--
+Steps to reproduce the behavior:
+1. Enable plugin '...'
+2. Run command '...', _or_ try to complete command '...', _etc._
+3. See error
+-->
+
+**Expected behavior**
+<!-- A clear and concise description of what you expected to happen. -->
+
+**Screenshots or recordings**
+<!--
+If applicable, add screenshots or record an asciinema session (https://asciinema.org/)
+to help explain your problem.
+-->
+
+**System:**
+ - OS: [e.g. macOS]
+ - Zsh version [e.g. 5.6]
+ - Terminal emulator [e.g. iTerm2]
+
+**Additional context**
+<!-- Add any other context about the problem here. -->

+ 26 - 0
.github/ISSUE_TEMPLATE/feature_request.md

@@ -0,0 +1,26 @@
+---
+name: Feature request
+about: Suggest a feature for Oh My Zsh
+labels: 'Type: feature'
+
+---
+
+<!--
+Fill this out before posting. You can delete irrelevant sections, but
+an issue where no sections have been filled will be deleted without comment.
+-->
+
+**Is your feature request related to a particular plugin or theme? If so, specify it.**
+<!-- The name of the plugin or theme you'd like us to improve. -->
+
+**Is your feature request related to a problem? Please describe.**
+<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
+
+**Describe the solution you'd like**
+<!-- A clear and concise description of what you want to happen. -->
+
+**Describe alternatives you've considered**
+<!-- A clear and concise description of any alternative solutions or features you've considered. -->
+
+**Additional context**
+<!-- Add any other context or screenshots about the feature request here. -->

+ 12 - 0
.github/ISSUE_TEMPLATE/support.md

@@ -0,0 +1,12 @@
+---
+name: Support
+about: Request support for any problem you're having with Oh My Zsh
+labels: 'Type: support'
+
+---
+
+<!--
+1. Look for similar issues already posted (including closed ones)
+2. Include as much relevant information as possible
+3. Try to make sure the issue is due to Oh My Zsh
+-->

+ 0 - 2
.gitignore

@@ -1,7 +1,5 @@
 # custom files
 custom/
-!custom/plugins/example
-!custom/example.zsh
 
 # temp files directories
 cache/

+ 76 - 0
CODE_OF_CONDUCT.md

@@ -0,0 +1,76 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+  advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+  address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+  professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies within all project spaces, and it also applies when
+an individual is representing the project or its community in public spaces.
+Examples of representing a project or community include using an official
+project e-mail address, posting via an official social media account, or acting
+as an appointed representative at an online or offline event. Representation of
+a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at ohmyzsh@planetargon.com. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq

+ 125 - 0
CONTRIBUTING.md

@@ -0,0 +1,125 @@
+# CONTRIBUTING GUIDELINES
+
+Oh-My-Zsh is a community-driven project. Contribution is welcome, encouraged, and appreciated.
+It is also essential for the development of the project.
+
+First, please take a moment to review our [code of conduct](CODE_OF_CONDUCT.md).
+
+These guidelines are an attempt at better addressing the huge amount of pending
+issues and pull requests. Please read them closely.
+
+Foremost, be so kind as to [search](#use-the-search-luke). This ensures any contribution
+you would make is not already covered.
+
+* [Issues](#reporting-issues)
+  * [You have a problem](#you-have-a-problem)
+  * [You have a suggestion](#you-have-a-suggestion)
+* [Pull Requests](#submitting-pull-requests)
+  * [Getting started](#getting-started)
+  * [You have a solution](#you-have-a-solution)
+  * [You have an addition](#you-have-an-addition)
+* [Information sources (_aka_ search)](#use-the-search-luke)
+
+**BONUS:** [Volunteering](#you-have-spare-time-to-volunteer)
+
+## Reporting Issues
+
+### You have a problem
+
+Please be so kind as to [search](#use-the-search-luke) for any open issue already covering
+your problem.
+
+If you find one, comment on it so we can know there are more people experiencing it.
+
+If not, look at the [Troubleshooting](https://github.com/robbyrussell/oh-my-zsh/wiki/Troubleshooting)
+page for instructions on how to gather data to better debug your problem.
+
+Then, you can go ahead and create an issue with as much detail as you can provide.
+It should include the data gathered as indicated above, along with:
+
+1. How to reproduce the problem
+2. What the correct behavior should be
+3. What the actual behavior is
+
+Please copy to anyone relevant (_eg_ plugin maintainers) by mentioning their GitHub handle
+(starting with `@`) in your message.
+
+We will do our very best to help you.
+
+### You have a suggestion
+
+Please be so kind as to [search](#use-the-search-luke) for any open issue already covering
+your suggestion.
+
+If you find one, comment on it so we can know there are more people supporting it.
+
+If not, you can go ahead and create an issue. Please copy to anyone relevant (_eg_ plugin
+maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
+
+## Submitting Pull Requests
+
+### Getting started
+
+You should be familiar with the basics of
+[contributing on GitHub](https://help.github.com/articles/using-pull-requests) and have a fork
+[properly set up](https://github.com/robbyrussell/oh-my-zsh/wiki/Contribution-Technical-Practices).
+
+You MUST always create PRs with _a dedicated branch_ based on the latest upstream tree.
+
+If you create your own PR, please make sure you do it right. Also be so kind as to reference
+any issue that would be solved in the PR description body,
+[for instance](https://help.github.com/articles/closing-issues-via-commit-messages/)
+_"Fixes #XXXX"_ for issue number XXXX.
+
+### You have a solution
+
+Please be so kind as to [search](#use-the-search-luke) for any open issue already covering
+your [problem](#you-have-a-problem), and any pending/merged/rejected PR covering your solution.
+
+If the solution is already reported, try it out and +1 the pull request if the
+solution works ok. On the other hand, if you think your solution is better, post
+it with a reference to the other one so we can have both solutions to compare.
+
+If not, then go ahead and submit a PR. Please copy to anyone relevant (e.g. plugin
+maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
+
+### You have an addition
+
+Please [do not](https://github.com/robbyrussell/oh-my-zsh/wiki/Themes#dont-send-us-your-theme-for-now)
+send themes for now.
+
+Please be so kind as to [search](#use-the-search-luke) for any pending, merged or rejected Pull Requests
+covering or related to what you want to add.
+
+If you find one, try it out and work with the author on a common solution.
+
+If not, then go ahead and submit a PR. Please copy to anyone relevant (_eg_ plugin
+maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
+
+For any extensive change, _eg_ a new plugin, you will have to find testers to +1 your PR.
+
+----
+
+## Use the Search, Luke
+
+_May the Force (of past experiences) be with you_
+
+GitHub offers [many search features](https://help.github.com/articles/searching-github/)
+to help you check whether a similar contribution to yours already exists. Please search
+before making any contribution, it avoids duplicates and eases maintenance. Trust me,
+that works 90% of the time.
+
+You can also take a look at the [FAQ](https://github.com/robbyrussell/oh-my-zsh/wiki/FAQ)
+to be sure your contribution has not already come up.
+
+If all fails, your thing has probably not been reported yet, so you can go ahead
+and [create an issue](#reporting-issues) or [submit a PR](#submitting-pull-requests).
+
+----
+
+### You have spare time to volunteer
+
+Very nice!! :)
+
+Please have a look at the [Volunteer](https://github.com/robbyrussell/oh-my-zsh/wiki/Volunteers)
+page for instructions on where to start and more.

+ 1 - 1
LICENSE.txt

@@ -1,6 +1,6 @@
 The MIT License (MIT)
 
-Copyright (c) 2009-2016 Robby Russell and contributors
+Copyright (c) 2009-2019 Robby Russell and contributors
 See the full list at https://github.com/robbyrussell/oh-my-zsh/contributors
 
 Permission is hereby granted, free of charge, to any person obtaining a copy

文件差异内容过多而无法显示
+ 118 - 31
README.md


+ 4 - 0
custom/themes/example.zsh-theme

@@ -0,0 +1,4 @@
+# Put your custom themes in this folder.
+# Example:
+
+PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% "

+ 4 - 4
lib/clipboard.zsh

@@ -31,13 +31,13 @@ function clipcopy() {
       cat $file > /dev/clipboard
     fi
   else
-    if which xclip &>/dev/null; then
+    if (( $+commands[xclip] )); then
       if [[ -z $file ]]; then
         xclip -in -selection clipboard
       else
         xclip -in -selection clipboard $file
       fi
-    elif which xsel &>/dev/null; then
+    elif (( $+commands[xsel] )); then
       if [[ -z $file ]]; then
         xsel --clipboard --input 
       else
@@ -74,9 +74,9 @@ function clippaste() {
   elif [[ $OSTYPE == cygwin* ]]; then
     cat /dev/clipboard
   else
-    if which xclip &>/dev/null; then
+    if (( $+commands[xclip] )); then
       xclip -out -selection clipboard
-    elif which xsel &>/dev/null; then
+    elif (( $+commands[xsel] )); then
       xsel --clipboard --output
     else
       print "clipcopy: Platform $OSTYPE not supported or xclip/xsel not installed" >&2

+ 14 - 30
lib/compfix.zsh

@@ -2,10 +2,6 @@
 # insecure ownership or permissions) by:
 #
 # * Human-readably notifying the user of these insecurities.
-# * Moving away all existing completion caches to a temporary directory. Since
-#   any of these caches may have been generated from insecure directories, they
-#   are all suspect now. Failing to do so typically causes subsequent compinit()
-#   calls to fail with "command not found: compdef" errors. (That's bad.)
 function handle_completion_insecurities() {
   # List of the absolute paths of all unique insecure directories, split on
   # newline from compaudit()'s output resembling:
@@ -22,39 +18,27 @@ function handle_completion_insecurities() {
   insecure_dirs=( ${(f@):-"$(compaudit 2>/dev/null)"} )
 
   # If no such directories exist, get us out of here.
-  if (( ! ${#insecure_dirs} )); then
-      print "[oh-my-zsh] No insecure completion-dependent directories detected."
-      return
-  fi
+  [[ -z "${insecure_dirs}" ]] && return
 
   # List ownership and permissions of all insecure directories.
   print "[oh-my-zsh] Insecure completion-dependent directories detected:"
   ls -ld "${(@)insecure_dirs}"
-  print "[oh-my-zsh] For safety, completions will be disabled until you manually fix all"
-  print "[oh-my-zsh] insecure directory permissions and ownership and restart oh-my-zsh."
-  print "[oh-my-zsh] See the above list for directories with group or other writability.\n"
 
-  # Locally enable the "NULL_GLOB" option, thus removing unmatched filename
-  # globs from argument lists *AND* printing no warning when doing so. Failing
-  # to do so prints an unreadable warning if no completion caches exist below.
-  setopt local_options null_glob
+  cat <<EOD
 
-  # List of the absolute paths of all unique existing completion caches.
-  local -aU zcompdump_files
-  zcompdump_files=( "${ZSH_COMPDUMP}"(.) "${ZDOTDIR:-${HOME}}"/.zcompdump* )
+[oh-my-zsh] For safety, we will not load completions from these directories until
+[oh-my-zsh] you fix their permissions and ownership and restart zsh.
+[oh-my-zsh] See the above list for directories with group or other writability.
 
-  # Move such caches to a temporary directory.
-  if (( ${#zcompdump_files} )); then
-    # Absolute path of the directory to which such files will be moved.
-    local ZSH_ZCOMPDUMP_BAD_DIR="${ZSH_CACHE_DIR}/zcompdump-bad"
+[oh-my-zsh] To fix your permissions you can do so by disabling
+[oh-my-zsh] the write permission of "group" and "others" and making sure that the
+[oh-my-zsh] owner of these directories is either root or your current user.
+[oh-my-zsh] The following command may help:
+[oh-my-zsh]     compaudit | xargs chmod g-w,o-w
 
-    # List such files first.
-    print "[oh-my-zsh] Insecure completion caches also detected:"
-    ls -l "${(@)zcompdump_files}"
+[oh-my-zsh] If the above didn't help or you want to skip the verification of
+[oh-my-zsh] insecure directories you can set the variable ZSH_DISABLE_COMPFIX to
+[oh-my-zsh] "true" before oh-my-zsh is sourced in your zshrc file.
 
-    # For safety, move rather than permanently remove such files.
-    print "[oh-my-zsh] Moving to \"${ZSH_ZCOMPDUMP_BAD_DIR}/\"...\n"
-    mkdir -p "${ZSH_ZCOMPDUMP_BAD_DIR}"
-    mv "${(@)zcompdump_files}" "${ZSH_ZCOMPDUMP_BAD_DIR}/"
-  fi
+EOD
 }

+ 4 - 1
lib/completion.zsh

@@ -5,7 +5,7 @@ WORDCHARS=''
 
 unsetopt menu_complete   # do not autoselect the first completion entry
 unsetopt flowcontrol
-setopt auto_menu         # show completion menu on succesive tab press
+setopt auto_menu         # show completion menu on successive tab press
 setopt complete_in_word
 setopt always_to_end
 
@@ -25,6 +25,9 @@ else
 fi
 unset CASE_SENSITIVE HYPHEN_INSENSITIVE
 
+# Complete . and .. special directories
+zstyle ':completion:*' special-dirs true
+
 zstyle ':completion:*' list-colors ''
 zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;34=0=01'
 

+ 1 - 0
lib/correction.zsh

@@ -1,4 +1,5 @@
 if [[ "$ENABLE_CORRECTION" == "true" ]]; then
+  alias cp='nocorrect cp'
   alias ebuild='nocorrect ebuild'
   alias gist='nocorrect gist'
   alias heroku='nocorrect heroku'

+ 9 - 5
lib/directories.zsh

@@ -21,14 +21,18 @@ alias 9='cd -9'
 
 alias md='mkdir -p'
 alias rd=rmdir
-alias d='dirs -v | head -10'
+
+function d () {
+  if [[ -n $1 ]]; then
+    dirs "$@"
+  else
+    dirs -v | head -10
+  fi
+}
+compdef _dirs d
 
 # List directory contents
 alias lsa='ls -lah'
 alias l='ls -lah'
 alias ll='ls -lh'
 alias la='ls -lAh'
-
-# Push and pop directories on directory stack
-alias pu='pushd'
-alias po='popd'

+ 11 - 18
lib/functions.zsh

@@ -11,33 +11,27 @@ function upgrade_oh_my_zsh() {
 }
 
 function take() {
-  mkdir -p $1
-  cd $1
+  mkdir -p $@ && cd ${@:$#}
 }
 
 function open_command() {
-  emulate -L zsh
-  setopt shwordsplit
-
   local open_cmd
 
   # define the open command
   case "$OSTYPE" in
     darwin*)  open_cmd='open' ;;
     cygwin*)  open_cmd='cygstart' ;;
-    linux*)   open_cmd='xdg-open' ;;
+    linux*)   [[ "$(uname -r)" != *icrosoft* ]] && open_cmd='nohup xdg-open' || {
+                open_cmd='cmd.exe /c start ""'
+                [[ -e "$1" ]] && { 1="$(wslpath -w "${1:a}")" || return 1 }
+              } ;;
     msys*)    open_cmd='start ""' ;;
     *)        echo "Platform $OSTYPE not supported"
               return 1
               ;;
   esac
 
-  # don't use nohup on OSX
-  if [[ "$OSTYPE" == darwin* ]]; then
-    $open_cmd "$@" &>/dev/null
-  else
-    nohup $open_cmd "$@" &>/dev/null
-  fi
+  ${=open_cmd} "$@" &>/dev/null
 }
 
 #
@@ -52,8 +46,7 @@ function open_command() {
 #    1 if it does not exist
 #
 function alias_value() {
-    alias "$1" | sed "s/^$1='\(.*\)'$/\1/"
-    test $(alias "$1")
+    (( $+aliases[$1] )) && echo $aliases[$1]
 }
 
 #
@@ -81,12 +74,12 @@ function try_alias_value() {
 #    0 if the variable exists, 3 if it was set
 #
 function default() {
-    test `typeset +m "$1"` && return 0
+    (( $+parameters[$1] )) && return 0
     typeset -g "$1"="$2"   && return 3
 }
 
 #
-# Set enviroment variable "$1" to default value "$2" if "$1" is not yet defined.
+# Set environment variable "$1" to default value "$2" if "$1" is not yet defined.
 #
 # Arguments:
 #    1. name - The env variable to set
@@ -95,8 +88,8 @@ function default() {
 #    0 if the env variable exists, 3 if it was set
 #
 function env_default() {
-    env | grep -q "^$1=" && return 0
-    export "$1=$2"       && return 3
+    (( ${${(@f):-$(typeset +xg)}[(I)$1]} )) && return 0
+    export "$1=$2" && return 3
 }
 
 

+ 11 - 37
lib/git.zsh

@@ -10,13 +10,10 @@ function git_prompt_info() {
 
 # Checks if working tree is dirty
 function parse_git_dirty() {
-  local STATUS=''
-  local FLAGS
-  FLAGS=('--porcelain')
+  local STATUS
+  local -a FLAGS
+  FLAGS=('--porcelain' '--ignore-submodules=dirty')
   if [[ "$(command git config --get oh-my-zsh.hide-dirty)" != "1" ]]; then
-    if [[ $POST_1_7_2_GIT -gt 0 ]]; then
-      FLAGS+='--ignore-submodules=dirty'
-    fi
     if [[ "$DISABLE_UNTRACKED_FILES_DIRTY" == "true" ]]; then
       FLAGS+='--untracked-files=no'
     fi
@@ -77,8 +74,8 @@ function git_current_branch() {
 # Gets the number of commits ahead from remote
 function git_commits_ahead() {
   if command git rev-parse --git-dir &>/dev/null; then
-    local commits="$(git rev-list --count @{upstream}..HEAD)"
-    if [[ "$commits" != 0 ]]; then
+    local commits="$(git rev-list --count @{upstream}..HEAD 2>/dev/null)"
+    if [[ -n "$commits" && "$commits" != 0 ]]; then
       echo "$ZSH_THEME_GIT_COMMITS_AHEAD_PREFIX$commits$ZSH_THEME_GIT_COMMITS_AHEAD_SUFFIX"
     fi
   fi
@@ -87,8 +84,8 @@ function git_commits_ahead() {
 # Gets the number of commits behind remote
 function git_commits_behind() {
   if command git rev-parse --git-dir &>/dev/null; then
-    local commits="$(git rev-list --count HEAD..@{upstream})"
-    if [[ "$commits" != 0 ]]; then
+    local commits="$(git rev-list --count HEAD..@{upstream} 2>/dev/null)"
+    if [[ -n "$commits" && "$commits" != 0 ]]; then
       echo "$ZSH_THEME_GIT_COMMITS_BEHIND_PREFIX$commits$ZSH_THEME_GIT_COMMITS_BEHIND_SUFFIX"
     fi
   fi
@@ -141,11 +138,15 @@ function git_prompt_status() {
     STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
   elif $(echo "$INDEX" | grep '^M  ' &> /dev/null); then
     STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
+  elif $(echo "$INDEX" | grep '^MM ' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS"
   fi
   if $(echo "$INDEX" | grep '^ M ' &> /dev/null); then
     STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
   elif $(echo "$INDEX" | grep '^AM ' &> /dev/null); then
     STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
+  elif $(echo "$INDEX" | grep '^MM ' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
   elif $(echo "$INDEX" | grep '^ T ' &> /dev/null); then
     STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS"
   fi
@@ -177,28 +178,6 @@ function git_prompt_status() {
   echo $STATUS
 }
 
-# Compares the provided version of git to the version installed and on path
-# Outputs -1, 0, or 1 if the installed version is less than, equal to, or
-# greater than the input version, respectively.
-function git_compare_version() {
-  local INPUT_GIT_VERSION INSTALLED_GIT_VERSION
-  INPUT_GIT_VERSION=(${(s/./)1})
-  INSTALLED_GIT_VERSION=($(command git --version 2>/dev/null))
-  INSTALLED_GIT_VERSION=(${(s/./)INSTALLED_GIT_VERSION[3]})
-
-  for i in {1..3}; do
-    if [[ $INSTALLED_GIT_VERSION[$i] -gt $INPUT_GIT_VERSION[$i] ]]; then
-      echo 1
-      return 0
-    fi
-    if [[ $INSTALLED_GIT_VERSION[$i] -lt $INPUT_GIT_VERSION[$i] ]]; then
-      echo -1
-      return 0
-    fi
-  done
-  echo 0
-}
-
 # Outputs the name of the current user
 # Usage example: $(git_current_user_name)
 function git_current_user_name() {
@@ -210,8 +189,3 @@ function git_current_user_name() {
 function git_current_user_email() {
   command git config user.email 2>/dev/null
 }
-
-# This is unlikely to change so make it all statically assigned
-POST_1_7_2_GIT=$(git_compare_version "1.7.2")
-# Clean up the namespace slightly by removing the checker function
-unfunction git_compare_version

+ 36 - 20
lib/history.zsh

@@ -1,24 +1,40 @@
-## Command history configuration
-if [ -z "$HISTFILE" ]; then
-    HISTFILE=$HOME/.zsh_history
-fi
+## History wrapper
+function omz_history {
+  local clear list
+  zparseopts -E c=clear l=list
 
-HISTSIZE=10000
-SAVEHIST=10000
+  if [[ -n "$clear" ]]; then
+    # if -c provided, clobber the history file
+    echo -n >| "$HISTFILE"
+    echo >&2 History file deleted. Reload the session to see its effects.
+  elif [[ -n "$list" ]]; then
+    # if -l provided, run as if calling `fc' directly
+    builtin fc "$@"
+  else
+    # unless a number is provided, show all history events (starting from 1)
+    [[ ${@[-1]-} = *[0-9]* ]] && builtin fc -l "$@" || builtin fc -l "$@" 1
+  fi
+}
 
-# Show history
-case $HIST_STAMPS in
-  "mm/dd/yyyy") alias history='fc -fl 1' ;;
-  "dd.mm.yyyy") alias history='fc -El 1' ;;
-  "yyyy-mm-dd") alias history='fc -il 1' ;;
-  *) alias history='fc -l 1' ;;
+# Timestamp format
+case ${HIST_STAMPS-} in
+  "mm/dd/yyyy") alias history='omz_history -f' ;;
+  "dd.mm.yyyy") alias history='omz_history -E' ;;
+  "yyyy-mm-dd") alias history='omz_history -i' ;;
+  "") alias history='omz_history' ;;
+  *) alias history="omz_history -t '$HIST_STAMPS'" ;;
 esac
 
-setopt append_history
-setopt extended_history
-setopt hist_expire_dups_first
-setopt hist_ignore_dups # ignore duplication command history list
-setopt hist_ignore_space
-setopt hist_verify
-setopt inc_append_history
-setopt share_history # share command history data
+## History file configuration
+[ -z "$HISTFILE" ] && HISTFILE="$HOME/.zsh_history"
+HISTSIZE=50000
+SAVEHIST=10000
+
+## History command configuration
+setopt extended_history       # record timestamp of command in HISTFILE
+setopt hist_expire_dups_first # delete duplicates first when HISTFILE size exceeds HISTSIZE
+setopt hist_ignore_dups       # ignore duplicated commands history list
+setopt hist_ignore_space      # ignore commands that start with space
+setopt hist_verify            # show command with history expansion to user before running it
+setopt inc_append_history     # add commands to HISTFILE in order of execution
+setopt share_history          # share command history data

+ 6 - 13
lib/misc.zsh

@@ -1,7 +1,7 @@
-## Load smart urls if available
-# bracketed-paste-magic is known buggy in zsh 5.1.1 (only), so skip it there; see #4434
 autoload -Uz is-at-least
-if [[ $ZSH_VERSION != 5.1.1 ]]; then
+
+# *-magic is known buggy in some versions; disable if so
+if [[ $DISABLE_MAGIC_FUNCTIONS != true ]]; then
   for d in $fpath; do
   	if [[ -e "$d/url-quote-magic" ]]; then
   		if is-at-least 5.1; then
@@ -18,13 +18,11 @@ fi
 ## jobs
 setopt long_list_jobs
 
-## pager
-export PAGER="less"
-export LESS="-R"
+env_default 'PAGER' 'less'
+env_default 'LESS' '-R'
 
 ## super user alias
-alias _='sudo'
-alias please='sudo'
+alias _='sudo '
 
 ## more intelligent acking for ubuntu users
 if which ack-grep &> /dev/null; then
@@ -33,10 +31,5 @@ else
   alias afind='ack -il'
 fi
 
-# only define LC_CTYPE if undefined
-if [[ -z "$LC_CTYPE" && -z "$LC_ALL" ]]; then
-	export LC_CTYPE=${LANG%%:*} # pick the first entry from LANG
-fi
-
 # recognize comments
 setopt interactivecomments

+ 14 - 5
lib/prompt_info_functions.zsh

@@ -10,9 +10,15 @@
 # Dummy implementations that return false to prevent command_not_found
 # errors with themes, that implement these functions
 # Real implementations will be used when the respective plugins are loaded
-function chruby_prompt_info hg_prompt_info pyenv_prompt_info \
-  rbenv_prompt_info svn_prompt_info vi_mode_prompt_info \
-  virtualenv_prompt_info {
+function chruby_prompt_info \
+  rbenv_prompt_info \
+  hg_prompt_info \
+  pyenv_prompt_info \
+  svn_prompt_info \
+  vi_mode_prompt_info \
+  virtualenv_prompt_info \
+  jenv_prompt_info \
+{
   return 1
 }
 
@@ -22,10 +28,13 @@ function rvm_prompt_info() {
   [ -f $HOME/.rvm/bin/rvm-prompt ] || return 1
   local rvm_prompt
   rvm_prompt=$($HOME/.rvm/bin/rvm-prompt ${=ZSH_THEME_RVM_PROMPT_OPTIONS} 2>/dev/null)
-  [[ "${rvm_prompt}x" == "x" ]] && return 1
-  echo "${ZSH_THEME_RVM_PROMPT_PREFIX:=(}${rvm_prompt}${ZSH_THEME_RVM_PROMPT_SUFFIX:=)}"
+  [[ -z "${rvm_prompt}" ]] && return 1
+  echo "${ZSH_THEME_RUBY_PROMPT_PREFIX}${rvm_prompt}${ZSH_THEME_RUBY_PROMPT_SUFFIX}"
 }
 
+ZSH_THEME_RVM_PROMPT_OPTIONS="i v g"
+
+
 # use this to enable users to see their ruby version, no matter which
 # version management system they use
 function ruby_prompt_info() {

+ 1 - 1
lib/spectrum.zsh

@@ -1,7 +1,7 @@
 #! /bin/zsh
 # A script to make using 256 colors in zsh less painful.
 # P.C. Shyamshankar <sykora@lucentbeing.com>
-# Copied from http://github.com/sykora/etc/blob/master/zsh/functions/spectrum/
+# Copied from https://github.com/sykora/etc/blob/master/zsh/functions/spectrum/
 
 typeset -AHg FX FG BG
 

+ 2 - 2
lib/termsupport.zsh

@@ -21,7 +21,7 @@ function title {
       print -Pn "\e]2;$2:q\a" # set window name
       print -Pn "\e]1;$1:q\a" # set tab name
       ;;
-    screen*)
+    screen*|tmux*)
       print -Pn "\ek$1:q\e\\" # set screen hardstatus
       ;;
     *)
@@ -80,7 +80,7 @@ preexec_functions+=(omz_termsupport_preexec)
 
 
 # Keep Apple Terminal.app's current working directory updated
-# Based on this answer: http://superuser.com/a/315029
+# Based on this answer: https://superuser.com/a/315029
 # With extra fixes to handle multibyte chars and non-UTF-8 locales
 
 if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then

+ 31 - 22
lib/theme-and-appearance.zsh

@@ -1,45 +1,54 @@
 # ls colors
 autoload -U colors && colors
-export LSCOLORS="Gxfxcxdxbxegedabagacad"
 
 # Enable ls colors
-if [ "$DISABLE_LS_COLORS" != "true" ]
-then
-  # Find the option for using colors in ls, depending on the version: Linux or BSD
-  if [[ "$(uname -s)" == "NetBSD" ]]; then
+export LSCOLORS="Gxfxcxdxbxegedabagacad"
+
+# TODO organise this chaotic logic
+
+if [[ "$DISABLE_LS_COLORS" != "true" ]]; then
+  # Find the option for using colors in ls, depending on the version
+  if [[ "$OSTYPE" == netbsd* ]]; then
     # On NetBSD, test if "gls" (GNU ls) is installed (this one supports colors);
     # otherwise, leave ls as is, because NetBSD's ls doesn't support -G
-    gls --color -d . &>/dev/null 2>&1 && alias ls='gls --color=tty'
-  elif [[ "$(uname -s)" == "OpenBSD" ]]; then
+    gls --color -d . &>/dev/null && alias ls='gls --color=tty'
+  elif [[ "$OSTYPE" == openbsd* ]]; then
     # On OpenBSD, "gls" (ls from GNU coreutils) and "colorls" (ls from base,
     # with color and multibyte support) are available from ports.  "colorls"
     # will be installed on purpose and can't be pulled in by installing
     # coreutils, so prefer it to "gls".
-    gls --color -d . &>/dev/null 2>&1 && alias ls='gls --color=tty'
-    colorls -G -d . &>/dev/null 2>&1 && alias ls='colorls -G'
+    gls --color -d . &>/dev/null && alias ls='gls --color=tty'
+    colorls -G -d . &>/dev/null && alias ls='colorls -G'
+  elif [[ "$OSTYPE" == (darwin|freebsd)* ]]; then
+    # this is a good alias, it works by default just using $LSCOLORS
+    ls -G . &>/dev/null && alias ls='ls -G'
+
+    # only use coreutils ls if there is a dircolors customization present ($LS_COLORS or .dircolors file)
+    # otherwise, gls will use the default color scheme which is ugly af
+    [[ -n "$LS_COLORS" || -f "$HOME/.dircolors" ]] && gls --color -d . &>/dev/null && alias ls='gls --color=tty'
   else
-    ls --color -d . &>/dev/null 2>&1 && alias ls='ls --color=tty' || alias ls='ls -G'
+    # For GNU ls, we use the default ls color theme. They can later be overwritten by themes.
+    if [[ -z "$LS_COLORS" ]]; then
+      (( $+commands[dircolors] )) && eval "$(dircolors -b)"
+    fi
+
+    ls --color -d . &>/dev/null && alias ls='ls --color=tty' || { ls -G . &>/dev/null && alias ls='ls -G' }
+
+    # Take advantage of $LS_COLORS for completion as well.
+    zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
   fi
 fi
 
 setopt auto_cd
 setopt multios
+setopt prompt_subst
 
-if [[ x$WINDOW != x ]]
-then
-    SCREEN_NO="%B$WINDOW%b "
-else
-    SCREEN_NO=""
-fi
-
-# Apply theming defaults
-PS1="%n@%m:%~%# "
+[[ -n "$WINDOW" ]] && SCREEN_NO="%B$WINDOW%b " || SCREEN_NO=""
 
 # git theming default: Variables for theming the git info prompt
 ZSH_THEME_GIT_PROMPT_PREFIX="git:("         # Prefix at the very beginning of the prompt, before the branch name
 ZSH_THEME_GIT_PROMPT_SUFFIX=")"             # At the very end of the prompt
 ZSH_THEME_GIT_PROMPT_DIRTY="*"              # Text to display if the branch is dirty
 ZSH_THEME_GIT_PROMPT_CLEAN=""               # Text to display if the branch is clean
-
-# Setup the prompt with pretty colors
-setopt prompt_subst
+ZSH_THEME_RUBY_PROMPT_PREFIX="("
+ZSH_THEME_RUBY_PROMPT_SUFFIX=")"

+ 38 - 30
oh-my-zsh.sh

@@ -1,6 +1,17 @@
+# Set ZSH_CACHE_DIR to the path where cache files should be created
+# or else we will use the default cache/
+if [[ -z "$ZSH_CACHE_DIR" ]]; then
+  ZSH_CACHE_DIR="$ZSH/cache"
+fi
+
+# Migrate .zsh-update file to $ZSH_CACHE_DIR
+if [ -f ~/.zsh-update ] && [ ! -f ${ZSH_CACHE_DIR}/.zsh-update ]; then
+    mv ~/.zsh-update ${ZSH_CACHE_DIR}/.zsh-update
+fi
+
 # Check for updates on initial load...
 if [ "$DISABLE_AUTO_UPDATE" != "true" ]; then
-  env ZSH=$ZSH DISABLE_UPDATE_PROMPT=$DISABLE_UPDATE_PROMPT zsh -f $ZSH/tools/check_for_upgrade.sh
+  env ZSH=$ZSH ZSH_CACHE_DIR=$ZSH_CACHE_DIR DISABLE_UPDATE_PROMPT=$DISABLE_UPDATE_PROMPT zsh -f $ZSH/tools/check_for_upgrade.sh
 fi
 
 # Initializes Oh My Zsh
@@ -11,29 +22,12 @@ fpath=($ZSH/functions $ZSH/completions $fpath)
 # Load all stock functions (from $fpath files) called below.
 autoload -U compaudit compinit
 
-: ${ZSH_DISABLE_COMPFIX:=true}
-
 # Set ZSH_CUSTOM to the path where your custom config files
 # and plugins exists, or else we will use the default custom/
 if [[ -z "$ZSH_CUSTOM" ]]; then
     ZSH_CUSTOM="$ZSH/custom"
 fi
 
-# Set ZSH_CACHE_DIR to the path where cache files should be created
-# or else we will use the default cache/
-if [[ -z "$ZSH_CACHE_DIR" ]]; then
-  ZSH_CACHE_DIR="$ZSH/cache"
-fi
-
-
-# Load all of the config files in ~/oh-my-zsh that end in .zsh
-# TIP: Add files you don't want in git to .gitignore
-for config_file ($ZSH/lib/*.zsh); do
-  custom_config_file="${ZSH_CUSTOM}/lib/${config_file:t}"
-  [ -f "${custom_config_file}" ] && config_file=${custom_config_file}
-  source $config_file
-done
-
 
 is_plugin() {
   local base_dir=$1
@@ -41,6 +35,7 @@ is_plugin() {
   test -f $base_dir/plugins/$name/$name.plugin.zsh \
     || test -f $base_dir/plugins/$name/_$name
 }
+
 # Add all defined plugins to fpath. This must be done
 # before running compinit.
 for plugin ($plugins); do
@@ -48,12 +43,14 @@ for plugin ($plugins); do
     fpath=($ZSH_CUSTOM/plugins/$plugin $fpath)
   elif is_plugin $ZSH $plugin; then
     fpath=($ZSH/plugins/$plugin $fpath)
+  else
+    echo "[oh-my-zsh] plugin '$plugin' not found"
   fi
 done
 
 # Figure out the SHORT hostname
 if [[ "$OSTYPE" = darwin* ]]; then
-  # OS X's $HOST changes with dhcp, etc. Use ComputerName if possible.
+  # macOS's $HOST changes with dhcp, etc. Use ComputerName if possible.
   SHORT_HOST=$(scutil --get ComputerName 2>/dev/null) || SHORT_HOST=${HOST/.*/}
 else
   SHORT_HOST=${HOST/.*/}
@@ -65,18 +62,25 @@ if [ -z "$ZSH_COMPDUMP" ]; then
 fi
 
 if [[ $ZSH_DISABLE_COMPFIX != true ]]; then
-  # If completion insecurities exist, warn the user without enabling completions.
-  if ! compaudit &>/dev/null; then
-    # This function resides in the "lib/compfix.zsh" script sourced above.
-    handle_completion_insecurities
-  # Else, enable and cache completions to the desired file.
-  else
-    compinit -d "${ZSH_COMPDUMP}"
-  fi
+  source $ZSH/lib/compfix.zsh
+  # If completion insecurities exist, warn the user
+  handle_completion_insecurities
+  # Load only from secure directories
+  compinit -i -C -d "${ZSH_COMPDUMP}"
 else
-  compinit -i -d "${ZSH_COMPDUMP}"
+  # If the user wants it, load from all found directories
+  compinit -u -C -d "${ZSH_COMPDUMP}"
 fi
 
+
+# Load all of the config files in ~/oh-my-zsh that end in .zsh
+# TIP: Add files you don't want in git to .gitignore
+for config_file ($ZSH/lib/*.zsh); do
+  custom_config_file="${ZSH_CUSTOM}/lib/${config_file:t}"
+  [ -f "${custom_config_file}" ] && config_file=${custom_config_file}
+  source $config_file
+done
+
 # Load all of the plugins that were defined in ~/.zshrc
 for plugin ($plugins); do
   if [ -f $ZSH_CUSTOM/plugins/$plugin/$plugin.plugin.zsh ]; then
@@ -93,8 +97,12 @@ done
 unset config_file
 
 # Load the theme
-if [ "$ZSH_THEME" = "random" ]; then
-  themes=($ZSH/themes/*zsh-theme)
+if [[ "$ZSH_THEME" == "random" ]]; then
+  if [[ "${(t)ZSH_THEME_RANDOM_CANDIDATES}" = "array" ]] && [[ "${#ZSH_THEME_RANDOM_CANDIDATES[@]}" -gt 0 ]]; then
+    themes=($ZSH/themes/${^ZSH_THEME_RANDOM_CANDIDATES}.zsh-theme)
+  else
+    themes=($ZSH/themes/*zsh-theme)
+  fi
   N=${#themes[@]}
   ((N=(RANDOM%N)+1))
   RANDOM_THEME=${themes[$N]}

+ 1 - 1
plugins/adb/README.md

@@ -1,7 +1,7 @@
 # adb autocomplete plugin
 
 * Adds autocomplete options for all adb commands.
-
+* Add autocomplete for `adb -s`
 
 ## Requirements
 

+ 19 - 0
plugins/adb/_adb

@@ -13,9 +13,13 @@ _1st_arguments=(
 'disconnect:disconnect from a TCP/IP device. Port 5555 is default.'
 'emu:run emulator console command'
 'forward:forward socket connections'
+'get-devpath:print the device path'
+'get-serialno:print the serial number of the device'
+'get-state:print the current state of the device: offline | bootloader | device'
 'help:show the help message'
 'install:push this package file to the device and install it'
 'jdwp:list PIDs of processes hosting a JDWP transport'
+'keygen:generate adb public/private key'
 'kill-server:kill the server if it is running'
 'logcat:view device log'
 'pull:copy file/dir from device'
@@ -30,6 +34,7 @@ _1st_arguments=(
 'start-server:ensure that there is a server running'
 'tcpip:restart host adb in tcpip mode'
 'uninstall:remove this app package from the device'
+'usb:restart the adbd daemon listing on USB'
 'version:show version num'
 'wait-for-device:block until device is online'
 )
@@ -38,8 +43,22 @@ local expl
 local -a pkgs installed_pkgs
 
 _arguments \
+	'-s[devices]:specify device:->specify_device' \
 	'*:: :->subcmds' && return 0
 
+case "$state" in
+	specify_device)
+	_values -C 'devices' ${$(adb devices -l|awk 'NR>1&& $1 \
+		{sub(/ +/," ",$0); \
+		gsub(":","\\:",$1); \
+		for(i=1;i<=NF;i++) {
+			if($i ~ /model:/) { split($i,m,":") } \
+			else if($i ~ /product:/) { split($i,p,":") } } \
+		printf "%s[%s(%s)] ",$1, p[2], m[2]}'):-""}
+	return
+	;;
+esac
+
 if (( CURRENT == 1 )); then
 	_describe -t commands "adb subcommand" _1st_arguments
 	return

+ 46 - 0
plugins/alias-finder/README.md

@@ -0,0 +1,46 @@
+# alias-finder plugin
+
+This plugin searches the defined aliases and outputs any that match the command inputted. This makes learning new aliases easier.
+
+To use it, add `alias-finder` to the `plugins` array of your zshrc file:
+```
+plugins=(... alias-finder)
+```
+
+## Usage
+To see if there is an alias defined for the command, pass it as an argument to `alias-finder`. This can also run automatically before each command you input - add `ZSH_ALIAS_FINDER_AUTOMATIC=true` to your zshrc if you want this.
+
+## Options
+
+- Use `--longer` or `-l` to allow the aliases to be longer than the input (match aliases if they contain the input).
+- Use `--exact` or `-e` to avoid matching aliases that are shorter than the input.
+
+## Examples
+```
+$ alias-finder "git pull"
+gl='git pull'
+g=git
+```
+```
+$ alias-finder "web_search google oh my zsh"
+google='web_search google'
+```
+```
+$ alias-finder "git commit -v"
+gc="git commit -v"
+g=git
+```
+```
+$ alias-finder -e "git commit -v"
+gc='git commit -v'
+```
+```
+$ alias-finder -l "git commit -v"
+gc='git commit -v'
+'gc!'='git commit -v --amend'
+gca='git commit -v -a'
+'gca!'='git commit -v -a --amend'
+'gcan!'='git commit -v -a --no-edit --amend'
+'gcans!'='git commit -v -a -s --no-edit --amend'
+'gcn!'='git commit -v --no-edit --amend'
+```

+ 46 - 0
plugins/alias-finder/alias-finder.plugin.zsh

@@ -0,0 +1,46 @@
+alias-finder() {
+  local cmd="" exact="" longer="" wordStart="" wordEnd="" multiWordEnd=""
+  for i in $@; do
+    case $i in
+      -e|--exact) exact=true;;
+      -l|--longer) longer=true;;
+      *) 
+        if [[ -z $cmd ]]; then
+          cmd=$i
+        else
+          cmd="$cmd $i"
+        fi
+        ;;
+    esac
+  done
+  cmd=$(sed 's/[].\|$(){}?+*^[]/\\&/g' <<< $cmd) # adds escaping for grep
+  if [[ $(wc -l <<< $cmd) == 1 ]]; then
+    while [[ $cmd != "" ]]; do
+      if [[ $longer = true ]]; then
+        wordStart="'{0,1}"
+      else
+        wordEnd="$"
+        multiWordEnd="'$"
+      fi
+      if [[ $cmd == *" "* ]]; then
+        local finder="'$cmd$multiWordEnd"
+      else
+        local finder=$wordStart$cmd$wordEnd
+      fi
+      alias | grep -E "=$finder"
+      if [[ $exact = true || $longer = true ]]; then
+        break
+      else
+        cmd=$(sed -E 's/ {0,1}[^ ]*$//' <<< $cmd) # removes last word
+      fi
+    done
+  fi
+}
+
+preexec_alias-finder() {
+  if [[ $ZSH_ALIAS_FINDER_AUTOMATIC = true ]]; then
+    alias-finder $1
+  fi
+}
+
+preexec_functions+=(preexec_alias-finder)

+ 34 - 0
plugins/ansible/README.md

@@ -0,0 +1,34 @@
+# ansible plugin
+
+## Introduction
+
+The `ansible plugin` adds several aliases for useful [ansible](https://docs.ansible.com/ansible/latest/index.html) commands and [aliases](#aliases).
+
+To use it, add `ansible` to the plugins array of your zshrc file:
+
+```
+plugins=(... ansible)
+```
+
+## Aliases
+
+| Command                                    | Description                                                         |
+|:-------------------------------------------|:--------------------------------------------------------------------|
+| `ansible-version` / `aver`                 | Show the version on ansible installed in this host                  |
+| `ansible-role-init <role name>` / `arinit` | Creates the Ansible Role as per Ansible Galaxy standard             |
+| `a`                                        | command `ansible`                                                   |
+| `aconf`                                    | command `ansible-config`                                            |
+| `acon`                                     | command `ansible-console`                                           |
+| `ainv`                                     | command `ansible-inventory`                                         |
+| `aplaybook`                                | command `ansible-playbook`                                          |
+| `ainv`                                     | command `ansible-inventory`                                         |
+| `adoc`                                     | command `ansible-doc`                                               |
+| `agal`                                     | command `ansible-galaxy`                                            |
+| `apull`                                    | command `ansible-pull`                                              |
+| `aval`                                     | command `ansible-vault`                                             |
+
+## Maintainer
+
+### [Deepankumar](https://github.com/deepan10) 
+
+[https://github.com/deepan10/oh-my-zsh/tree/features/ansible-plugin](https://github.com/deepan10/oh-my-zsh/tree/features/ansible-plugin)

+ 28 - 0
plugins/ansible/ansible.plugin.zsh

@@ -0,0 +1,28 @@
+# Functions
+function ansible-version(){
+    ansible --version
+}
+
+function ansible-role-init(){
+    if ! [ -z $1] ; then
+        echo "Ansible Role : $1 Creating...."
+        ansible-galaxy init $1
+        tree $1
+    else
+        echo "Usage : ansible-role-init <role name>"
+        echo "Example : ansible-role-init role1"
+    fi
+}
+
+# Alias
+alias a='ansible '
+alias aconf='ansible-config '
+alias acon='ansible-console '
+alias aver='ansible-version'
+alias arinit='ansible-role-init'
+alias aplaybook='ansible-playbook '
+alias ainv='ansible-inventory '
+alias adoc='ansible-doc '
+alias agal='ansible-galaxy '
+alias apull='ansible-pull '
+alias aval='ansible-vault'

+ 12 - 0
plugins/ant/README.md

@@ -0,0 +1,12 @@
+# Ant
+
+This plugin provides completion for [Ant](https://ant.apache.org/).
+
+To use it add ant to the plugins array in your zshrc file.
+
+```bash
+plugins=(... ant)
+```
+
+It caches ant targets in a file named `.ant_targets`, you might want to add that to
+your `.gitignore` file.

+ 77 - 0
plugins/archlinux/README.md

@@ -2,6 +2,51 @@
 
 ## Features
 
+#### YAY
+
+| Alias   | Command                            | Description                                                         |
+|---------|------------------------------------|---------------------------------------------------------------------|
+| yaconf  | yay -Pg                            | Print current configuration                                         |
+| yain    | yay -S                             | Install packages from the repositories                              |
+| yains   | yay -U                             | Install a package from a local file                                 |
+| yainsd  | yay -S --asdeps                    | Install packages as dependencies of another package                 |
+| yaloc   | yay -Qi                            | Display information about a package in the local database           |
+| yalocs  | yay -Qs                            | Search for packages in the local database                           |
+| yalst   | yay -Qe                            | List installed packages including from AUR (tagged as "local")      |
+| yamir   | yay -Syy                           | Force refresh of all package lists after updating mirrorlist        |
+| yaorph  | yay -Qtd                           | Remove orphans using yay                                            |
+| yare    | yay -R                             | Remove packages, keeping its settings and dependencies              |
+| yarem   | yay -Rns                           | Remove packages, including its settings and unneeded dependencies   |
+| yarep   | yay -Si                            | Display information about a package in the repositories             |
+| yareps  | yay -Ss                            | Search for packages in the repositories                             |
+| yaupg   | yay -Syu                           | Sync with repositories before upgrading packages                    |
+| yasu    | yay -Syu --no-confirm              | Same as `yaupg`, but without confirmation                           |
+
+#### TRIZEN
+
+| Alias   | Command                            | Description                                                         |
+|---------|------------------------------------|---------------------------------------------------------------------|
+| trconf  | trizen -C                          | Fix all configuration files with vimdiff                            |
+| trin    | trizen -S                          | Install packages from the repositories                              |
+| trins   | trizen -U                          | Install a package from a local file                                 |
+| trinsd  | trizen -S --asdeps                 | Install packages as dependencies of another package                 |
+| trloc   | trizen -Qi                         | Display information about a package in the local database           |
+| trlocs  | trizen -Qs                         | Search for packages in the local database                           |
+| trlst   | trizen -Qe                         | List installed packages including from AUR (tagged as "local")      |
+| trmir   | trizen -Syy                        | Force refresh of all package lists after updating mirrorlist        |
+| trorph  | trizen -Qtd                        | Remove orphans using yaourt                                         |
+| trre    | trizen -R                          | Remove packages, keeping its settings and dependencies              |
+| trrem   | trizen -Rns                        | Remove packages, including its settings and unneeded dependencies   |
+| trrep   | trizen -Si                         | Display information about a package in the repositories             |
+| trreps  | trizen -Ss                         | Search for packages in the repositories                             |
+| trupd   | trizen -Sy && sudo abs && sudo aur | Update and refresh local package, ABS and AUR databases             |
+| trupd   | trizen -Sy && sudo abs             | Update and refresh the local package and ABS databases              |
+| trupd   | trizen -Sy && sudo aur             | Update and refresh the local package and AUR databases              |
+| trupd   | trizen -Sy                         | Update and refresh the local package database                       |
+| trupg   | trizen -Syua                       | Sync with repositories before upgrading all packages (from AUR too) |
+| trsu    | trizen -Syua --no-confirm          | Same as `trupg`, but without confirmation                           |
+| upgrade | trizen -Syu                        | Sync with repositories before upgrading packages                    |
+
 #### YAOURT
 
 | Alias   | Command                            | Description                                                         |
@@ -27,6 +72,30 @@
 | yasu    | yaourt -Syua --no-confirm          | Same as `yaupg`, but without confirmation                           |
 | upgrade | yaourt -Syu                        | Sync with repositories before upgrading packages                    |
 
+#### PACAUR
+
+| Alias   | Command                            | Description                                                         |
+|---------|------------------------------------|---------------------------------------------------------------------|
+| pain    | pacaur -S                          | Install packages from the repositories                              |
+| pains   | pacaur -U                          | Install a package from a local file                                 |
+| painsd  | pacaur -S --asdeps                 | Install packages as dependencies of another package                 |
+| paloc   | pacaur -Qi                         | Display information about a package in the local database           |
+| palocs  | pacaur -Qs                         | Search for packages in the local database                           |
+| palst   | pacaur -Qe                         | List installed packages including from AUR (tagged as "local")      |
+| pamir   | pacaur -Syy                        | Force refresh of all package lists after updating mirrorlist        |
+| paorph  | pacaur -Qtd                        | Remove orphans using pacaur                                         |
+| pare    | pacaur -R                          | Remove packages, keeping its settings and dependencies              |
+| parem   | pacaur -Rns                        | Remove packages, including its settings and unneeded dependencies   |
+| parep   | pacaur -Si                         | Display information about a package in the repositories             |
+| pareps  | pacaur -Ss                         | Search for packages in the repositories                             |
+| paupd   | pacaur -Sy && sudo abs && sudo aur | Update and refresh local package, ABS and AUR databases             |
+| paupd   | pacaur -Sy && sudo abs             | Update and refresh the local package and ABS databases              |
+| paupd   | pacaur -Sy && sudo aur             | Update and refresh the local package and AUR databases              |
+| paupd   | pacaur -Sy                         | Update and refresh the local package database                       |
+| paupg   | pacaur -Syua                       | Sync with repositories before upgrading all packages (from AUR too) |
+| pasu    | pacaur -Syua --no-confirm          | Same as `paupg`, but without confirmation                           |
+| upgrade | pacaur -Syu                        | Sync with repositories before upgrading packages                    |
+
 #### PACMAN
 
 | Alias        | Command                                 | Description                                                  |
@@ -49,6 +118,10 @@
 | pacupd       | sudo pacman -Sy                         | Update and refresh the local package database                |
 | pacupg       | sudo pacman -Syu                        | Sync with repositories before upgrading packages             |
 | upgrade      | sudo pacman -Syu                        | Sync with repositories before upgrading packages             |
+| pacfileupg   | sudo pacman -Fy                         | Download fresh package databases from the server             |
+| pacfiles     | pacman -Fs                              | Search package file names for matching strings               |
+| pacls        | pacman -Ql                              | List files in a package                                      |
+| pacown       | pacman -Qo                              | Show which package owns a file                               |
 
 | Function       | Description                                          |
 |----------------|------------------------------------------------------|
@@ -56,6 +129,7 @@
 | paclist        | List all installed packages with a short description |
 | pacmanallkeys  | Get all keys for developers and trusted users        |
 | pacmansignkeys | Locally trust all keys passed as parameters          |
+| pacweb         | Open the website of an ArchLinux package             |
 
 ---
 
@@ -67,3 +141,6 @@
 - Martin Putniorz - mputniorz@gmail.com
 - MatthR3D - matthr3d@gmail.com
 - ornicar - thibault.duplessis@gmail.com
+- Juraj Fiala - doctorjellyface@riseup.net
+- Majora320 (Moses Miller) - Majora320@gmail.com
+- Ybalrid (Arthur Brainville) - ybalrid@ybalrid.info

+ 128 - 12
plugins/archlinux/archlinux.plugin.zsh

@@ -1,12 +1,33 @@
-if ! (( $+commands[yaourt] )); then
-  upgrade() {
-    sudo pacman -Syu
-  }
-else
-  upgrade () {
-    yaourt -Syu
-  }
+if (( $+commands[trizen] )); then
+  alias trconf='trizen -C'
+  alias trupg='trizen -Syua'
+  alias trsu='trizen -Syua --noconfirm'
+  alias trin='trizen -S'
+  alias trins='trizen -U'
+  alias trre='trizen -R'
+  alias trrem='trizen -Rns'
+  alias trrep='trizen -Si'
+  alias trreps='trizen -Ss'
+  alias trloc='trizen -Qi'
+  alias trlocs='trizen -Qs'
+  alias trlst='trizen -Qe'
+  alias trorph='trizen -Qtd'
+  alias trinsd='trizen -S --asdeps'
+  alias trmir='trizen -Syy'
+
+
+  if (( $+commands[abs] && $+commands[aur] )); then
+    alias trupd='trizen -Sy && sudo abs && sudo aur'
+  elif (( $+commands[abs] )); then
+    alias trupd='trizen -Sy && sudo abs'
+  elif (( $+commands[aur] )); then
+    alias trupd='trizen -Sy && sudo aur'
+  else
+    alias trupd='trizen -Sy'
+  fi
+fi
 
+if (( $+commands[yaourt] )); then
   alias yaconf='yaourt -C'
   alias yaupg='yaourt -Syua'
   alias yasu='yaourt -Syua --noconfirm'
@@ -35,6 +56,84 @@ else
   fi
 fi
 
+if (( $+commands[yay] )); then
+  alias yaconf='yay -Pg'
+  alias yaupg='yay -Syu'
+  alias yasu='yay -Syu --noconfirm'
+  alias yain='yay -S'
+  alias yains='yay -U'
+  alias yare='yay -R'
+  alias yarem='yay -Rns'
+  alias yarep='yay -Si'
+  alias yareps='yay -Ss'
+  alias yaloc='yay -Qi'
+  alias yalocs='yay -Qs'
+  alias yalst='yay -Qe'
+  alias yaorph='yay -Qtd'
+  alias yainsd='yay -S --asdeps'
+  alias yamir='yay -Syy'
+
+
+  if (( $+commands[abs] && $+commands[aur] )); then
+    alias yaupd='yay -Sy && sudo abs && sudo aur'
+  elif (( $+commands[abs] )); then
+    alias yaupd='yay -Sy && sudo abs'
+  elif (( $+commands[aur] )); then
+    alias yaupd='yay -Sy && sudo aur'
+  else
+    alias yaupd='yay -Sy'
+  fi
+fi
+
+if (( $+commands[pacaur] )); then
+  alias paupg='pacaur -Syu'
+  alias pasu='pacaur -Syu --noconfirm'
+  alias pain='pacaur -S'
+  alias pains='pacaur -U'
+  alias pare='pacaur -R'
+  alias parem='pacaur -Rns'
+  alias parep='pacaur -Si'
+  alias pareps='pacaur -Ss'
+  alias paloc='pacaur -Qi'
+  alias palocs='pacaur -Qs'
+  alias palst='pacaur -Qe'
+  alias paorph='pacaur -Qtd'
+  alias painsd='pacaur -S --asdeps'
+  alias pamir='pacaur -Syy'
+
+  if (( $+commands[abs] && $+commands[aur] )); then
+    alias paupd='pacaur -Sy && sudo abs && sudo aur'
+  elif (( $+commands[abs] )); then
+    alias paupd='pacaur -Sy && sudo abs'
+  elif (( $+commands[aur] )); then
+    alias paupd='pacaur -Sy && sudo aur'
+  else
+    alias paupd='pacaur -Sy'
+  fi
+fi
+
+if (( $+commands[trizen] )); then
+  function upgrade() {
+    trizen -Syu
+  }
+elif (( $+commands[pacaur] )); then
+  function upgrade() {
+    pacaur -Syu
+  }
+elif (( $+commands[yaourt] )); then
+  function upgrade() {
+    yaourt -Syu
+  }
+elif (( $+commands[yay] )); then
+  function upgrade() {
+    yay -Syu
+  }
+else
+  function upgrade() {
+    sudo pacman -Syu
+  }
+fi
+
 # Pacman - https://wiki.archlinux.org/index.php/Pacman_Tips
 alias pacupg='sudo pacman -Syu'
 alias pacin='sudo pacman -S'
@@ -49,6 +148,10 @@ alias pacinsd='sudo pacman -S --asdeps'
 alias pacmir='sudo pacman -Syy'
 alias paclsorphans='sudo pacman -Qdt'
 alias pacrmorphans='sudo pacman -Rs $(pacman -Qtdq)'
+alias pacfileupg='sudo pacman -Fy'
+alias pacfiles='pacman -Fs'
+alias pacls='pacman -Ql'
+alias pacown='pacman -Qo'
 
 
 if (( $+commands[abs] && $+commands[aur] )); then
@@ -61,13 +164,13 @@ else
   alias pacupd='sudo pacman -Sy'
 fi
 
-paclist() {
+function paclist() {
   # Source: https://bbs.archlinux.org/viewtopic.php?id=93683
   LC_ALL=C pacman -Qei $(pacman -Qu | cut -d " " -f 1) | \
     awk 'BEGIN {FS=":"} /^Name/{printf("\033[1;36m%s\033[1;37m", $2)} /^Description/{print $2}'
 }
 
-pacdisowned() {
+function pacdisowned() {
   emulate -L zsh
 
   tmp=${TMPDIR-/tmp}/pacman-disowned-$UID-$$
@@ -85,14 +188,14 @@ pacdisowned() {
   comm -23 "$fs" "$db"
 }
 
-pacmanallkeys() {
+function pacmanallkeys() {
   emulate -L zsh
   curl -s https://www.archlinux.org/people/{developers,trustedusers}/ | \
     awk -F\" '(/pgp.mit.edu/) { sub(/.*search=0x/,""); print $1}' | \
     xargs sudo pacman-key --recv-keys
 }
 
-pacmansignkeys() {
+function pacmansignkeys() {
   emulate -L zsh
   for key in $*; do
     sudo pacman-key --recv-keys $key
@@ -101,3 +204,16 @@ pacmansignkeys() {
       --no-permission-warning --command-fd 0 --edit-key $key
   done
 }
+
+if (( $+commands[xdg-open] )); then
+  function pacweb() {
+    pkg="$1"
+    infos="$(pacman -Si "$pkg")"
+    if [[ -z "$infos" ]]; then
+      return
+    fi
+    repo="$(grep '^Repo' <<< "$infos" | grep -oP '[^ ]+$')"
+    arch="$(grep '^Arch' <<< "$infos" | grep -oP '[^ ]+$')"
+    xdg-open "https://www.archlinux.org/packages/$repo/$arch/$pkg/" &>/dev/null
+  }
+fi

+ 16 - 4
plugins/asdf/asdf.plugin.zsh

@@ -1,7 +1,19 @@
-# Find where asdf should be installed.
+# Find where asdf should be installed
 ASDF_DIR="${ASDF_DIR:-$HOME/.asdf}"
+ASDF_COMPLETIONS="$ASDF_DIR/completions"
 
-# Load asdf, if found.
-if [ -f $ASDF_DIR/asdf.sh ]; then
-    . $ASDF_DIR/asdf.sh
+# If not found, check for Homebrew package
+if [[ ! -f "$ASDF_DIR/asdf.sh" ]] && (( $+commands[brew] )); then
+   ASDF_DIR="$(brew --prefix asdf)"
+   ASDF_COMPLETIONS="$ASDF_DIR/etc/bash_completion.d"
+fi
+
+# Load command
+if [[ -f "$ASDF_DIR/asdf.sh" ]]; then
+    . "$ASDF_DIR/asdf.sh"
+
+    # Load completions
+    if [[ -f "$ASDF_COMPLETIONS/asdf.bash" ]]; then
+        . "$ASDF_COMPLETIONS/asdf.bash"
+    fi
 fi

+ 14 - 0
plugins/autoenv/README.md

@@ -0,0 +1,14 @@
+# Autoenv plugin
+
+This plugin loads the [Autoenv](https://github.com/inishchith/autoenv).
+
+To use it, add `autoenv` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... autoenv)
+```
+## Requirements
+
+In order to make this work, you will need to have the autoenv installed.
+
+More info on the usage and install: https://github.com/inishchith/autoenv

+ 1 - 1
plugins/autoenv/autoenv.plugin.zsh

@@ -1,7 +1,7 @@
 # Activates autoenv or reports its failure
 () {
 if ! type autoenv_init >/dev/null; then
-  for d (~/.autoenv /usr/local/opt/autoenv); do
+  for d (~/.autoenv ~/.local/bin /usr/local/opt/autoenv /usr/local/bin); do
     if [[ -e $d/activate.sh ]]; then
       autoenv_dir=$d
       break

+ 11 - 0
plugins/autojump/README.md

@@ -0,0 +1,11 @@
+# Autojump plugin
+
+This plugin loads the [autojump navigation tool](https://github.com/wting/autojump).
+
+To use it, add `autojump` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... autojump)
+```
+
+More info on the usage: https://github.com/wting/autojump

+ 32 - 19
plugins/autojump/autojump.plugin.zsh

@@ -1,21 +1,34 @@
-if [ $commands[autojump] ]; then # check if autojump is installed
-  if [ -f $HOME/.autojump/etc/profile.d/autojump.zsh ]; then # manual user-local installation
-    . $HOME/.autojump/etc/profile.d/autojump.zsh
-  elif [ -f $HOME/.autojump/share/autojump/autojump.zsh ]; then # another manual user-local installation
-    . $HOME/.autojump/share/autojump/autojump.zsh
-  elif [ -f $HOME/.nix-profile/etc/profile.d/autojump.zsh ]; then # nix installation
-    . $HOME/.nix-profile/etc/profile.d/autojump.zsh
-  elif [ -f /usr/share/autojump/autojump.zsh ]; then # debian and ubuntu package
-    . /usr/share/autojump/autojump.zsh
-  elif [ -f /etc/profile.d/autojump.zsh ]; then # manual installation
-    . /etc/profile.d/autojump.zsh
-  elif [ -f /etc/profile.d/autojump.sh ]; then # gentoo installation
-    . /etc/profile.d/autojump.sh
-  elif [ -f /usr/local/share/autojump/autojump.zsh ]; then # freebsd installation
-    . /usr/local/share/autojump/autojump.zsh
-  elif [ -f /opt/local/etc/profile.d/autojump.zsh ]; then # mac os x with ports
-    . /opt/local/etc/profile.d/autojump.zsh
-  elif [ $commands[brew] -a -f `brew --prefix`/etc/autojump.sh ]; then # mac os x with brew
-    . `brew --prefix`/etc/autojump.sh
+declare -a autojump_paths
+autojump_paths=(
+  $HOME/.autojump/etc/profile.d/autojump.zsh         # manual installation
+  $HOME/.autojump/share/autojump/autojump.zsh        # manual installation
+  $HOME/.nix-profile/etc/profile.d/autojump.sh       # NixOS installation
+  /run/current-system/sw/share/autojump/autojump.zsh # NixOS installation
+  /usr/share/autojump/autojump.zsh                   # Debian and Ubuntu package
+  /etc/profile.d/autojump.zsh                        # manual installation
+  /etc/profile.d/autojump.sh                         # Gentoo installation
+  /usr/local/share/autojump/autojump.zsh             # FreeBSD installation
+  /opt/local/etc/profile.d/autojump.sh               # macOS with MacPorts
+  /usr/local/etc/profile.d/autojump.sh               # macOS with Homebrew (default)
+)
+
+for file in $autojump_paths; do
+  if [[ -f "$file" ]]; then
+    source "$file"
+    found=1
+    break
+  fi
+done
+
+# if no path found, try Homebrew
+if (( ! found && $+commands[brew] )); then
+  file=$(brew --prefix)/etc/profile.d/autojump.sh
+  if [[ -f "$file" ]]; then
+    source "$file"
+    found=1
   fi
 fi
+
+(( ! found )) && echo '[oh-my-zsh] autojump script not found'
+
+unset autojump_paths file found

+ 8 - 0
plugins/autopep8/README.md

@@ -0,0 +1,8 @@
+# autopep8 plugin
+
+This plugin adds completion for [autopep8](https://pypi.org/project/autopep8/), a tool that automatically formats Python code to conform to the [PEP 8](http://www.python.org/dev/peps/pep-0008/) style guide.
+
+To use it, add autopep8 to the plugins array of your zshrc file:
+```
+plugins=(... autopep8)
+```

+ 0 - 0
plugins/autopep8/autopep8.plugin.zsh


+ 38 - 0
plugins/aws/README.md

@@ -0,0 +1,38 @@
+# aws
+
+This plugin provides completion support for [awscli](https://docs.aws.amazon.com/cli/latest/reference/index.html)
+and a few utilities to manage AWS profiles and display them in the prompt.
+
+To use it, add `aws` to the plugins array in your zshrc file.
+
+```zsh
+plugins=(... aws)
+```
+
+## Plugin commands
+
+* `asp [<profile>]`: sets `$AWS_PROFILE` and `$AWS_DEFAULT_PROFILE` (legacy) to `<profile>`.
+  It also sets `$AWS_EB_PROFILE` to `<profile>` for the Elastic Beanstalk CLI.
+  Run `asp` without arguments to clear the profile.
+
+* `agp`: gets the current value of `$AWS_PROFILE`.
+
+* `aws_change_access_key`: changes the AWS access key of a profile.
+
+* `aws_profiles`: lists the available profiles in the  `$AWS_CONFIG_FILE` (default: `~/.aws/config`).
+  Used to provide completion for the `asp` function.
+
+## Plugin options
+
+* Set `SHOW_AWS_PROMPT=false` in your zshrc file if you want to prevent the plugin from modifying your RPROMPT.
+  Some themes might overwrite the value of RPROMPT instead of appending to it, so they'll need to be fixed to
+  see the AWS profile prompt.
+
+## Theme
+
+The plugin creates an `aws_prompt_info` function that you can use in your theme, which displays
+the current `$AWS_PROFILE`. It uses two variables to control how that is shown:
+
+- ZSH_THEME_AWS_PREFIX: sets the prefix of the AWS_PROFILE. Defaults to `<aws:`.
+
+- ZSH_THEME_AWS_SUFFIX: sets the suffix of the AWS_PROFILE. Defaults to `>`.

+ 80 - 21
plugins/aws/aws.plugin.zsh

@@ -1,37 +1,96 @@
-_homebrew-installed() {
-  type brew &> /dev/null
+function agp() {
+  echo $AWS_PROFILE
 }
 
-_awscli-homebrew-installed() {
-  brew list awscli &> /dev/null
+# AWS profile selection
+function asp() {
+  if [[ -z "$1" ]]; then
+    unset AWS_DEFAULT_PROFILE AWS_PROFILE AWS_EB_PROFILE
+    echo AWS profile cleared.
+    return
+  fi
+
+  local available_profiles=($(aws_profiles))
+  if [[ -z "${available_profiles[(r)$1]}" ]]; then
+    echo "${fg[red]}Profile '$1' not found in '${AWS_CONFIG_FILE:-$HOME/.aws/config}'" >&2
+    echo "Available profiles: ${(j:, :)available_profiles:-no profiles found}${reset_color}" >&2
+    return 1
+  fi
+
+  export AWS_DEFAULT_PROFILE=$1
+  export AWS_PROFILE=$1
+  export AWS_EB_PROFILE=$1
 }
 
-export AWS_HOME=~/.aws
+function aws_change_access_key() {
+  if [[ -z "$1" ]]; then
+    echo "usage: $0 <profile>"
+    return 1
+  fi
 
-function agp {
-  echo $AWS_DEFAULT_PROFILE
+  echo Insert the credentials when asked.
+  asp "$1" || return 1
+  aws iam create-access-key
+  aws configure --profile "$1"
+
+  echo You can now safely delete the old access key running \`aws iam delete-access-key --access-key-id ID\`
+  echo Your current keys are:
+  aws iam list-access-keys
 }
 
-function asp {
-  local rprompt=${RPROMPT/<aws:$(agp)>/}
+function aws_profiles() {
+  [[ -r "${AWS_CONFIG_FILE:-$HOME/.aws/config}" ]] || return 1
+  grep '\[profile' "${AWS_CONFIG_FILE:-$HOME/.aws/config}"|sed -e 's/.*profile \([a-zA-Z0-9_\.-]*\).*/\1/'
+}
 
-  export AWS_DEFAULT_PROFILE=$1
-  export AWS_PROFILE=$1
+function _aws_profiles() {
+  reply=($(aws_profiles))
+}
+compctl -K _aws_profiles asp aws_change_access_key
 
-  export RPROMPT="<aws:$AWS_DEFAULT_PROFILE>$rprompt"
+# AWS prompt
+function aws_prompt_info() {
+  [[ -z $AWS_PROFILE ]] && return
+  echo "${ZSH_THEME_AWS_PREFIX:=<aws:}${AWS_PROFILE}${ZSH_THEME_AWS_SUFFIX:=>}"
 }
 
-function aws_profiles {
-  reply=($(grep profile $AWS_HOME/config|sed -e 's/.*profile \([a-zA-Z0-9_-]*\).*/\1/'))
+if [ "$SHOW_AWS_PROMPT" != false ]; then
+  RPROMPT='$(aws_prompt_info)'"$RPROMPT"
+fi
+
+
+# Load awscli completions
+
+function _awscli-homebrew-installed() {
+  # check if Homebrew is installed
+  (( $+commands[brew] )) || return 1
+
+  # speculatively check default brew prefix
+  if [ -h /usr/local/opt/awscli ]; then
+    _brew_prefix=/usr/local/opt/awscli
+  else
+    # ok, it is not in the default prefix
+    # this call to brew is expensive (about 400 ms), so at least let's make it only once
+    _brew_prefix=$(brew --prefix awscli)
+  fi
 }
 
-compctl -K aws_profiles asp
+# get aws_zsh_completer.sh location from $PATH
+_aws_zsh_completer_path="$commands[aws_zsh_completer.sh]"
 
-if _homebrew-installed && _awscli-homebrew-installed ; then
-  _aws_zsh_completer_path=$(brew --prefix awscli)/libexec/bin/aws_zsh_completer.sh
-else
-  _aws_zsh_completer_path=$(which aws_zsh_completer.sh)
+# otherwise check common locations
+if [[ -z $_aws_zsh_completer_path ]]; then
+  # Homebrew
+  if _awscli-homebrew-installed; then
+    _aws_zsh_completer_path=$_brew_prefix/libexec/bin/aws_zsh_completer.sh
+  # Ubuntu
+  elif [[ -e /usr/share/zsh/vendor-completions/_awscli ]]; then
+    _aws_zsh_completer_path=/usr/share/zsh/vendor-completions/_awscli
+  # RPM
+  else
+    _aws_zsh_completer_path=/usr/share/zsh/site-functions/aws_zsh_completer.sh
+  fi
 fi
 
-[ -x $_aws_zsh_completer_path ] && source $_aws_zsh_completer_path
-unset _aws_zsh_completer_path
+[[ -r $_aws_zsh_completer_path ]] && source $_aws_zsh_completer_path
+unset _aws_zsh_completer_path _brew_prefix

+ 13 - 0
plugins/battery/README.md

@@ -0,0 +1,13 @@
+# Battery Plugin
+
+This plugin adds some functions you can use to display battery information in your custom theme.
+
+To use, add `battery` to the list of plugins in your `.zshrc` file:
+
+`plugins=(... battery)`
+
+Then, add the `battery_pct_prompt` function to your custom theme. For example:
+
+```
+RPROMPT='$(battery_pct_prompt)'
+```

+ 51 - 2
plugins/battery/battery.plugin.zsh

@@ -7,6 +7,9 @@
 # Email: neuralsandwich@gmail.com         #
 # Modified to add support for Apple Mac   #
 ###########################################
+# Author: J (927589452)                   #
+# Modified to add support for FreeBSD     #
+###########################################
 
 if [[ "$OSTYPE" = darwin* ]] ; then
 
@@ -64,7 +67,53 @@ if [[ "$OSTYPE" = darwin* ]] ; then
     [[ $(ioreg -rc "AppleSmartBattery"| grep '^.*"IsCharging"\ =\ ' | sed -e 's/^.*"IsCharging"\ =\ //') == "Yes" ]]
   }
 
-elif [[ $(uname) == "Linux"  ]] ; then
+elif [[ "$OSTYPE" = freebsd*  ]] ; then
+
+  function battery_is_charging() {
+    [[ $(sysctl -n hw.acpi.battery.state) -eq 2 ]]
+  }
+
+  function battery_pct() {
+    if (( $+commands[sysctl] )) ; then
+      echo "$(sysctl -n hw.acpi.battery.life)"
+    fi
+  }
+
+  function battery_pct_remaining() {
+    if [ ! $(battery_is_charging) ] ; then
+      battery_pct
+    else
+      echo "External Power"
+    fi
+  }
+
+  function battery_time_remaining() {
+    remaining_time=$(sysctl -n hw.acpi.battery.time)
+    if [[ $remaining_time -ge 0 ]] ; then
+      # calculation from https://www.unix.com/shell-programming-and-scripting/23695-convert-minutes-hours-minutes-seconds.html
+      ((hour=$remaining_time/60))
+      ((minute=$remaining_time-$hour*60))
+      echo $hour:$minute
+    fi
+  }
+
+  function battery_pct_prompt() {
+    b=$(battery_pct_remaining)
+    if [ ! $(battery_is_charging) ] ; then
+      if [ $b -gt 50 ] ; then
+        color='green'
+      elif [ $b -gt 20 ] ; then
+        color='yellow'
+      else
+        color='red'
+      fi
+      echo "%{$fg[$color]%}$(battery_pct_remaining)%%%{$reset_color%}"
+    else
+      echo "∞"
+    fi
+  }
+
+elif [[ "$OSTYPE" = linux*  ]] ; then
 
   function battery_is_charging() {
     ! [[ $(acpi 2>/dev/null | grep -c '^Battery.*Discharging') -gt 0 ]]
@@ -100,7 +149,7 @@ elif [[ $(uname) == "Linux"  ]] ; then
       else
         color='red'
       fi
-      echo "%{$fg[$color]%}[$(battery_pct_remaining)%%]%{$reset_color%}"
+      echo "%{$fg[$color]%}$(battery_pct_remaining)%%%{$reset_color%}"
     else
       echo "∞"
     fi

+ 3 - 3
plugins/bbedit/README.md

@@ -1,11 +1,11 @@
 ## bbedit
 
-Plugin for BBEdit, an HTML and text editor for Mac OS X 
+Plugin for BBEdit, an HTML and text editor for Mac OS X
 
 ### Requirements
 
- * [BBEdit](http://www.barebones.com/products/bbedit/)
- * [BBEdit Command-Line Tools](http://www.barebones.com/support/bbedit/cmd-line-tools.html)
+ * [BBEdit](https://www.barebones.com/products/bbedit/)
+ * [BBEdit Command-Line Tools](https://www.barebones.com/support/bbedit/cmd-line-tools.html)
 
 ### Usage
 

+ 2 - 2
plugins/bgnotify/README.md

@@ -10,10 +10,10 @@ Standalone homepage: [t413/zsh-background-notify](https://github.com/t413/zsh-ba
 
 Just add bgnotify to your plugins list in your `.zshrc`
 
-- On OS X you'll need [terminal-notifer](https://github.com/alloy/terminal-notifier)
+- On OS X you'll need [terminal-notifier](https://github.com/alloy/terminal-notifier)
   * `brew install terminal-notifier` (or `gem install terminal-notifier`)
 - On ubuntu you're already all set!
-- On windows you can use [notifu](http://www.paralint.com/projects/notifu/) or the Cygwin Ports libnotify package
+- On windows you can use [notifu](https://www.paralint.com/projects/notifu/) or the Cygwin Ports libnotify package
 
 
 ## Screenshots

+ 1 - 1
plugins/bgnotify/bgnotify.plugin.zsh

@@ -42,7 +42,7 @@ bgnotify () { ## args: (title, subtitle)
   elif hash notify-send 2>/dev/null; then #ubuntu gnome!
     notify-send "$1" "$2"
   elif hash kdialog 2>/dev/null; then #ubuntu kde!
-    kdialog  -title "$1" --passivepopup  "$2" 5
+    kdialog --title "$1" --passivepopup  "$2" 5
   elif hash notifu 2>/dev/null; then #cygwyn support!
     notifu /m "$2" /p "$1"
   fi

+ 18 - 0
plugins/bower/README.md

@@ -0,0 +1,18 @@
+# Bower plugin
+
+This plugin adds completion for [Bower](https://bower.io/) and a few useful aliases for common Bower commands.
+
+To use it, add `bower` to the plugins array in your zshrc file:
+
+```
+plugins=(... bower)
+```
+
+## Aliases
+
+| Alias | Command         | Description                                            |
+|-------|-----------------|--------------------------------------------------------|
+| bi    | `bower install` | Installs the project dependencies listed in bower.json |
+| bl    | `bower list`    | List local packages and possible updates               |
+| bs    | `bower search`  | Finds all packages or a specific package.              |
+

+ 21 - 0
plugins/brew/README.md

@@ -0,0 +1,21 @@
+# brew plugin
+
+The plugin adds several aliases for common [brew](https://brew.sh) commands.
+
+To use it, add `brew` to the plugins array of your zshrc file:
+```
+plugins=(... brew)
+```
+
+## Aliases
+
+| Alias  | Command              | Description   |
+|--------|----------------------|---------------|
+| brewp  | `brew pin`           | Pin a specified formulae, preventing them from being upgraded when issuing the brew upgrade <formulae> command. |
+| brews  | `brew list -1`       | List installed formulae, one entry per line, or the installed files for a given formulae. |
+| brewsp | `brew list --pinned` | Show the versions of pinned formulae, or only the specified (pinned) formulae if formulae are given. |
+| bubo   | `brew update && brew outdated` | Fetch the newest version of Homebrew and all formulae, then list outdated formulae. |
+| bubc   | `brew upgrade && brew cleanup` | Upgrade outdated, unpinned brews (with existing install options), then removes stale lock files and outdated downloads for formulae and casks, and removes old versions of installed formulae. |
+| bubu   | `bubo && bubc`       | Updates Homebrew, lists outdated formulae, upgrades oudated and unpinned formulae, and removes stale and outdated downloads and versions. |
+| bcubo  | `brew update && brew cask outdated` | Fetch the newest version of Homebrew and all formulae, then list outdated casks. |
+| bcubc  | `brew cask reinstall $(brew cask outdated) && brew cleanup` | Updates outdated casks, then runs cleanup. |

+ 20 - 0
plugins/brew/brew.plugin.zsh

@@ -1,4 +1,24 @@
+alias brewp='brew pin'
 alias brews='brew list -1'
+alias brewsp='brew list --pinned'
 alias bubo='brew update && brew outdated'
 alias bubc='brew upgrade && brew cleanup'
 alias bubu='bubo && bubc'
+alias bcubo='brew update && brew cask outdated'
+alias bcubc='brew cask reinstall $(brew cask outdated) && brew cleanup'
+
+if command mkdir "$ZSH_CACHE_DIR/.brew-completion-message" 2>/dev/null; then
+	print -P '%F{yellow}'Oh My Zsh brew plugin:
+	cat <<-'EOF'
+
+		  With the advent of their 1.0 release, Homebrew has decided to bundle
+		  the zsh completion as part of the brew installation, so we no longer
+		  ship it with the brew plugin; now it only has brew aliases.
+
+		  If you find that brew completion no longer works, make sure you have
+		  your Homebrew installation fully up to date.
+
+		  You will only see this message once.
+	EOF
+	print -P '%f'
+fi

+ 4 - 2
plugins/bundler/README.md

@@ -2,7 +2,8 @@
 
 - adds completion for basic bundler commands
 - adds short aliases for common bundler commands
-  - `be` aliased to `bundle exec`
+  - `be` aliased to `bundle exec`.
+    It also supports aliases (if `rs` is `rails server`, `be rs` will bundle-exec `rails server`).
   - `bl` aliased to `bundle list`
   - `bp` aliased to `bundle package`
   - `bo` aliased to `bundle open`
@@ -13,7 +14,8 @@
   - looks for a binstub under `./bin/` and executes it (if present)
   - calls `bundle exec <gem executable>` otherwise
 
-For a full list of *common gems* being wrapped by default please look at the `bundler.plugin.zsh` file.
+Common gems wrapped by default (by name of the executable):
+`annotate`, `cap`, `capify`, `cucumber`, `foodcritic`, `guard`, `hanami`, `irb`, `jekyll`, `kitchen`, `knife`, `middleman`, `nanoc`, `pry`, `puma`, `rackup`, `rainbows`, `rake`, `rspec`, `rubocop`, `shotgun`, `sidekiq`, `spec`, `spork`, `spring`, `strainer`, `tailor`, `taps`, `thin`, `thor`, `unicorn` and `unicorn_rails`.
 
 ## Configuration
 

+ 10 - 6
plugins/bundler/bundler.plugin.zsh

@@ -14,6 +14,7 @@ bundled_commands=(
   cucumber
   foodcritic
   guard
+  hanami
   irb
   jekyll
   kitchen
@@ -26,6 +27,7 @@ bundled_commands=(
   rainbows
   rake
   rspec
+  rubocop
   shotgun
   sidekiq
   spec
@@ -53,10 +55,14 @@ done
 ## Functions
 
 bundle_install() {
-  if _bundler-installed && _within-bundled-project; then
+  if ! _bundler-installed; then
+    echo "Bundler is not installed"
+  elif ! _within-bundled-project; then
+    echo "Can't 'bundle install' outside a bundled project"
+  else
     local bundler_version=`bundle version | cut -d' ' -f3`
     if [[ $bundler_version > '1.4.0' || $bundler_version = '1.4.0' ]]; then
-      if [[ "$OSTYPE" = darwin* ]]
+      if [[ "$OSTYPE" = (darwin|freebsd)* ]]
       then
         local cores_num="$(sysctl -n hw.ncpu)"
       else
@@ -66,8 +72,6 @@ bundle_install() {
     else
       bundle install $@
     fi
-  else
-    echo "Can't 'bundle install' outside a bundled project"
   fi
 }
 
@@ -78,7 +82,7 @@ _bundler-installed() {
 _within-bundled-project() {
   local check_dir="$PWD"
   while [ "$check_dir" != "/" ]; do
-    [ -f "$check_dir/Gemfile" ] && return
+    [ -f "$check_dir/Gemfile" -o -f "$check_dir/gems.rb" ] && return
     check_dir="$(dirname $check_dir)"
   done
   false
@@ -91,7 +95,7 @@ _binstubbed() {
 _run-with-bundler() {
   if _bundler-installed && _within-bundled-project; then
     if _binstubbed $1; then
-      ./bin/$@
+      ./bin/${^^@}
     else
       bundle exec $@
     fi

+ 0 - 13
plugins/bwana/bwana.plugin.zsh

@@ -1,13 +0,0 @@
-#
-# Requires http://www.bruji.com/bwana/
-#
-if [[ -e /Applications/Bwana.app ]] ||
-    ( system_profiler -detailLevel mini SPApplicationsDataType | grep -q Bwana )
-then
-  function man() {
-    open "man:$1"
-  }
-else
-  echo "Bwana lets you read man files in Safari through a man: URI scheme" 
-  echo "To use it within Zsh, install it from http://www.bruji.com/bwana/"
-fi

+ 9 - 0
plugins/cabal/README.md

@@ -0,0 +1,9 @@
+# Cabal
+
+This plugin provides completion for [Cabal](https://www.haskell.org/cabal/), a build tool for Haskell. It
+also provides a function `cabal_sandbox_info` that prints whether the current working directory is in a sandbox.
+
+To use it, add cabal to the plugins array of your zshrc file:
+```
+plugins=(... cabal)
+```

+ 15 - 0
plugins/cake/README.md

@@ -0,0 +1,15 @@
+# Cake
+
+This plugin provides completion for [CakePHP](https://cakephp.org/).
+
+To use it add cake to the plugins array in your zshrc file.
+
+```bash
+plugins=(... cake)
+```
+
+## Note
+
+This plugin generates a cache file of the cake tasks found, named `.cake_task_cache`, in the current working directory. 
+It is regenerated when the Cakefile is newer than the cache file. It is advised that you add the cake file to your
+`.gitignore` files.

+ 16 - 0
plugins/cakephp3/README.md

@@ -0,0 +1,16 @@
+# cakephp3 plugin
+
+The plugin adds aliases and autocompletion for [cakephp3](https://book.cakephp.org/3.0/en/index.html).
+
+To use it, add `cakephp3` to the plugins array of your zshrc file:
+```
+plugins=(... cakephp3)
+```
+
+## Aliases
+
+| Alias     | Command                       |
+|-----------|-------------------------------|
+| c3        | `bin/cake`                    |
+| c3cache   | `bin/cake orm_cache clear`    |
+| c3migrate | `bin/cake migrations migrate` |

+ 14 - 0
plugins/capistrano/README.md

@@ -0,0 +1,14 @@
+# Capistrano
+
+This plugin provides completion for [Capistrano](https://capistranorb.com/).
+
+To use it add capistrano to the plugins array in your zshrc file.
+
+```bash
+plugins=(... capistrano)
+```
+
+For a working completion use the `capit` command instead of `cap`, because cap is a
+[reserved word in zsh](http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module).
+
+`capit` automatically runs cap with bundler if a Gemfile is found.

+ 2 - 2
plugins/capistrano/capistrano.plugin.zsh

@@ -1,7 +1,7 @@
-# Added `shipit` because `cap` is a reserved word. `cap` completion doesn't work.
+# Added `capit` because `cap` is a reserved word. `cap` completion doesn't work.
 # http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module
 
-func capit() {
+function capit() {
   if [ -f Gemfile ]
   then
     bundle exec cap $*

+ 11 - 0
plugins/cargo/README.md

@@ -0,0 +1,11 @@
+# cargo
+
+This plugin adds completion for the Rust build tool [`Cargo`](https://github.com/rust-lang/cargo).
+
+To use it, add `cargo` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... cargo)
+```
+
+Updated on March 3rd, 2019, from [Cargo 0.34.0](https://github.com/rust-lang/cargo/releases/tag/0.34.0).

+ 407 - 0
plugins/cargo/_cargo

@@ -0,0 +1,407 @@
+#compdef cargo
+
+autoload -U regexp-replace
+
+_cargo() {
+    local curcontext="$curcontext" ret=1
+    local -a command_scope_spec common parallel features msgfmt triple target registry
+    local -a state line state_descr # These are set by _arguments
+    typeset -A opt_args
+
+    common=(
+        '(-q --quiet)*'{-v,--verbose}'[use verbose output]'
+        '(-q --quiet -v --verbose)'{-q,--quiet}'[no output printed to stdout]'
+        '-Z+[pass unstable (nightly-only) flags to cargo]: :_cargo_unstable_flags'
+        '--frozen[require that Cargo.lock and cache are up-to-date]'
+        '--locked[require that Cargo.lock is up-to-date]'
+        '--color=[specify colorization option]:coloring:(auto always never)'
+        '(- 1 *)'{-h,--help}'[show help message]'
+    )
+
+    # leading items in parentheses are an exclusion list for the arguments following that arg
+    # See: http://zsh.sourceforge.net/Doc/Release/Completion-System.html#Completion-Functions
+    #   - => exclude all other options
+    #   1 => exclude positional arg 1
+    #   * => exclude all other args
+    #   +blah => exclude +blah
+    _arguments -s -S -C $common \
+        '(- 1 *)--list[list installed commands]' \
+        '(- 1 *)--explain=[provide a detailed explanation of an error message]:error code' \
+        '(- 1 *)'{-V,--version}'[show version information]' \
+        '(+beta +nightly)+stable[use the stable toolchain]' \
+        '(+stable +nightly)+beta[use the beta toolchain]' \
+        '(+stable +beta)+nightly[use the nightly toolchain]' \
+        '1: :_cargo_cmds' \
+        '*:: :->args'
+
+    # These flags are mutually exclusive specifiers for the scope of a command; as
+    # they are used in multiple places without change, they are expanded into the
+    # appropriate command's `_arguments` where appropriate.
+    command_scope_spec=(
+        '(--bin --example --test --lib)--bench=[specify benchmark name]: :_cargo_benchmark_names'
+        '(--bench --bin --test --lib)--example=[specify example name]:example name'
+        '(--bench --example --test --lib)--bin=[specify binary name]:binary name'
+        '(--bench --bin --example --test)--lib=[specify library name]:library name'
+        '(--bench --bin --example --lib)--test=[specify test name]:test name'
+    )
+
+    parallel=(
+        '(-j --jobs)'{-j+,--jobs=}'[specify number of parallel jobs]:jobs [# of CPUs]'
+    )
+
+    features=(
+        '(--all-features)--features=[specify features to activate]:feature'
+        '(--features)--all-features[activate all available features]'
+        "--no-default-features[don't build the default features]"
+    )
+
+    msgfmt='--message-format=[specify error format]:error format [human]:(human json short)'
+    triple='--target=[specify target triple]:target triple'
+    target='--target-dir=[specify directory for all generated artifacts]:directory:_directories'
+    manifest='--manifest-path=[specify path to manifest]:path:_directories'
+    registry='--registry=[specify registry to use]:registry'
+
+    case $state in
+        args)
+            curcontext="${curcontext%:*}-${words[1]}:"
+            case ${words[1]} in
+                bench)
+                    _arguments -s -A "^--" $common $parallel $features $msgfmt $triple $target $manifest \
+                        "${command_scope_spec[@]}" \
+                        '--all-targets[benchmark all targets]' \
+                        "--no-run[compile but don't run]" \
+                        '(-p --package)'{-p+,--package=}'[specify package to run benchmarks for]:package:_cargo_package_names' \
+                        '--exclude=[exclude packages from the benchmark]:spec' \
+                        '--no-fail-fast[run all benchmarks regardless of failure]' \
+                        '1: :_guard "^-*" "bench name"' \
+                        '*:args:_default'
+                        ;;
+
+                build)
+                    _arguments -s -S $common $parallel $features $msgfmt $triple $target $manifest \
+                        '--all-targets[equivalent to specifying --lib --bins --tests --benches --examples]' \
+                        "${command_scope_spec[@]}" \
+                        '(-p --package)'{-p+,--package=}'[specify package to build]:package:_cargo_package_names' \
+                        '--release[build in release mode]' \
+                        '--build-plan[output the build plan in JSON]' \
+                        ;;
+
+                check)
+                    _arguments -s -S $common $parallel $features $msgfmt $triple $target $manifest \
+                        '--all-targets[equivalent to specifying --lib --bins --tests --benches --examples]' \
+                        "${command_scope_spec[@]}" \
+                        '(-p --package)'{-p+,--package=}'[specify package to check]:package:_cargo_package_names' \
+                        '--release[check in release mode]' \
+                        ;;
+
+                clean)
+                    _arguments -s -S $common $triple $target $manifest \
+                        '(-p --package)'{-p+,--package=}'[specify package to clean]:package:_cargo_package_names' \
+                        '--release[clean release artifacts]' \
+                        '--doc[clean just the documentation directory]'
+                        ;;
+
+                doc)
+                    _arguments -s -S $common $parallel $features $msgfmt $triple $target $manifest \
+                        '--no-deps[do not build docs for dependencies]' \
+                        '--document-private-items[include non-public items in the documentation]' \
+                        '--open[open docs in browser after the build]' \
+                        '(-p --package)'{-p+,--package=}'[specify package to document]:package:_cargo_package_names' \
+                        '--release[build artifacts in release mode, with optimizations]' \
+                        ;;
+
+                fetch)
+                    _arguments -s -S $common $triple $manifest
+                        ;;
+
+                fix)
+                    _arguments -s -S $common $parallel $features $msgfmt $triple $target $manifest \
+                        "${command_scope_spec[@]}" \
+                        '--broken-code[fix code even if it already has compiler errors]' \
+                        '--edition[fix in preparation for the next edition]' \
+                        '--edition-idioms[fix warnings to migrate to the idioms of an edition]' \
+                        '--allow-no-vcs[fix code even if a VCS was not detected]' \
+                        '--allow-dirty[fix code even if the working directory is dirty]' \
+                        '--allow-staged[fix code even if the working directory has staged changes]'
+                ;;
+
+                generate-lockfile)
+                    _arguments -s -S $common $manifest
+                        ;;
+
+                git-checkout)
+                    _arguments -s -S $common \
+                        '--reference=:reference' \
+                        '--url=:url:_urls'
+                        ;;
+
+                help)
+                    _cargo_cmds
+                        ;;
+
+                init)
+                    _arguments -s -S $common $registry \
+                        '--lib[use library template]' \
+                        '--edition=[specify edition to set for the crate generated]:edition:(2015 2018)' \
+                        '--vcs=[initialize a new repo with a given VCS]:vcs:(git hg pijul fossil none)' \
+                        '--name=[set the resulting package name]:name' \
+                        '1:path:_directories'
+                        ;;
+
+                install)
+                    _arguments -s -S $common $parallel $features $triple $registry \
+                        '(-f --force)'{-f,--force}'[force overwriting of existing crates or binaries]' \
+                        '--bin=[only install the specified binary]:binary' \
+                        '--branch=[branch to use when installing from git]:branch' \
+                        '--debug[build in debug mode instead of release mode]' \
+                        '--example=[install the specified example instead of binaries]:example' \
+                        '--git=[specify URL from which to install the crate]:url:_urls' \
+                        '--path=[local filesystem path to crate to install]: :_directories' \
+                        '--rev=[specific commit to use when installing from git]:commit' \
+                        '--root=[directory to install packages into]: :_directories' \
+                        '--tag=[tag to use when installing from git]:tag' \
+                        '--vers=[version to install from crates.io]:version' \
+                        '--list[list all installed packages and their versions]' \
+                        '*: :_guard "^-*" "crate"'
+                        ;;
+
+                locate-project)
+                    _arguments -s -S $common $manifest
+                        ;;
+
+                login)
+                    _arguments -s -S $common $registry \
+                        '*: :_guard "^-*" "token"'
+                        ;;
+
+                metadata)
+                    _arguments -s -S $common $features $manifest \
+                        "--no-deps[output information only about the root package and don't fetch dependencies]" \
+                        '--format-version=[specify format version]:version [1]:(1)'
+                        ;;
+
+                new)
+                    _arguments -s -S $common $registry \
+                        '--lib[use library template]' \
+                        '--vcs:initialize a new repo with a given VCS:(git hg none)' \
+                        '--name=[set the resulting package name]'
+                        ;;
+
+                owner)
+                    _arguments -s -S $common $registry \
+                        '(-a --add)'{-a,--add}'[specify name of a user or team to invite as an owner]:name' \
+                        '--index=[specify registry index]:index' \
+                        '(-l --list)'{-l,--list}'[list owners of a crate]' \
+                        '(-r --remove)'{-r,--remove}'[specify name of a user or team to remove as an owner]:name' \
+                        '--token=[specify API token to use when authenticating]:token' \
+                        '*: :_guard "^-*" "crate"'
+                        ;;
+
+                package)
+                    _arguments -s -S $common $parallel $features $triple $target $manifest \
+                        '(-l --list)'{-l,--list}'[print files included in a package without making one]' \
+                        '--no-metadata[ignore warnings about a lack of human-usable metadata]' \
+                        '--allow-dirty[allow dirty working directories to be packaged]' \
+                        "--no-verify[don't build to verify contents]"
+                        ;;
+
+                pkgid)
+                    _arguments -s -S $common $manifest \
+                        '(-p --package)'{-p+,--package=}'[specify package to get ID specifier for]:package:_cargo_package_names' \
+                        '*: :_guard "^-*" "spec"'
+                        ;;
+
+                publish)
+                    _arguments -s -S $common $parallel $features $triple $target $manifest $registry \
+                        '--index=[specify registry index]:index' \
+                        '--allow-dirty[allow dirty working directories to be packaged]' \
+                        "--no-verify[don't verify the contents by building them]" \
+                        '--token=[specify token to use when uploading]:token' \
+                        '--dry-run[perform all checks without uploading]'
+                        ;;
+
+                read-manifest)
+                    _arguments -s -S $common $manifest
+                        ;;
+
+                run)
+                    _arguments -s -S $common $parallel $features $msgfmt $triple $target $manifest \
+                        '--example=[name of the bin target]:name' \
+                        '--bin=[name of the bin target]:name' \
+                        '(-p --package)'{-p+,--package=}'[specify package with the target to run]:package:_cargo_package_names' \
+                        '--release[build in release mode]' \
+                        '*: :_default'
+                        ;;
+
+                rustc)
+                    _arguments -s -S $common $parallel $features $msgfmt $triple $target $manifest \
+                        '(-p --package)'{-p+,--package=}'[specify package to build]:package:_cargo_package_names' \
+                        '--profile=[specify profile to build the selected target for]:profile' \
+                        '--release[build artifacts in release mode, with optimizations]' \
+                        "${command_scope_spec[@]}" \
+                        '*: : _dispatch rustc rustc -default-'
+                        ;;
+
+                rustdoc)
+                    _arguments -s -S $common $parallel $features $msgfmt $triple $target $manifest \
+                        '--document-private-items[include non-public items in the documentation]' \
+                        '--open[open the docs in a browser after the operation]' \
+                        '(-p --package)'{-p+,--package=}'[specify package to document]:package:_cargo_package_names' \
+                        '--release[build artifacts in release mode, with optimizations]' \
+                        "${command_scope_spec[@]}" \
+                        '*: : _dispatch rustdoc rustdoc -default-'
+                        ;;
+
+                search)
+                    _arguments -s -S $common $registry \
+                        '--index=[specify registry index]:index' \
+                        '--limit=[limit the number of results]:results [10]' \
+                        '*: :_guard "^-*" "query"'
+                        ;;
+
+                test)
+                    _arguments -s -S $common $parallel $features $msgfmt $triple $target $manifest \
+                        '--test=[test name]: :_cargo_test_names' \
+                        '--no-fail-fast[run all tests regardless of failure]' \
+                        '--no-run[compile but do not run]' \
+                        '(-p --package)'{-p+,--package=}'[package to run tests for]:package:_cargo_package_names' \
+                        '--all[test all packages in the workspace]' \
+                        '--release[build artifacts in release mode, with optimizations]' \
+                        '1: :_cargo_test_names' \
+                        '(--doc --bin --example --test --bench)--lib[only test library]' \
+                        '(--lib --bin --example --test --bench)--doc[only test documentation]' \
+                        '(--lib --doc --example --test --bench)--bin=[binary name]' \
+                        '(--lib --doc --bin --test --bench)--example=[example name]' \
+                        '(--lib --doc --bin --example --bench)--test=[test name]' \
+                        '(--lib --doc --bin --example --test)--bench=[benchmark name]' \
+                        '*: :_default'
+                        ;;
+
+                uninstall)
+                    _arguments -s -S $common \
+                        '(-p --package)'{-p+,--package=}'[specify package to uninstall]:package:_cargo_package_names' \
+                        '--bin=[only uninstall the specified binary]:name' \
+                        '--root=[directory to uninstall packages from]: :_files -/' \
+                        '*:crate:_cargo_installed_crates -F line'
+                        ;;
+
+                update)
+                    _arguments -s -S $common $manifest \
+                        '--aggressive=[force dependency update]' \
+                        "--dry-run[don't actually write the lockfile]" \
+                        '(-p --package)'{-p+,--package=}'[specify package to update]:package:_cargo_package_names' \
+                        '--precise=[update single dependency to precise release]:release'
+                        ;;
+
+                verify-project)
+                    _arguments -s -S $common $manifest
+                        ;;
+
+                version)
+                    _arguments -s -S $common
+                        ;;
+
+                yank)
+                    _arguments -s -S $common $registry \
+                        '--vers=[specify yank version]:version' \
+                        '--undo[undo a yank, putting a version back into the index]' \
+                        '--index=[specify registry index to yank from]:registry index' \
+                        '--token=[specify API token to use when authenticating]:token' \
+                        '*: :_guard "^-*" "crate"'
+                        ;;
+                *)
+                    # allow plugins to define their own functions
+                    if ! _call_function ret _cargo-${words[1]}; then
+                        # fallback on default completion for unknown commands
+                        _default && ret=0
+                    fi
+                    (( ! ret ))
+                ;;
+            esac
+            ;;
+    esac
+}
+
+_cargo_unstable_flags() {
+    local flags
+    flags=( help ${${${(M)${(f)"$(_call_program flags cargo -Z help)"}:#*--*}/ #-- #/:}##*-Z } )
+    _describe -t flags 'unstable flag' flags
+}
+
+_cargo_installed_crates() {
+    local expl
+    _description crates expl 'crate'
+    compadd "$@" "$expl[@]" - ${${${(f)"$(cargo install --list)"}:# *}%% *}
+}
+
+_cargo_cmds() {
+    local -a commands
+    # This uses Parameter Expansion Flags, which are a built-in Zsh feature.
+    # See more: http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags
+    # and       http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion
+    #
+    # # How this work?
+    #
+    # First it splits the result of `cargo --list` at newline, then it removes the first line.
+    # Then it removes indentation (4 whitespaces) before each items. (Note the x## pattern [1]).
+    # Then it replaces those spaces between item and description with a `:`
+    #
+    # [1]: https://github.com/zsh-users/zsh-completions/blob/master/zsh-completions-howto.org#patterns
+    commands=( ${${${(M)"${(f)$(_call_program commands cargo --list)}":#    *}/ ##/}/ ##/:} )
+    _describe -t commands 'command' commands
+}
+
+
+#FIXME: Disabled until fixed
+#gets package names from the manifest file
+_cargo_package_names() {
+    _message -e packages package
+}
+
+# Extracts the values of "name" from the array given in $1 and shows them as
+# command line options for completion
+_cargo_names_from_array() {
+    # strip json from the path
+    local manifest=${${${"$(cargo locate-project)"}%\"\}}##*\"}
+    if [[ -z $manifest ]]; then
+        return 0
+    fi
+
+    local last_line
+    local -a names;
+    local in_block=false
+    local block_name=$1
+    names=()
+    while read -r line; do
+        if [[ $last_line == "[[$block_name]]" ]]; then
+            in_block=true
+        else
+            if [[ $last_line =~ '\s*\[\[.*' ]]; then
+                in_block=false
+            fi
+        fi
+
+        if [[ $in_block == true ]]; then
+            if [[ $line =~ '\s*name\s*=' ]]; then
+                regexp-replace line '^\s*name\s*=\s*|"' ''
+                names+=( "$line" )
+            fi
+        fi
+
+        last_line=$line
+    done < "$manifest"
+    _describe "$block_name" names
+
+}
+
+#Gets the test names from the manifest file
+_cargo_test_names() {
+    _cargo_names_from_array "test"
+}
+
+#Gets the bench names from the manifest file
+_cargo_benchmark_names() {
+    _cargo_names_from_array "bench"
+}
+
+_cargo

+ 8 - 4
plugins/cask/README.md

@@ -1,11 +1,15 @@
-# cask plugin
+# Cask plugin
 
-Loads `cask` completion from non-standard locations, such as if installed
+[Cask](https://github.com/cask/cask) is a project management tool for Emacs that helps
+automate the package development cycle; development, dependencies, testing, building,
+packaging and more.
+
+This plugin loads `cask` completion from non-standard locations, such as if installed
 via Homebrew or others. To enable it, add `cask` to your plugins array:
 
 ```zsh
 plugins=(... cask)
 ```
 
-Make sure you have the `cask` directory in your `$PATH` before loading
-Oh My Zsh, otherwise you'll get the "command not found" error.
+Make sure you have the `cask` directory in your `$PATH` before loading Oh My Zsh,
+otherwise you'll get a "command not found" error.

+ 35 - 0
plugins/catimg/README.md

@@ -0,0 +1,35 @@
+# catimg
+
+Plugin for displaying images on the terminal using the the `catimg.sh` script provided by [posva](https://github.com/posva/catimg)
+
+## Requirements
+
+- `convert` (ImageMagick)
+
+## Enabling the plugin
+
+1. Open your `.zshrc` file and add `catimg` in the plugins section:
+
+   ```zsh
+   plugins=(
+       # all your enabled plugins
+       catimg
+   )
+   ```
+
+2. Reload the source file or restart your Terminal session:
+
+   ```console
+   $ source ~/.zshrc
+   $
+   ```
+
+## Functions
+
+| Function | Description                              |
+| -------- | ---------------------------------------- |
+| `catimg` | Displays the given image on the terminal |
+
+## Usage examples
+
+[![asciicast](https://asciinema.org/a/204702.png)](https://asciinema.org/a/204702)

+ 2 - 2
plugins/catimg/catimg.plugin.zsh

@@ -1,10 +1,10 @@
 ################################################################################
 # catimg script by Eduardo San Martin Morote aka Posva                         #
-# http://posva.net                                                             #
+# https://posva.net                                                            #
 #                                                                              #
 # Ouput the content of an image to the stdout using the 256 colors of the      #
 # terminal.                                                                    #
-# Github: https://github.com/posva/catimg                                      #
+# GitHub: https://github.com/posva/catimg                                      #
 ################################################################################
 
 

+ 2 - 2
plugins/catimg/catimg.sh

@@ -1,10 +1,10 @@
 ################################################################################
 # catimg script by Eduardo San Martin Morote aka Posva                         #
-# http://posva.net                                                             #
+# https://posva.net                                                            #
 #                                                                              #
 # Ouput the content of an image to the stdout using the 256 colors of the      #
 # terminal.                                                                    #
-# Github: https://github.com/posva/catimg                                      #
+# GitHub: https://github.com/posva/catimg                                      #
 ################################################################################
 
 function help() {

+ 9 - 0
plugins/celery/README.md

@@ -0,0 +1,9 @@
+# Celery
+
+This plugin provides completion for [Celery](http://www.celeryproject.org/).
+
+To use it add celery to the plugins array in your zshrc file.
+
+```bash
+plugins=(... celery)
+```

+ 20 - 0
plugins/chruby/README.md

@@ -0,0 +1,20 @@
+# chruby plugin
+
+This plugin loads [chruby](https://github.com/postmodern/chruby), a tool that changes the
+current Ruby version, and completion and a prompt function to display the Ruby version.
+Supports brew and manual installation of chruby.
+
+To use it, add `chruby` to the plugins array in your zshrc file:
+```zsh
+plugins=(... chruby)
+```
+
+## Usage
+
+If you'd prefer to specify an explicit path to load chruby from
+you can set variables like so:
+
+```
+zstyle :omz:plugins:chruby path /local/path/to/chruby.sh
+zstyle :omz:plugins:chruby auto /local/path/to/auto.sh
+```

+ 26 - 4
plugins/chruby/chruby.plugin.zsh

@@ -16,12 +16,28 @@
 # rvm and rbenv plugins also provide this alias
 alias rubies='chruby'
 
+
 _homebrew-installed() {
     whence brew &> /dev/null
+    _xit=$?
+    if [ $_xit -eq 0 ];then
+    	# ok , we have brew installed
+	# speculatively we check default brew prefix
+        if [ -h  /usr/local/opt/chruby ];then
+		_brew_prefix="/usr/local/opt/chruby"
+	else
+		# ok , it is not default prefix 
+		# this call to brew is expensive ( about 400 ms ), so at least let's make it only once
+		_brew_prefix=$(brew --prefix chruby)
+	fi
+	return 0
+   else
+        return $_xit
+   fi
 }
 
 _chruby-from-homebrew-installed() {
-  [ -r $(brew --prefix chruby) ] &> /dev/null
+  [ -r _brew_prefix ] &> /dev/null
 }
 
 _ruby-build_installed() {
@@ -64,8 +80,8 @@ _chruby_dirs() {
 }
 
 if _homebrew-installed && _chruby-from-homebrew-installed ; then
-    source $(brew --prefix chruby)/share/chruby/chruby.sh
-    source $(brew --prefix chruby)/share/chruby/auto.sh
+    source $_brew_prefix/share/chruby/chruby.sh
+    source $_brew_prefix/share/chruby/auto.sh
     _chruby_dirs
 elif [[ -r "/usr/local/share/chruby/chruby.sh" ]] ; then
     source /usr/local/share/chruby/chruby.sh
@@ -95,5 +111,11 @@ function chruby_prompt_info() {
 }
 
 # complete on installed rubies
-_chruby() { compadd $(chruby | tr -d '* ') }
+_chruby() {
+    compadd $(chruby | tr -d '* ')
+    local default_path='/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin'
+    if PATH=${default_path} type ruby &> /dev/null; then
+        compadd system
+    fi
+}
 compdef _chruby chruby

+ 0 - 2
plugins/chucknorris/LICENSE

@@ -1,2 +0,0 @@
-License: GPL v2
-Thanks to http://www.k-lug.org/~kessler/projects.html for the fortune file.

+ 20 - 0
plugins/chucknorris/README.md

@@ -0,0 +1,20 @@
+# chucknorris
+
+Chuck Norris fortunes plugin for oh-my-zsh
+
+**Maintainers**: [apjanke](https://github.com/apjanke) [maff](https://github.com/maff)
+
+To use it add `chucknorris` to the plugins array in you zshrc file.
+
+```zsh
+plugins=(... chucknorris)
+```
+
+
+Depends on fortune (and cowsay if using chuck_cow) being installed (available via homebrew, apt, ...). Perfectly suitable as MOTD.
+
+
+| Command     | Description                     |
+| ----------- | ------------------------------- |
+| `chuck`     | Print random Chuck Norris quote |
+| `chuck_cow` | Print quote in cowthink         |

文件差异内容过多而无法显示
+ 2091 - 454
plugins/chucknorris/fortunes/chucknorris


+ 24 - 0
plugins/cloudapp/README.md

@@ -0,0 +1,24 @@
+# CloudApp plugin
+
+[CloudApp](https://www.getcloudapp.com) brings screen recording, screenshots, and GIF creation to the cloud, in an easy-to-use enterprise-level app. The CloudApp plugin allows you to upload a file to your CloadApp account from the command line.
+
+To use it, add `cloudapp` to the plugins array of your `~/.zshrc` file:
+
+```
+plugins=(... dash)
+```
+
+## Requirements
+
+1. [Aaron Russell's `cloudapp_api` gem](https://github.com/aaronrussell/cloudapp_api#installation)
+
+2. That you set your CloudApp credentials in `~/.cloudapp` as a simple text file like below:
+   ```
+   email
+   password
+   ```
+
+## Usage
+
+- `cloudapp <filename>`: uploads `<filename>` to your CloudApp account, and if you're using
+  macOS, copies the URL to your clipboard.

+ 6 - 2
plugins/cloudapp/cloudapp.plugin.zsh

@@ -1,2 +1,6 @@
-#!/bin/zsh
-alias cloudapp=$ZSH/plugins/cloudapp/cloudapp.rb
+alias cloudapp="${0:a:h}/cloudapp.rb"
+
+# Ensure only the owner can access the credentials file
+if [[ -f ~/.cloudapp ]]; then
+  chmod 600 ~/.cloudapp
+fi

+ 58 - 0
plugins/cloudfoundry/README.md

@@ -0,0 +1,58 @@
+# Cloudfoundry Plugin
+
+This plugin is intended to offer a few simple aliases for regular users of the [Cloud Foundry Cli][1]. Most are just simple aliases that will save a bit of typing. Others include mini functions and or accept parameters. Take a look at the table below for details.
+
+| Alias    | Command                     | Description                                                              |
+|----------|-----------------------------|--------------------------------------------------------------------------|
+| cfl      | `cf login`                  | Login to Cloud Foundry                                                   |
+| cft      | `cf target`                 | Target the cli at a specific Org/Space in Cloud Foundry                  |
+| cfa      | `cf apps`                   | List all applications in the current Org/Space                           |
+| cfs      | `cf services`               | List all services in the current Org/Space                               |
+| cfm      | `cf marketplace`            | List the services available in the Marketplace                           |
+| cfp      | `cf push`                   | Push your application code to Cloud Foundry                              |
+| cfcs     | `cf create-service`         | Create a service based on a Marketplace offering                         |
+| cfbs     | `cf bind-service`           | Bind an application to a service you created                             |
+| cfus     | `cf unbind-service`         | Unbind a service from an application                                     |
+| cfds     | `cf delete-service`         | Delete a service you no longer have bound                                |
+| cfup     | `cf cups`                   | Create a "user-provided-service"                                         |
+| cflg     | `cf logs`                   | Tail the logs of an application (requires <APP_NAME>)                    |
+| cfr      | `cf routes`                 | List all the routes in the current Space                                 |
+| cfe      | `cf env`                    | Show the environment variables for an application (requires <APP_NAME>)  |
+| cfsh     | `cf ssh`                    | Attach to a running container (requires an <APP_NAME> etc.)              |
+| cfsc     | `cf scale`                  | Scale an application (requires an <APP_NAME> etc.)                       |
+| cfev     | `cf events`                 | Show the application events (requires <APP_NAME>)                        |
+| cfdor    | `cf delete-orphaned-routes` | Delete routes that are no longer bound to applications                   |
+| cfbpk    | `cf buildpacks`             | List the available buildpacks                                            |
+| cfdm     | `cf domains`                | List the domains associates with this Cloud Foundry foundation           |
+| cfsp     | `cf spaces`                 | List all the Spaces in the current Org                                   |
+| cfap     | `cf app`                    | Show the details of a deployed application (requires <APP_NAME>)         |
+| cfh.     | `export CF_HOME=$PWD/.cf`   | Set the current directory as CF_HOME                                     |
+| cfh~     | `export CF_HOME=~/.cf`      | Set the user's root directory as CF_HOME                                 |
+| cfhu     | `unset CF_HOME`             | Unsets CF_HOME                                                           |
+| cfpm     | `cf push -f`                | Push an application using a manifest (requires <MANIFEST_FILE> location) |
+| cflr     | `cf logs --recent`          | Show the recent logs (requires <APP_NAME>)                               |
+| cfsrt    | `cf start`                  | Start an application (requires <APP_NAME>)                               |
+| cfstp    | `cf stop`                   | Stop an application (requires <APP_NAME>)                                |
+| cfstg    | `cf restage`                | Restage an application (requires <APP_NAME>)                             |
+| cfdel    | `cf delete`                 | Delete an application (requires <APP_NAME>)                              |
+| cfsrtall | -                           | Start all apps that are currently in the "Stopped" state                 |
+| cfstpall | -                           | Stop all apps that are currently in the "Started" state                  |
+
+For help and advice on what any of the commands does, consult the built in `cf` help functions as follows:-
+
+```bash
+cf help # List the most popular and commonly used commands
+cf help -a # Complete list of all possible commands
+cf <COMMAND_NAME> --help # Help on a specific command including arguments and examples
+```
+
+Alternatively, seek out the [online documentation][3]. And don't forget, there are loads of great [community plugins for the cf-cli][4] command line tool that can greatly extend its power and usefulness.
+
+## Contributors
+
+Contributed to `oh_my_zsh` by [benwilcock][2].  
+
+[1]: https://docs.cloudfoundry.org/cf-cli/install-go-cli.html
+[2]: https://github.com/benwilcock
+[3]: https://docs.cloudfoundry.org/cf-cli/getting-started.html
+[4]: https://plugins.cloudfoundry.org/

+ 34 - 0
plugins/cloudfoundry/cloudfoundry.plugin.zsh

@@ -0,0 +1,34 @@
+# Some Useful CloudFoundry Aliases & Functions
+alias cfl="cf login"
+alias cft="cf target"
+alias cfa="cf apps"
+alias cfs="cf services"
+alias cfm="cf marketplace"
+alias cfp="cf push"
+alias cfcs="cf create-service"
+alias cfbs="cf bind-service"
+alias cfus="cf unbind-service"
+alias cfds="cf delete-service"
+alias cfup="cf cups"
+alias cflg="cf logs"
+alias cfr="cf routes"
+alias cfe="cf env"
+alias cfsh="cf ssh"
+alias cfsc="cf scale"
+alias cfev="cf events"
+alias cfdor="cf delete-orphaned-routes"
+alias cfbpk="cf buildpacks"
+alias cfdm="cf domains"
+alias cfsp="cf spaces"
+function cfap() { cf app $1 }
+function cfh.() { export CF_HOME=$PWD/.cf }
+function cfh~() { export CF_HOME=~/.cf }
+function cfhu() { unset CF_HOME }
+function cfpm() { cf push -f $1 }
+function cflr() { cf logs $1 --recent }
+function cfsrt() { cf start $1 }
+function cfstp() { cf stop $1 }
+function cfstg() { cf restage $1 }
+function cfdel() { cf delete $1 }
+function cfsrtall() {cf apps | awk '/stopped/ { system("cf start " $1)}'}
+function cfstpall() {cf apps | awk '/started/ { system("cf stop " $1)}'}

+ 2 - 2
plugins/coffee/_coffee

@@ -1,6 +1,6 @@
 #compdef coffee
 # ------------------------------------------------------------------------------
-# Copyright (c) 2011 Github zsh-users - http://github.com/zsh-users
+# Copyright (c) 2011 Github zsh-users - https://github.com/zsh-users
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -28,7 +28,7 @@
 # Description
 # -----------
 #
-#  Completion script for Coffee.js v0.6.11 (http://coffeejs.org)
+#  Completion script for Coffee.js v0.6.11 (https://coffeescript.org)
 #
 # ------------------------------------------------------------------------------
 # Authors

+ 48 - 0
plugins/colemak/README.md

@@ -0,0 +1,48 @@
+# Colemak plugin
+
+This plugin remaps keys in `zsh`'s [`vi`-style navigation mode](http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Keymaps)
+for a [Colemak](https://colemak.com/) keyboard layout, to match the QWERTY position:
+
+![Colemak layout on a US keyboard](https://colemak.com/wiki/images/6/6c/Colemak2.png)
+
+To use it, add it to the plugins array in your `~/.zshrc` file:
+
+```
+plugins=(... colemak)
+```
+
+You will also need to enable `vi` mode, so add another line to `~/.zshrc`:
+```
+bindkey -v
+```
+
+Restart your shell and hit the `<ESC>` key to activate `vicmd` (navigation) mode,
+and start navigating `zsh` with your new keybindings!
+
+## Key bindings for vicmd
+
+| Old        | New        | Binding                   | Description                                        |
+|------------|------------|---------------------------|----------------------------------------------------|
+| `CTRL`+`j` | `CTRL`+`n` | accept-line               | Insert new line                                    |
+| `j`        | `n`        | down-line-or-history      | Move one line down or command history forwards     |
+| `k`        | `e`        | up-line-or-history        | Move one line up or command history backwards      |
+| `l`        | `i`        | vi-forward-char           | Move one character to the right                    |
+| `n`        | `k`        | vi-repeat-search          | Repeat command search forwards                     |
+| `N`        | `K`        | vi-rev-repeat-search      | Repeat command search backwards                    |
+| `i`        | `u`        | vi-insert                 | Enter insert mode                                  |
+| `I`        | `U`        | vi-insert-bol             | Move to first non-blank char and enter insert mode |
+| `<none>`   | `l`        | vi-undo-change            | Undo change                                        |
+| `J`        | `N`        | vi-join                   | Join the current line with the next one            |
+| `e`        | `j`        | vi-forward-word-end       | Move to the end of the next word                   |
+| `E`        | `J`        | vi-forward-blank-word-end | Move to end of the current or next word            |
+
+## Key bindings for less
+
+| Keyboard shortcut | `less` key binding |
+|-------------------|--------------------|
+| `n`               | forw-line          |
+| `e`               | back-line          |
+| `k`               | repeat-search      |
+| `ESC`+`k`         | repeat-search-all  |
+| `K`               | reverse-search     |
+| `ESC`+`K`         | reverse-search-all |

+ 15 - 0
plugins/colored-man-pages/README.md

@@ -0,0 +1,15 @@
+# Colored man pages plugin
+
+This plugin adds colors to man pages.
+
+To use it, add `colored-man-pages` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... colored-man-pages)
+```
+
+You can also try to color other pages by prefixing the respective command with `colored`:
+
+```zsh
+colored git help clone
+```

+ 6 - 2
plugins/colored-man-pages/colored-man-pages.plugin.zsh

@@ -16,7 +16,7 @@ EOF
 	fi
 fi
 
-man() {
+function colored() {
 	env \
 		LESS_TERMCAP_mb=$(printf "\e[1;31m") \
 		LESS_TERMCAP_md=$(printf "\e[1;31m") \
@@ -28,5 +28,9 @@ man() {
 		PAGER="${commands[less]:-$PAGER}" \
 		_NROFF_U=1 \
 		PATH="$HOME/bin:$PATH" \
-			man "$@"
+			"$@"
+}
+
+function man() {
+	colored man "$@"
 }

+ 35 - 0
plugins/colorize/README.md

@@ -0,0 +1,35 @@
+# colorize
+
+With this plugin you can syntax-highlight file contents of over 300 supported languages and other text formats.
+
+Colorize will highlight the content based on the filename extension. If it can't find a syntax-highlighting
+method for a given extension, it will try to find one by looking at the file contents. If no highlight method
+is found it will just cat the file normally, without syntax highlighting.
+
+To use it, add colorize to the plugins array of your zshrc file:
+```
+plugins=(... colorize)
+```
+
+## Styles
+
+Pygments offers multiple styles. By default, the `default` style is used, but you can choose another theme by setting the `ZSH_COLORIZE_STYLE` environment variable:
+
+`ZSH_COLORIZE_STYLE="colorful"`
+
+## Usage
+
+* `ccat  <file> [files]`: colorize the contents of the file (or files, if more than one are provided). 
+  If no arguments are passed it will colorize the standard input or stdin.
+
+* `cless <file> [files]`: colorize the contents of the file (or files, if more than one are provided) and
+  open less. If no arguments are passed it will colorize the standard input or stdin.
+
+Note that `cless` will behave as less when provided more than one file: you have to navigate files with
+the commands `:n` for next and `:p` for previous. The downside is that less options are not supported.
+But you can circumvent this by either using the LESS environment variable, or by running `ccat file1 file2|less --opts`.
+In the latter form, the file contents will be concatenated and presented by less as a single file.
+
+## Requirements
+
+You have to install Pygments first: [pygments.org](http://pygments.org/download/)

+ 45 - 16
plugins/colorize/colorize.plugin.zsh

@@ -1,28 +1,57 @@
-# Plugin for highlighting file content
-# Plugin highlights file content based on the filename extension.
-# If no highlighting method supported for given extension then it tries 
-# guess it by looking for file content.
-
-alias colorize='colorize_via_pygmentize'
+# easier alias to use the plugin
+alias ccat='colorize_via_pygmentize'
+alias cless='colorize_via_pygmentize_less'
 
 colorize_via_pygmentize() {
-    if [ ! -x "$(which pygmentize)" ]; then
-        echo "package \'pygmentize\' is not installed!"
-        return -1
+    if ! (( $+commands[pygmentize] )); then
+        echo "package 'Pygments' is not installed!"
+        return 1
+    fi
+
+    # If the environment varianle ZSH_COLORIZE_STYLE
+    # is set, use that theme instead. Otherwise,
+    # use the default.
+    if [ -z $ZSH_COLORIZE_STYLE ]; then
+        ZSH_COLORIZE_STYLE="default"
     fi
 
+    # pygmentize stdin if no arguments passed
     if [ $# -eq 0 ]; then
-        pygmentize -g $@
+        pygmentize -O style="$ZSH_COLORIZE_STYLE" -g
+        return $?
     fi
 
-    for FNAME in $@
+    # guess lexer from file extension, or
+    # guess it from file contents if unsuccessful
+
+    local FNAME lexer
+    for FNAME in "$@"
     do
-        filename=$(basename "$FNAME")
-        lexer=`pygmentize -N \"$filename\"`
-        if [ "Z$lexer" != "Ztext" ]; then
-            pygmentize -l $lexer "$FNAME"
+        lexer=$(pygmentize -N "$FNAME")
+        if [[ $lexer != text ]]; then
+            pygmentize -O style="$ZSH_COLORIZE_STYLE" -l "$lexer" "$FNAME"
         else
-            pygmentize -g "$FNAME"
+            pygmentize -O style="$ZSH_COLORIZE_STYLE" -g "$FNAME"
         fi
     done
 }
+
+colorize_via_pygmentize_less() (
+    # this function is a subshell so tmp_files can be shared to cleanup function
+    declare -a tmp_files 
+
+    cleanup () {
+        [[ ${#tmp_files} -gt 0 ]] && rm -f "${tmp_files[@]}"
+        exit
+    }
+    trap 'cleanup' EXIT HUP TERM INT
+
+    while (( $# != 0 )); do     #TODO: filter out less opts
+        tmp_file="$(mktemp -t "tmp.colorize.XXXX.$(sed 's/\//./g' <<< "$1")")"
+        tmp_files+=("$tmp_file")
+        colorize_via_pygmentize "$1" > "$tmp_file"
+        shift 1
+    done
+
+    less -f "${tmp_files[@]}"
+)

+ 32 - 0
plugins/command-not-found/README.md

@@ -0,0 +1,32 @@
+# command-not-found plugin
+
+This plugin uses the command-not-found package for zsh to provide suggested packages to be installed if a command cannot be found.
+
+To use it, add `command-not-found` to the plugins array of your zshrc file:
+
+```zsh
+plugins=(... command-not-found)
+```
+
+An example of how this plugin works in Ubuntu:
+```
+$ mutt
+The program 'mutt' can be found in the following packages:
+ * mutt
+ * mutt-kz
+ * mutt-patched
+Try: sudo apt install <selected package>
+```
+
+### Supported platforms
+
+It works out of the box with the command-not-found packages for:
+
+- [Ubuntu](https://www.porcheron.info/command-not-found-for-zsh/)
+- [Debian](https://packages.debian.org/search?keywords=command-not-found)
+- [Arch Linux](https://wiki.archlinux.org/index.php/Pkgfile#Command_not_found)
+- [macOS (Homebrew)](https://github.com/Homebrew/homebrew-command-not-found)
+- [Fedora](https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound)
+- [NixOS](https://github.com/NixOS/nixpkgs/tree/master/nixos/modules/programs/command-not-found)
+
+You can add support for other platforms by submitting a Pull Request.

+ 8 - 1
plugins/command-not-found/command-not-found.plugin.zsh

@@ -1,5 +1,5 @@
 # Uses the command-not-found package zsh support
-# as seen in http://www.porcheron.info/command-not-found-for-zsh/
+# as seen in https://www.porcheron.info/command-not-found-for-zsh/
 # this is installed in Ubuntu
 
 [[ -e /etc/zsh_command_not_found ]] && source /etc/zsh_command_not_found
@@ -31,3 +31,10 @@ if type brew &> /dev/null; then
     eval "$(brew command-not-found-init)";
   fi
 fi
+
+# NixOS command-not-found support
+if [ -x /run/current-system/sw/bin/command-not-found ]; then
+    command_not_found_handler () {
+        /run/current-system/sw/bin/command-not-found $@
+    }
+fi

+ 121 - 0
plugins/common-aliases/README.md

@@ -0,0 +1,121 @@
+# Common Aliases Plugin
+
+This plugin creates helpful shortcut aliases for many commonly used commands.
+
+To use it add `common-aliases` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... common-aliases)
+```
+
+## Aliases
+
+### ls command
+
+| Alias | Command       | Description                                                                    |
+|-------|---------------|--------------------------------------------------------------------------------|
+| l     | `ls -lFh`     | List files as a long list, show size, type, human-readable                     |
+| la    | `ls -lAFh`    | List almost all files as a long list show size, type, human-readable           |
+| lr    | `ls -tRFh`    | List files recursively sorted by date, show type, human-readable               |
+| lt    | `ls -ltFh`    | List files as a long list sorted by date, show type, human-readable            |
+| ll    | `ls -l`       | List files as a long list                                                      |
+| ldot  | `ls -ld .*`   | List dot files as a long list                                                  |
+| lS    | `ls -1FSsh`   | List files showing only size and name sorted by size                           |
+| lart  | `ls -1Fcart`  | List all files sorted in reverse of create/modification time (oldest first)    |
+| lrt   | `ls -1Fcrt`   | List files sorted in reverse of create/modification time(oldest first)         |
+
+### File handling
+
+| Alias | Command               | Description                                                                        |
+|-------|-----------------------|------------------------------------------------------------------------------------|
+| rm    | `rm -i`               | Remove a file                                                                      |
+| cp    | `cp -i`               | Copy a file                                                                        |
+| mv    | `mv -i`               | Move a file                                                                        |
+| zshrc | `${=EDITOR} ~/.zshrc` | Quickly access the ~/.zshrc file                                                   |
+| dud   | `du -d 1 -h`          | Display the size of files at depth 1 in current location in human-readable form    |
+| duf   | `du -sh`              | Display the size of files in current location in human-readable form               |
+| t     | `tail -f`             | Shorthand for tail which outputs the last part of a file                           |
+
+### find and grep
+
+| Alias | Command                                             | Description                             |
+|-------|-----------------------------------------------------|-----------------------------------------|
+| fd    | `find . -type d -name`                              | Find a directory with the given name    |
+| ff    | `find . -type f -name`                              | Find a file with the given name         |
+| grep  | `grep --color`                                      | Searches for a query string             |
+| sgrep | `grep -R -n -H -C 5 --exclude-dir={.git,.svn,CVS}`  | Useful for searching within files       |
+
+### Other Aliases
+
+| Alias     | Command             | Description                                                 |
+|-----------|---------------------|-------------------------------------------------------------|
+| h         | `history`           | Lists all recently used commands                            |
+| hgrep     | `fc -El 0 \| grep`  | Searches for a word in the list of previously used commands |
+| help      | `man`               | Opens up the man page for a command                         |
+| p         | `ps -f`             | Displays currently executing processes                      |
+| sortnr    | `sort -n -r`        | Used to sort the lines of a text file                       |
+| unexport  | `unset`             | Used to unset an environment variable                       |
+
+## Global aliases
+
+These aliases are expanded in any position in the command line, meaning you can use them even at the
+end of the command you've typed. Examples:
+
+Quickly pipe to less:
+```zsh
+$ ls -l /var/log L
+# will run
+$ ls -l /var/log | less
+```
+Silences stderr output:
+```zsh
+$ find . -type f NE
+# will run
+$ find . -type f 2>/dev/null
+```
+
+| Alias | Command                     | Description                                                 |
+|-------|-----------------------------|-------------------------------------------------------------| 
+| H     | `\| head`                   | Pipes output to head which outputs the first part of a file |
+| T     | `\| tail`                   | Pipes output to tail which outputs the last part of a file  |
+| G     | `\| grep`                   | Pipes output to grep to search for some word                |
+| L     | `\| less`                   | Pipes output to less, useful for paging                     |
+| M     | `\| most`                   | Pipes output to more, useful for paging                     |
+| LL    | `2>&1 \| less`              | Writes stderr to stdout and passes it to less               |
+| CA    | `2>&1 \| cat -A`            | Writes stderr to stdout and passes it to cat                |
+| NE    | `2 > /dev/null`             | Silences stderr                                             |
+| NUL   | `> /dev/null 2>&1`          | Silences both stdout and stderr                             |
+| P     | `2>&1\| pygmentize -l pytb` | Writes stderr to stdout and passes it to pygmentize         |
+
+## File extension aliases
+
+These are special aliases that are triggered when a file name is passed as the command. For example,
+if the pdf file extension is aliased to `acroread` (a popular Linux pdf reader), when running `file.pdf`
+that file will be open with `acroread`.
+
+### Reading Docs
+
+| Alias | Command     | Description                         |
+|-------|-------------|-------------------------------------|
+| pdf   | `acroread`  | Opens up a document using acroread  |
+| ps    | `gv`        | Opens up a .ps file using gv        |
+| dvi   | `xdvi`      | Opens up a .dvi file using xdvi     | 
+| chm   | `xchm`      | Opens up a .chm file using xchm     |
+| djvu  | `djview`    | Opens up a .djvu file using djview  |
+
+### Listing files inside a packed file
+
+| Alias   | Command     | Description                         |
+|---------|-------------|-------------------------------------|
+| zip     | `unzip -l`  | Lists files inside a .zip file      |
+| rar     | `unrar l`   | Lists files inside a .rar file      |
+| tar     | `tar tf`    | Lists files inside a .tar file      |
+| tar.gz  | `echo`      | Lists files inside a .tar.gz file   |
+| ace     | `unace l`   | Lists files inside a .ace file      |
+
+### Some other features
+
+- Opens urls in terminal using browser specified by the variable `$BROWSER`
+- Opens C, C++, Tex and text files using editor specified by the variable `$EDITOR`
+- Opens images using image viewer specified by the variable `$XIVIEWER`
+- Opens videos and other media using mplayer

+ 12 - 11
plugins/common-aliases/common-aliases.plugin.zsh

@@ -13,7 +13,7 @@ alias lS='ls -1FSsh'
 alias lart='ls -1Fcart'
 alias lrt='ls -1Fcrt'
 
-alias zshrc='$EDITOR ~/.zshrc' # Quick access to the ~/.zshrc file
+alias zshrc='${=EDITOR} ~/.zshrc' # Quick access to the ~/.zshrc file
 
 alias grep='grep --color'
 alias sgrep='grep -R -n -H -C 5 --exclude-dir={.git,.svn,CVS} '
@@ -44,8 +44,6 @@ alias p='ps -f'
 alias sortnr='sort -n -r'
 alias unexport='unset'
 
-alias whereami=display_info
-
 alias rm='rm -i'
 alias cp='cp -i'
 alias mv='mv -i'
@@ -54,17 +52,21 @@ alias mv='mv -i'
 # depends on the SUFFIX :)
 if is-at-least 4.2.0; then
   # open browser on urls
-  _browser_fts=(htm html de org net com at cx nl se dk dk php)
-  for ft in $_browser_fts ; do alias -s $ft=$BROWSER ; done
+  if [[ -n "$BROWSER" ]]; then
+    _browser_fts=(htm html de org net com at cx nl se dk)
+    for ft in $_browser_fts; do alias -s $ft=$BROWSER; done
+  fi
 
   _editor_fts=(cpp cxx cc c hh h inl asc txt TXT tex)
-  for ft in $_editor_fts ; do alias -s $ft=$EDITOR ; done
+  for ft in $_editor_fts; do alias -s $ft=$EDITOR; done
 
-  _image_fts=(jpg jpeg png gif mng tiff tif xpm)
-  for ft in $_image_fts ; do alias -s $ft=$XIVIEWER; done
+  if [[ -n "$XIVIEWER" ]]; then
+    _image_fts=(jpg jpeg png gif mng tiff tif xpm)
+    for ft in $_image_fts; do alias -s $ft=$XIVIEWER; done
+  fi
 
-  _media_fts=(ape avi flv mkv mov mp3 mpeg mpg ogg ogm rm wav webm)
-  for ft in $_media_fts ; do alias -s $ft=mplayer ; done
+  _media_fts=(ape avi flv m4a mkv mov mp3 mpeg mpg ogg ogm rm wav webm)
+  for ft in $_media_fts; do alias -s $ft=mplayer; done
 
   #read documents
   alias -s pdf=acroread
@@ -83,4 +85,3 @@ fi
 
 # Make zsh know about hosts already accessed by SSH
 zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%[# ]*}//,/ })'
-

+ 8 - 0
plugins/compleat/README.md

@@ -0,0 +1,8 @@
+# compleat plugin
+
+This plugin looks for [compleat](https://github.com/mbrubeck/compleat) and loads its completion.
+
+To use it, add compleat to the plugins array in your zshrc file:
+```
+plugins=(... compleat)
+```

+ 29 - 0
plugins/composer/README.md

@@ -0,0 +1,29 @@
+# composer
+
+This plugin provides completion for [composer](https://getcomposer.org/), as well as aliases
+for frequent composer commands. It also adds Composer's global binaries to the PATH, using
+Composer if available.
+
+To use it add `composer` to the plugins array in your zshrc file.
+
+```zsh
+plugins=(... composer)
+```
+
+## Aliases
+
+| Alias  | Command                                      | Description                                                                            |
+| ------ | -------------------------------------------- | -------------------------------------------------------------------------------------- |
+| `c`    | composer                                     | Starts composer                                                                        |
+| `csu`  | composer self-update                         | Updates composer to the latest version                                                 |
+| `cu`   | composer update                              | Updates composer dependencies and `composer.lock` file                                 |
+| `cr`   | composer require                             | Adds new packages to `composer.json`                                                   |
+| `crm`  | composer remove                              | Removes packages from `composer.json`                                                  |
+| `ci`   | composer install                             | Resolves and installs dependencies from `composer.json`                                |
+| `ccp`  | composer create-project                      | Create new project from an existing package                                            |
+| `cdu`  | composer dump-autoload                       | Updates the autoloader                                                                 |
+| `cdo`  | composer dump-autoload --optimize-autoloader | Converts PSR-0/4 autoloading to classmap for a faster autoloader (good for production) |
+| `cgu`  | composer global update                       | Allows update command to run on COMPOSER_HOME directory                                |
+| `cgr`  | composer global require                      | Allows require command to run on COMPOSER_HOME directory                               |
+| `cgrm` | composer global remove                       | Allows remove command to run on COMPOSER_HOME directory                                |
+| `cget` | `curl -s https://getcomposer.org/installer`  | Installs composer in the current directory                                             |

+ 10 - 2
plugins/composer/composer.plugin.zsh

@@ -39,14 +39,22 @@ alias c='composer'
 alias csu='composer self-update'
 alias cu='composer update'
 alias cr='composer require'
+alias crm='composer remove'
 alias ci='composer install'
 alias ccp='composer create-project'
 alias cdu='composer dump-autoload'
+alias cdo='composer dump-autoload --optimize-autoloader'
 alias cgu='composer global update'
 alias cgr='composer global require'
+alias cgrm='composer global remove'
 
 # install composer in the current directory
 alias cget='curl -s https://getcomposer.org/installer | php'
 
-# Add Composer's global binaries to PATH
-export PATH=$PATH:~/.composer/vendor/bin
+# Add Composer's global binaries to PATH, using Composer if available.
+if (( $+commands[composer] )); then
+  export PATH=$PATH:$(composer global config bin-dir --absolute 2>/dev/null)
+else
+  [ -d $HOME/.composer/vendor/bin ] && export PATH=$PATH:$HOME/.composer/vendor/bin
+  [ -d $HOME/.config/composer/vendor/bin ] && export PATH=$PATH:$HOME/.config/composer/vendor/bin
+fi

+ 10 - 0
plugins/copydir/README.md

@@ -0,0 +1,10 @@
+# copydir plugin
+
+Copies the path of your current folder to the system clipboard.
+
+To use, add `copydir` to your plugins array:
+```
+plugins=(... copydir)
+```
+
+Then use the command `copydir` to copy the $PWD.

+ 10 - 0
plugins/copyfile/README.md

@@ -0,0 +1,10 @@
+# copyfile plugin
+
+Puts the contents of a file in your system clipboard so you can paste it anywhere.
+
+To use, add `copyfile` to your plugins array:
+```
+plugins=(... copyfile)
+```
+
+Then you can run the command `copyfile <filename>` to copy the file named `filename`.

+ 32 - 0
plugins/cp/README.md

@@ -0,0 +1,32 @@
+# cp plugin
+
+This plugin defines a `cpv` function that uses `rsync` so that you
+get the features and security of this command.
+
+To enable, add `cp` to your `plugins` array in your zshrc file:
+
+```zsh
+plugins=(... cp)
+```
+
+## Description
+
+The enabled options for rsync are:
+
+- `-p`: preserves permissions.
+
+- `-o`: preserves owner.
+
+* `-g`: preserves group.
+
+* `-b`: make a backup of the original file instead of overwriting it, if it exists.
+
+* `-r`: recurse directories.
+
+* `-hhh`: outputs numbers in human-readable format, in units of 1024 (K, M, G, T).
+
+* `--backup-dir=/tmp/rsync`: move backup copies to "/tmp/rsync".
+
+* `-e /dev/null`: only work on local files (disable remote shells).
+
+* `--progress`: display progress.

+ 4 - 14
plugins/cp/cp.plugin.zsh

@@ -1,14 +1,4 @@
-#Show progress while file is copying
-
-# Rsync options are:
-#  -p - preserve permissions
-#  -o - preserve owner
-#  -g - preserve group
-#  -h - output in human-readable format
-#  --progress - display progress
-#  -b - instead of just overwriting an existing file, save the original
-#  --backup-dir=/tmp/rsync - move backup copies to "/tmp/rsync"
-#  -e /dev/null - only work on local files
-#  -- - everything after this is an argument, even if it looks like an option
-
-alias cpv="rsync -poghb --backup-dir=/tmp/rsync -e /dev/null --progress --"
+cpv() {
+    rsync -pogbr -hhh --backup-dir=/tmp/rsync -e /dev/null --progress "$@"
+}
+compdef _files cpv

+ 9 - 0
plugins/cpanm/README.md

@@ -0,0 +1,9 @@
+# Cpanm
+
+This plugin provides completion for [Cpanm](https://github.com/miyagawa/cpanminus) ([docs](https://metacpan.org/pod/App::cpanminus)).
+ 
+To use it add cpanm to the plugins array in your zshrc file.
+ 
+ ```bash
+plugins=(... cpanm)
+```

+ 0 - 3
plugins/cpanm/_cpanm

@@ -6,9 +6,6 @@
 #
 # Current supported cpanm version: 1.4000 (Tue Mar  8 01:00:49 PST 2011)
 #
-# The latest code is always located at:
-#   https://github.com/rshhh/cpanminus/blob/master/etc/_cpanm
-#
 
 local arguments curcontext="$curcontext"
 typeset -A opt_args

+ 28 - 0
plugins/dash/README.md

@@ -0,0 +1,28 @@
+# Dash plugin
+
+This plugin adds command line functionality for [Dash](https://kapeli.com/dash),
+an API Documentation Browser for macOS. This plugin requires Dash to be installed
+to work.
+
+To use it, add `dash` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... dash)
+```
+
+## Usage
+
+- Open and switch to the dash application.
+```
+dash
+```
+
+- Query for something in dash app: `dash query`
+```
+dash golang 
+```
+
+- You can optionally provide a keyword: `dash [keyword:]query`
+```
+dash python:tuple
+```

+ 80 - 0
plugins/dash/dash.plugin.zsh

@@ -0,0 +1,80 @@
+# Usage: dash [keyword:]query
+dash() { open dash://"$*" }
+compdef _dash dash
+
+_dash() {
+  # No sense doing this for anything except the 2nd position and if we haven't
+  # specified which docset to query against
+  if [[ $CURRENT -eq 2 && ! "$words[2]" =~ ":" ]]; then
+    local -a _all_docsets
+    _all_docsets=()
+    # Use defaults to get the array of docsets from preferences
+    # Have to smash it into one big line so that each docset is an element of
+    # our DOCSETS array
+    DOCSETS=("${(@f)$(defaults read com.kapeli.dashdoc docsets | tr -d '\n' | grep -oE '\{.*?\}')}")
+
+    # remove all newlines since defaults prints so pretty like
+    # Now get each docset and output each on their own line
+    for doc in "$DOCSETS[@]"; do
+      # Only output docsets that are actually enabled
+      if [[ "`echo $doc | grep -Eo \"isEnabled = .*?;\" | sed 's/[^01]//g'`" == "0" ]]; then
+        continue
+      fi
+
+      keyword=''
+
+      # Order of preference as explained to me by @kapeli via email
+      KEYWORD_LOCATORS=(keyword suggestedKeyword platform)
+      for locator in "$KEYWORD_LOCATORS[@]"; do
+        # Echo the docset, try to find the appropriate keyword
+        # Strip doublequotes and colon from any keyword so that everything has the
+        # same format when output (we'll add the colon in the completion)
+        keyword=`echo $doc | grep -Eo "$locator = .*?;" | sed -e "s/$locator = \(.*\);/\1/" -e "s/[\":]//g"`
+        if [[ ! -z "$keyword" ]]; then
+          # if we fall back to platform, we should do some checking per @kapeli
+          if [[ "$locator" == "platform" ]]; then
+            # Since these are the only special cases right now, let's not do the
+            # expensive processing unless we have to
+            if [[ "$keyword" = (python|java|qt|cocos2d) ]]; then
+              docsetName=`echo $doc | grep -Eo "docsetName = .*?;" | sed -e "s/docsetName = \(.*\);/\1/" -e "s/[\":]//g"`
+              case "$keyword" in
+                python)
+                  case "$docsetName" in
+                    "Python 2") keyword="python2" ;;
+                    "Python 3") keyword="python3" ;;
+                  esac ;;
+                java)
+                  case "$docsetName" in
+                    "Java SE7") keyword="java7" ;;
+                    "Java SE6") keyword="java6" ;;
+                    "Java SE8") keyword="java8" ;;
+                  esac ;;
+                qt)
+                  case "$docsetName" in
+                    "Qt 5") keyword="qt5" ;;
+                    "Qt 4"|Qt) keyword="qt4" ;;
+                  esac ;;
+                cocos2d)
+                  case "$docsetName" in
+                    Cocos3D) keyword="cocos3d" ;;
+                  esac ;;
+              esac
+            fi
+          fi
+
+          # Bail once we have a match
+          break
+        fi
+      done
+
+      # If we have a keyword, add it to the list!
+      if [[ ! -z "$keyword" ]]; then
+        _all_docsets+=($keyword)
+      fi
+    done
+
+    # special thanks to [arx] on #zsh for getting me sorted on this piece
+    compadd -qS: -- "$_all_docsets[@]"
+    return
+  fi
+}

+ 85 - 0
plugins/debian/README.md

@@ -0,0 +1,85 @@
+# debian
+
+This plugin provides Debian-related aliases and functions for zsh.
+
+To use it add `debian` to the plugins array in your zshrc file.
+
+```zsh
+plugins=(... debian)
+```
+
+## Settings
+
+- `$apt_pref`: use apt or aptitude if installed, fallback is apt-get.
+- `$apt_upgr`: use upgrade or safe-upgrade (for aptitude).
+
+Set `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh My Zsh) to override this behavior.
+
+## Common Aliases
+
+| Alias  | Command                                                                | Description                                                |
+| ------ | ---------------------------------------------------------------------- | ---------------------------------------------------------- |
+| `age`  | `apt-get`                                                              | Command line tool for handling packages                    |
+| `api`  | `aptitude`                                                             | Same functionality as `apt-get`, provides extra options    |
+| `acs`  | `apt-cache search`                                                     | Command line tool for searching apt software package cache |
+| `aps`  | `aptitude search`                                                      | Searches installed packages using aptitude                 |
+| `as`   | `aptitude -F '* %p -> %d \n(%v/%V)' --no-gui --disable-columns search` | Print searched packages using a custom format              |
+| `afs`  | `apt-file search --regexp`                                             | Search file in packages                                    |
+| `asrc` | `apt-get source`                                                       | Fetch source packages through `apt-get`                    |
+| `app`  | `apt-cache policy`                                                     | Displays priority of package sources                       |
+
+## Superuser Operations Aliases
+
+| Alias    | Command                                                                                | Description                                                                                 |
+| -------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
+| `aac`    | `sudo $apt_pref autoclean`                                                             | Clears out the local repository of retrieved package files                                  |
+| `abd`    | `sudo $apt_pref build-dep`                                                             | Installs all dependencies for building packages                                             |
+| `ac`     | `sudo $apt_pref clean`                                                                 | Clears out the local repository of retrieved package files except lock files                |
+| `ad`     | `sudo $apt_pref update`                                                                | Updates the package lists for upgrades for packages                                         |
+| `adg`    | `sudo $apt_pref update && sudo $apt_pref $apt_upgr`                                    | Update and upgrade packages                                                                 |
+| `adu`    | `sudo $apt_pref update && sudo $apt_pref dist-upgrade`                                 | Smart upgrade that handles dependencies                                                     |
+| `afu`    | `sudo apt-file update`                                                                 | Update the files in packages                                                                |
+| `au`     | `sudo $apt_pref $apt_upgr`                                                             | Install package upgrades                                                                    |
+| `ai`     | `sudo $apt_pref install`                                                               | Command-line tool to install package                                                        |
+| `ail`    | `sed -e 's/  */ /g' -e 's/ *//' \| cut -s -d ' ' -f 1 \| xargs sudo $apt_pref install` | Install all packages given on the command line while using only the first word of each line |
+| `ap`     | `sudo $apt_pref purge`                                                                 | Removes packages along with configuration files                                             |
+| `ar`     | `sudo $apt_pref remove`                                                                | Removes packages, keeps the configuration files                                             |
+| `ads`    | `sudo apt-get dselect-upgrade`                                                         | Installs packages from list and removes all not in the list                                 |
+| `dia`    | `sudo dpkg -i ./*.deb`                                                                 | Install all .deb files in the current directory                                             |
+| `di`     | `sudo dpkg -i`                                                                         | Install all .deb files in the current directory                                             |
+| `kclean` | `sudo aptitude remove -P ?and(~i~nlinux-(ima\|hea) ?not(~n$(uname -r)))`               | Remove ALL kernel images and headers EXCEPT the one in use                                  |
+
+## Aliases - Commands using `su`
+
+| Alias | Command                                                   |
+| ----- | --------------------------------------------------------- |
+| `aac` | `su -ls "$apt_pref autoclean" root`                       |
+| `ac`  | `su -ls "$apt_pref clean" root`                           |
+| `ad`  | `su -lc "$apt_pref update" root`                          |
+| `adg` | `su -lc "$apt_pref update && aptitude $apt_upgr" root`    |
+| `adu` | `su -lc "$apt_pref update && aptitude dist-upgrade" root` |
+| `afu` | `su -lc "apt-file update"`                                |
+| `au`  | `su -lc "$apt_pref $apt_upgr" root`                       |
+| `dia` | `su -lc "dpkg -i ./*.deb" root`                           |
+
+## Miscellaneous Aliases
+
+| Alias     | Command                                        | Description                    |
+| --------- | ---------------------------------------------- | ------------------------------ |
+| `allpkgs` | `aptitude search -F "%p" --disable-columns ~i` | Display all installed packages |
+| `mydeb`   | `time dpkg-buildpackage -rfakeroot -us -uc`    | Create a basic .deb package    |
+
+## Functions
+
+| Function            | Description                                                     |
+| ------------------- | --------------------------------------------------------------- |
+| `apt-copy`          | Create a simple script that can be used to 'duplicate' a system |
+| `apt-history`       | Displays apt history for a command                              |
+| `kerndeb`           | Builds kernel packages                                          |
+| `apt-list-packages` | List packages by size                                           |
+
+## Authors
+
+- [@AlexBio](https://github.com/AlexBio)
+- [@dbb](https://github.com/dbb)
+- [@Mappleconfusers](https://github.com/Mappleconfusers)

+ 57 - 62
plugins/debian/debian.plugin.zsh

@@ -1,22 +1,21 @@
-# Authors:
-# https://github.com/AlexBio
-# https://github.com/dbb
-# https://github.com/Mappleconfusers
-#
-# Debian-related zsh aliases and functions for zsh
-
-# Use aptitude if installed, or apt-get if not.
+# Use apt or aptitude if installed, fallback is apt-get
 # You can just set apt_pref='apt-get' to override it.
-if [[ -e $( which -p aptitude 2>&1 ) ]]; then
-    apt_pref='aptitude'
-    apt_upgr='safe-upgrade'
-else
-    apt_pref='apt-get'
-    apt_upgr='upgrade'
+
+if [[ -z $apt_pref || -z $apt_upgr ]]; then
+    if [[ -e $commands[apt] ]]; then
+        apt_pref='apt'
+        apt_upgr='upgrade'
+    elif [[ -e $commands[aptitude] ]]; then
+        apt_pref='aptitude'
+        apt_upgr='safe-upgrade'
+    else
+        apt_pref='apt-get'
+        apt_upgr='upgrade'
+    fi
 fi
 
 # Use sudo by default if it's installed
-if [[ -e $( which -p sudo 2>&1 ) ]]; then
+if [[ -e $commands[sudo] ]]; then
     use_sudo=1
 fi
 
@@ -29,8 +28,7 @@ alias api='aptitude'
 # Some self-explanatory aliases
 alias acs="apt-cache search"
 alias aps='aptitude search'
-alias as="aptitude -F \"* %p -> %d \n(%v/%V)\" \
-		--no-gui --disable-columns search"	# search package
+alias as="aptitude -F '* %p -> %d \n(%v/%V)' --no-gui --disable-columns search"
 
 # apt-file
 alias afs='apt-file search --regexp'
@@ -43,60 +41,59 @@ alias app='apt-cache policy'
 # superuser operations ######################################################
 if [[ $use_sudo -eq 1 ]]; then
 # commands using sudo #######
-    alias aac='sudo $apt_pref autoclean'
-    alias abd='sudo $apt_pref build-dep'
-    alias ac='sudo $apt_pref clean'
-    alias ad='sudo $apt_pref update'
-    alias adg='sudo $apt_pref update && sudo $apt_pref $apt_upgr'
-    alias adu='sudo $apt_pref update && sudo $apt_pref dist-upgrade'
-    alias afu='sudo apt-file update'
-    alias ag='sudo $apt_pref $apt_upgr'
-    alias ai='sudo $apt_pref install'
+    alias aac="sudo $apt_pref autoclean"
+    alias abd="sudo $apt_pref build-dep"
+    alias ac="sudo $apt_pref clean"
+    alias ad="sudo $apt_pref update"
+    alias adg="sudo $apt_pref update && sudo $apt_pref $apt_upgr"
+    alias adu="sudo $apt_pref update && sudo $apt_pref dist-upgrade"
+    alias afu="sudo apt-file update"
+    alias au="sudo $apt_pref $apt_upgr"
+    alias ai="sudo $apt_pref install"
     # Install all packages given on the command line while using only the first word of each line:
     # acs ... | ail
-    alias ail="sed -e 's/  */ /g' -e 's/ *//' | cut -s -d ' ' -f 1 | "' xargs sudo $apt_pref install'
-    alias ap='sudo $apt_pref purge'
-    alias ar='sudo $apt_pref remove'
+    alias ail="sed -e 's/  */ /g' -e 's/ *//' | cut -s -d ' ' -f 1 | xargs sudo $apt_pref install"
+    alias ap="sudo $apt_pref purge"
+    alias ar="sudo $apt_pref remove"
 
     # apt-get only
-    alias ads='sudo apt-get dselect-upgrade'
+    alias ads="sudo apt-get dselect-upgrade"
 
     # Install all .deb files in the current directory.
     # Warning: you will need to put the glob in single quotes if you use:
     # glob_subst
-    alias dia='sudo dpkg -i ./*.deb'
-    alias di='sudo dpkg -i'
+    alias dia="sudo dpkg -i ./*.deb"
+    alias di="sudo dpkg -i"
 
     # Remove ALL kernel images and headers EXCEPT the one in use
-    alias kclean='sudo aptitude remove -P ?and(~i~nlinux-(ima|hea) \
-        ?not(~n`uname -r`))'
+    alias kclean='sudo aptitude remove -P ?and(~i~nlinux-(ima|hea) ?not(~n$(uname -r)))'
 
 
 # commands using su #########
 else
-    alias aac='su -ls \'$apt_pref autoclean\' root'
-    abd() {
+    alias aac="su -ls '$apt_pref autoclean' root"
+    function abd() {
         cmd="su -lc '$apt_pref build-dep $@' root"
         print "$cmd"
         eval "$cmd"
     }
-    alias ac='su -ls \'$apt_pref clean\' root'
-    alias ad='su -lc \'$apt_pref update\' root'
-    alias adg='su -lc \'$apt_pref update && aptitude $apt_upgr\' root'
-    alias adu='su -lc \'$apt_pref update && aptitude dist-upgrade\' root'
-    alias afu='su -lc "apt-file update"'
-    alias ag='su -lc \'$apt_pref $apt_upgr\' root'
-    ai() {
+    alias ac="su -ls '$apt_pref clean' root"
+    alias ad="su -lc '$apt_pref update' root"
+    alias adg="su -lc '$apt_pref update && aptitude $apt_upgr' root"
+    alias adu="su -lc '$apt_pref update && aptitude dist-upgrade' root"
+    alias afu="su -lc '$apt-file update'"
+    alias au="su -lc '$apt_pref $apt_upgr' root"
+    function ai() {
         cmd="su -lc 'aptitude -P install $@' root"
         print "$cmd"
         eval "$cmd"
     }
-    ap() {
+    function ap() {
         cmd="su -lc '$apt_pref -P purge $@' root"
         print "$cmd"
         eval "$cmd"
     }
-    ar() {
+    function ar() {
         cmd="su -lc '$apt_pref -P remove $@' root"
         print "$cmd"
         eval "$cmd"
@@ -108,8 +105,7 @@ else
     alias di='su -lc "dpkg -i" root'
 
     # Remove ALL kernel images and headers EXCEPT the one in use
-    alias kclean='su -lc '\''aptitude remove -P ?and(~i~nlinux-(ima|hea) \
-        ?not(~n`uname -r`))'\'' root'
+    alias kclean='su -lc "aptitude remove -P ?and(~i~nlinux-(ima|hea) ?not(~n$(uname -r)))" root'
 fi
 
 # Completion ################################################################
@@ -118,16 +114,16 @@ fi
 # Registers a compdef for $1 that calls $apt_pref with the commands $2
 # To do that it creates a new completion function called _apt_pref_$2
 #
-apt_pref_compdef() {
+function apt_pref_compdef() {
     local f fb
     f="_apt_pref_${2}"
 
     eval "function ${f}() {
-        shift words; 
-	service=\"\$apt_pref\"; 
-	words=(\"\$apt_pref\" '$2' \$words); 
-	((CURRENT++))
-	test \"\${apt_pref}\" = 'aptitude' && _aptitude || _apt
+        shift words;
+        service=\"\$apt_pref\";
+        words=(\"\$apt_pref\" '$2' \$words);
+        ((CURRENT++))
+        test \"\${apt_pref}\" = 'aptitude' && _aptitude || _apt
     }"
 
     compdef "$f" "$1"
@@ -138,7 +134,7 @@ apt_pref_compdef abd "build-dep"
 apt_pref_compdef ac  "clean"
 apt_pref_compdef ad  "update"
 apt_pref_compdef afu "update"
-apt_pref_compdef ag  "$apt_upgr"
+apt_pref_compdef au  "$apt_upgr"
 apt_pref_compdef ai  "install"
 apt_pref_compdef ail "install"
 apt_pref_compdef ap  "purge"
@@ -155,7 +151,7 @@ alias mydeb='time dpkg-buildpackage -rfakeroot -us -uc'
 
 # Functions #################################################################
 # create a simple script that can be used to 'duplicate' a system
-apt-copy() {
+function apt-copy() {
     print '#!/bin/sh'"\n" > apt-copy.sh
 
     cmd='$apt_pref install'
@@ -176,8 +172,8 @@ apt-copy() {
 #   apt-history remove
 #   apt-history rollback
 #   apt-history list
-# Based On: http://linuxcommando.blogspot.com/2008/08/how-to-show-apt-log-history.html
-apt-history () {
+# Based On: https://linuxcommando.blogspot.com/2008/08/how-to-show-apt-log-history.html
+function apt-history() {
   case "$1" in
     install)
       zgrep --no-filename 'install ' $(ls -rt /var/log/dpkg*)
@@ -192,7 +188,7 @@ apt-history () {
         awk '{print $4"="$5}'
       ;;
     list)
-      zcat $(ls -rt /var/log/dpkg*)
+      zgrep --no-filename '' $(ls -rt /var/log/dpkg*)
       ;;
     *)
       echo "Parameters:"
@@ -206,11 +202,11 @@ apt-history () {
 }
 
 # Kernel-package building shortcut
-kerndeb () {
+function kerndeb() {
     # temporarily unset MAKEFLAGS ( '-j3' will fail )
     MAKEFLAGS=$( print - $MAKEFLAGS | perl -pe 's/-j\s*[\d]+//g' )
     print '$MAKEFLAGS set to '"'$MAKEFLAGS'"
-	appendage='-custom' # this shows up in $ (uname -r )
+    appendage='-custom' # this shows up in $(uname -r )
     revision=$(date +"%Y%m%d") # this shows up in the .deb file name
 
     make-kpkg clean
@@ -220,10 +216,9 @@ kerndeb () {
 }
 
 # List packages by size
-function apt-list-packages {
+function apt-list-packages() {
     dpkg-query -W --showformat='${Installed-Size} ${Package} ${Status}\n' | \
     grep -v deinstall | \
     sort -n | \
     awk '{print $1" "$2}'
 }
-

+ 78 - 0
plugins/dircycle/README.md

@@ -0,0 +1,78 @@
+# dircycle
+
+Plugin for cycling through the directory stack
+
+This plugin enables directory navigation similar to using back and forward on browsers or common file explorers like Finder or Nautilus. It uses a small zle trick that lets you cycle through your directory stack left or right using <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> / <kbd>Right</kbd> . This is useful when moving back and forth between directories in development environments, and can be thought of as kind of a nondestructive pushd/popd.
+
+## Enabling the plugin
+
+1. Open your `.zshrc` file and add `dircycle` in the plugins section:
+
+   ```zsh
+   plugins=(
+       # all your enabled plugins
+       dircycle
+   )
+   ```
+
+2. Reload the source file or restart your Terminal session:
+
+   ```console
+   $ source ~/.zshrc
+   $
+   ```
+
+## Usage Examples
+
+Say you opened these directories on the terminal:
+
+```console
+~$ cd Projects
+~/Projects$ cd Hacktoberfest
+~/Projects/Hacktoberfest$ cd oh-my-zsh
+~/Projects/Hacktoberfest/oh-my-zsh$ dirs -v
+0       ~/Projects/Hacktoberfest/oh-my-zsh
+1       ~/Projects/Hacktoberfest
+2       ~/Projects
+3       ~
+```
+
+By pressing <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd>, the current working directory or `$CWD` will be from `oh-my-zsh` to `Hacktoberfest`. Press it again and it will be at `Projects`.
+
+And by pressing <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd>, the `$CWD` will be from `Projects` to `Hacktoberfest`. Press it again and it will be at `oh-my-zsh`.
+
+Here's a example history table with the same accessed directories like above:
+
+| Current `$CWD`  | Key press                                             | New `$CWD`      |
+| --------------- | ----------------------------------------------------- | --------------- |
+| `oh-my-zsh`     | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd>  | `Hacktoberfest` |
+| `Hacktoberfest` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd>  | `Projects`      |
+| `Projects`      | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd>  | `~`             |
+| `~`             | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `Projects`      |
+| `Projects`      | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `Hacktoberfest` |
+| `Hacktoberfest` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `oh-my-zsh`     |
+| `oh-my-zsh`     | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `~`             |
+
+Note the last traversal, when pressing <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> on a last known `$CWD`, it will change back to the first known `$CWD`, which in the example is `~`.
+
+Here's an asciinema cast demonstrating the example above:
+
+[![asciicast](https://asciinema.org/a/204406.png)](https://asciinema.org/a/204406)
+
+## Functions
+
+| Function             | Description                                                                                               |
+| -------------------- | --------------------------------------------------------------------------------------------------------- |
+| `insert-cycledleft`  | Change `$CWD` to the previous known stack, binded on <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> |
+| `insert-cycledright` | Change `$CWD` to the next known stack, binded on <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd>    |
+
+## Rebinding keys
+
+You can bind these functions to other key sequences, as long as you know the bindkey sequence. For example, these commands bind to <kbd>Alt</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> / <kbd>Right</kbd> in `xterm-256color`:
+
+```zsh
+bindkey '^[[1;4D' insert-cycledleft
+bindkey '^[[1;4C' insert-cycledright
+```
+
+You can get the bindkey sequence by pressing <kbd>Ctrl</kbd> + <kbd>V</kbd>, then pressing the keyboard shortcut you want to use.

+ 14 - 7
plugins/dircycle/dircycle.plugin.zsh

@@ -9,29 +9,36 @@
 #  pushd -N: start counting from right of `dirs' output
 
 switch-to-dir () {
+	setopt localoptions nopushdminus
+	[[ ${#dirstack} -eq 0 ]] && return 1
+
 	while ! builtin pushd -q $1 &>/dev/null; do
 		# We found a missing directory: pop it out of the dir stack
 		builtin popd -q $1
 
 		# Stop trying if there are no more directories in the dir stack
-		[[ ${#dirstack} -eq 0 ]] && break
+		[[ ${#dirstack} -eq 0 ]] && return 1
 	done
 }
 
 insert-cycledleft () {
-	emulate -L zsh
-	setopt nopushdminus
+	switch-to-dir +1 || return
 
-	switch-to-dir +1
+	local fn
+	for fn (chpwd $chpwd_functions precmd $precmd_functions); do
+		(( $+functions[$fn] )) && $fn
+	done
 	zle reset-prompt
 }
 zle -N insert-cycledleft
 
 insert-cycledright () {
-	emulate -L zsh
-	setopt nopushdminus
+	switch-to-dir -0 || return
 
-	switch-to-dir -0
+	local fn
+	for fn (chpwd $chpwd_functions precmd $precmd_functions); do
+		(( $+functions[$fn] )) && $fn
+	done
 	zle reset-prompt
 }
 zle -N insert-cycledright

+ 0 - 0
plugins/dirhistory/README.md


部分文件因为文件数量过多而无法显示