diff --git a/.gitmodules b/.gitmodules
index 051f2633..301ae41f 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -16,7 +16,7 @@
 [submodule "modules/prompt/external/agnoster"]
 	path = modules/prompt/external/agnoster
 	url = https://github.com/agnoster/agnoster-zsh-theme.git
-[submodule "modules/prompt/functions/pure"]
+[submodule "modules/prompt/external/pure"]
 	path = modules/prompt/external/pure
 	url = https://github.com/sindresorhus/pure.git
 [submodule "modules/fasd/external"]
@@ -25,6 +25,7 @@
 [submodule "modules/prompt/external/async"]
 	path = modules/prompt/external/async
 	url = https://github.com/mafredri/zsh-async.git
-[submodule "modules/prompt/external/powerlevel9k"]
-	path = modules/prompt/external/powerlevel9k
-	url = https://github.com/bhilburn/powerlevel9k.git
+[submodule "modules/prompt/external/powerlevel10k"]
+	path = modules/prompt/external/powerlevel10k
+	url = https://github.com/romkatv/powerlevel10k.git
+	shallow = true
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f4dc0d61..6bcb36ba 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,42 +1,41 @@
-Contributing
-------------
+# Contributing
 
 This project would not exist without all of its users and [contributors][1].
 
 If you have ideas on how to make the configuration easier to maintain or
 improve its performance, do not hesitate to fork and send pull requests.
 
-### Issue Reporting
+## Issue Reporting
 
-   - Check that the issue has not already been reported.
-   - Check that the issue has not already been fixed in the latest code.
-   - Open an issue with a clear title and description in grammatically correct,
-     complete sentences.
+- Check that the issue has not already been reported.
+- Check that the issue has not already been fixed in the latest code.
+- Open an issue with a clear title and description in grammatically correct,
+  complete sentences.
 
-### Pull Request
+## Pull Request
 
-   - Read [how to properly contribute to open source projects on GitHub][2].
-   - Use a topic branch to easily amend a pull request later, if necessary.
-   - Write [good commit messages][3].
-   - Squash commits on the topic branch before opening a pull request.
-   - Use the same coding style and spacing.
-   - Open a [pull request][4] that relates to but one subject with a clear
-     title and description in grammatically correct, complete sentences.
+- Read [how to properly contribute to open source projects on GitHub][2].
+- Use a topic branch to easily amend a pull request later, if necessary.
+- Write [good commit messages][3].
+- Squash commits on the topic branch before opening a pull request.
+- Use the same coding style and spacing.
+- Open a [pull request][4] that relates to but one subject with a clear title
+  and description in grammatically correct, complete sentences.
 
-#### Code Style
+### Code Style
 
 This project follows the [Google Shell Style Guide][5] when possible. However,
 there are a number of additional things to keep in mind.
 
-   - Local variables should be used whenever possible.
-   - Prefer `zstyle` over environment variables for configuration.
-   - Prefer (( ... )) over [[ ... ]] for arithmetic expression.
-   - Use the function keyword to define functions.
-   - The 80 character hard limit can be waived for readability.
+- Local variables should be used whenever possible.
+- Prefer `zstyle` over environment variables for configuration.
+- Prefer (( ... )) over [[ ... ]] for arithmetic expression.
+- Use the function keyword to define functions.
+- The 80 character hard limit can be waived for readability.
 
-#### Using an Alternative zprezto Directory
+### Using an Alternative *zprezto* Directory
 
-To work on zprezto without messing with your current configuration:
+To work on Prezto without affecting your current configuration:
 
 ```sh
 mkdir devel-zprezto
@@ -52,24 +51,24 @@ done
 
 Then to start zsh in this development environment you will run:
 
-```sh
+```console
 ZDOTDIR=/path/to/devel-zprezto zsh
 ```
 
-#### Modules
+### Modules
 
-   - A *README.md* must be present.
-   - Large functions must be placed in a *functions* directory.
-   - Functions that take arguments must have completion.
+- A *README.md* must be present.
+- Large functions must be placed in a *functions* directory.
+- Functions that take arguments must have completion.
 
-#### Themes
+### Themes
 
-   - A screenshots section must be present in the file header.
-   - The pull request description must have [embedded screenshots][6].
+- A screenshots section must be present in the file header.
+- The pull request description must have [embedded screenshots][6].
 
 [1]: https://github.com/sorin-ionescu/prezto/contributors
-[2]: http://gun.io/blog/how-to-github-fork-branch-and-pull-request
+[2]: https://gun.io/blog/how-to-github-fork-branch-and-pull-request
 [3]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
 [4]: https://help.github.com/articles/using-pull-requests
 [5]: https://google.github.io/styleguide/shell.xml
-[6]: http://daringfireball.net/projects/markdown/syntax#img
+[6]: https://github.github.com/gfm/#images
diff --git a/README.md b/README.md
index 18bcfcce..40163fa8 100644
--- a/README.md
+++ b/README.md
@@ -1,131 +1,160 @@
-Prezto — Instantly Awesome Zsh
-==============================
+# Prezto — Instantly Awesome Zsh
 
 Prezto is the configuration framework for [Zsh][1]; it enriches the command line
 interface environment with sane defaults, aliases, functions, auto completion,
 and prompt themes.
 
-Installation
-------------
+## Installation
+
+### Manual
 
 Prezto will work with any recent release of Zsh, but the minimum required
-version is 4.3.11.
+version is **4.3.11**.
 
-  1. Launch Zsh:
+01. Launch Zsh:
 
-     ```console
-     zsh
-     ```
+    ```console
+    zsh
+    ```
 
-  2. Clone the repository:
+02. Clone the repository:
 
-     ```console
-     git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
-     ```
+    ```console
+    git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
+    ```
 
-  3. Create a new Zsh configuration by copying the Zsh configuration files
-     provided:
+    <details>
+      <summary><em>Optional: Installing in <code>$XDG_CONFIG_HOME</code></em></summary>
 
-     ```sh
-     setopt EXTENDED_GLOB
-     for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
-       ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
-     done
-     ```
+      Optionally, if you already have `$XDG_CONFIG_HOME` configured (usually as
+      _`$HOME/.config`_ by default) and intend to install Prezto under
+      _`$XDG_CONFIG_HOME/zsh`_ instead, you can clone the repository there and
+      configure `$ZDOTDIR` separately if not already configured.
 
-     Note: If you already have any of the given config files, ln will error. In
-     simple cases you can add `source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"` to
-     the bottom of your `.zshrc` to load prezto but keep your config intact. For
-     more complicated setups, it is recommended that you back up your original
-     configs and replace them with the provided prezto runcoms.
+      - Clone the repository:
 
-  4. Set Zsh as your default shell:
+        ```console
+        git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-${XDG_CONFIG_HOME:-$HOME/.config}/zsh}/.zprezto"
+        ```
 
-     ```console
-     chsh -s /bin/zsh
-     ```
+      - Configure `$XDG_CONFIG_HOME` and `$ZDOTDIR` in _`$HOME/.zshenv`_:
 
-  5. Open a new Zsh terminal window or tab.
+        ```sh
+        export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:=$HOME/.config}"
+        [[ -d $XDG_CONFIG_HOME/zsh ]] && export ZDOTDIR="$XDG_CONFIG_HOME/zsh"
+        source "$ZDOTDIR/.zshenv"
+        ```
+
+    </details>
+
+03. Create a new Zsh configuration by copying/linking the Zsh configuration
+    files provided:
+
+    ```console
+    setopt EXTENDED_GLOB
+    for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
+      ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
+    done
+    ```
+
+    **Note:** If you already have any of the given configuration files, `ln` in
+    the above operation will cause an error. In simple cases, you can load
+    Prezto by adding the line `source "${ZDOTDIR:-$HOME}/.zprezto/init.zsh"` to
+    the bottom of your _`${ZDOTDIR:-$HOME}/.zshrc`_ and keep the rest of your
+    Zsh configuration intact. For more complicated setups, we recommend that you
+    back up your original configs and replace them with the provided Prezto
+    [_`runcoms`_][10].
+
+04. Set Zsh as your default shell:
+
+    ```console
+    chsh -s /bin/zsh
+    ```
+
+05. Open a new Zsh terminal window or tab.
 
 ### Troubleshooting
 
-If you are not able to find certain commands after switching to *Prezto*,
-modify the `PATH` variable in *~/.zprofile* then open a new Zsh terminal
-window or tab.
+If you are not able to find certain commands after switching to Prezto, modify
+the `PATH` variable in _`${ZDOTDIR:-$HOME}/.zprofile`_ then open a new Zsh
+terminal window or tab.
 
-Updating
---------
+## Updating
 
-Run `zprezto-update` to automatically check if there is an update to zprezto.
-If there are no file conflicts, zprezto and its submodules will be
-automatically updated. If there are conflicts you will instructed to go into
-the `$ZPREZTODIR` directory and resolve them yourself.
+Run `zprezto-update` to automatically check if there is an update to Prezto.
+If there are no file conflicts, Prezto and its submodules will be automatically
+updated. If there are conflicts you will be instructed to go into the
+`$ZPREZTODIR` directory and resolve them yourself.
 
 To pull the latest changes and update submodules manually:
 
 ```console
 cd $ZPREZTODIR
 git pull
+git submodule sync --recursive
 git submodule update --init --recursive
 ```
 
-Usage
------
+## Usage
 
-Prezto has many features disabled by default. Read the source code and
-accompanying README files to learn of what is available.
+Prezto has many features disabled by default. Read the source code and the
+accompanying README files to learn about what is available.
 
 ### Modules
 
-  1. Browse */modules* to see what is available.
-  2. Load the modules you need in *~/.zpreztorc* then open a new Zsh terminal
-     window or tab.
+01. Browse [_`modules`_][9] to see what is available.
+02. Load the modules you need in _`${ZDOTDIR:-$HOME}/.zpreztorc`_ and then open
+    a new Zsh terminal window or tab.
 
 ### Themes
 
-  1. For a list of themes, type `prompt -l`.
-  2. To preview a theme, type `prompt -p name`.
-  3. Load the theme you like in *~/.zpreztorc* then open a new Zsh terminal
-     window or tab.
+01. For a list of themes, type `prompt -l`.
+02. To preview a theme, type `prompt -p name`.
+03. Load the theme you like in _`${ZDOTDIR:-$HOME}/.zpreztorc`_ and then
+    open a new Zsh terminal window or tab.
 
-     ![sorin theme][2]
+    ![sorin theme][2]
+    Note that the [_`git`_][11] module may be required for special symbols to
+    appear, such as those on the right of the above image. Add `'git'` to the
+    `pmodule` list (under `zstyle ':prezto:load' pmodule \` in your
+    _`${ZDOTDIR:-$HOME}/.zpreztorc`_) to enable this module.
 
 ### External Modules
 
-  1. By default modules will be loaded from */modules* and */contrib*.
-  2. Additional module directories can be added to the
-     `:prezto:load:pmodule-dirs` setting in *~/.zpreztorc*.
+01. By default modules will be loaded from [_`/modules`_][9] and _`/contrib`_.
+02. Additional module directories can be added to the
+    `:prezto:load:pmodule-dirs` setting in _`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
-     Note that module names need to be unique or they will cause an error when
-     loading.
+    Note that module names need to be unique or they will cause an error when
+    loading.
 
-     ```console
-     zstyle ':prezto:load' pmodule-dirs $HOME/.zprezto-contrib
-     ```
+    ```sh
+    zstyle ':prezto:load' pmodule-dirs $HOME/.zprezto-contrib
+    ```
 
-Customization
--------------
+## Customization
 
-The project is managed via [Git][3]. It is highly recommended that you fork this
-project; so, that you can commit your changes and push them to [GitHub][4] to
-not lose them. If you do not know how to use Git, follow this [tutorial][5] and
-bookmark this [reference][6].
+The project is managed via [Git][3]. We highly recommend that you fork this
+project so that you can commit your changes and push them to your fork on
+[GitHub][4] to preserve them. If you do not know how to use Git, follow this
+[tutorial][5] and bookmark this [reference][6].
 
-Resources
----------
+## Resources
 
 The [Zsh Reference Card][7] and the [zsh-lovers][8] man page are indispensable.
 
-License
--------
+## License
 
 This project is licensed under the MIT License.
 
-[1]: http://www.zsh.org
-[2]: http://i.imgur.com/nrGV6pg.png "sorin theme"
-[3]: http://git-scm.com
+[1]: https://www.zsh.org
+[2]: https://i.imgur.com/nrGV6pg.png "sorin theme"
+[3]: https://git-scm.com
 [4]: https://github.com
-[5]: http://gitimmersion.com
-[6]: http://gitref.org
+[5]: https://gitimmersion.com
+[6]: https://git.github.io/git-reference/
 [7]: http://www.bash2zsh.com/zsh_refcard/refcard.pdf
-[8]: http://grml.org/zsh/zsh-lovers.html
+[8]: https://grml.org/zsh/zsh-lovers.html
+[9]: modules#readme
+[10]: runcoms#readme
+[11]: modules/git#readme
diff --git a/init.zsh b/init.zsh
index 99254bdb..5d7996af 100644
--- a/init.zsh
+++ b/init.zsh
@@ -44,7 +44,8 @@ function zprezto-update {
         printf "There is an update available. Trying to pull.\n\n"
         if git pull --ff-only; then
           printf "Syncing submodules\n"
-          git submodule update --recursive
+          git submodule sync --recursive
+          git submodule update --init --recursive
           return $?
         else
           cannot-fast-forward
@@ -98,18 +99,20 @@ function pmodload {
     else
       locations=(${pmodule_dirs:+${^pmodule_dirs}/$pmodule(-/FN)})
       if (( ${#locations} > 1 )); then
-        print "$0: conflicting module locations: $locations"
-        continue
+        if ! zstyle -t ':prezto:load' pmodule-allow-overrides 'yes'; then
+          print "$0: conflicting module locations: $locations"
+          continue
+        fi
       elif (( ${#locations} < 1 )); then
         print "$0: no such module: $pmodule"
         continue
       fi
 
       # Grab the full path to this module
-      pmodule_location=${locations[1]}
+      pmodule_location=${locations[-1]}
 
       # Add functions to $fpath.
-      fpath=(${pmodule_location}/functions(/FN) $fpath)
+      fpath=(${pmodule_location}/functions(-/FN) $fpath)
 
       function {
         local pfunction
@@ -180,6 +183,9 @@ zstyle -a ':prezto:load' zmodule 'zmodules'
 for zmodule ("$zmodules[@]") zmodload "zsh/${(z)zmodule}"
 unset zmodule{s,}
 
+# Load more specific 'run-help' function from $fpath.
+(( $+aliases[run-help] )) && unalias run-help && autoload -Uz run-help
+
 # Autoload Zsh functions.
 zstyle -a ':prezto:load' zfunction 'zfunctions'
 for zfunction ("$zfunctions[@]") autoload -Uz "$zfunction"
diff --git a/modules/README.md b/modules/README.md
index 1ff4e612..cc9dfb15 100644
--- a/modules/README.md
+++ b/modules/README.md
@@ -1,206 +1,166 @@
-Modules
-=======
+# Modules
 
-Load modules in *zpreztorc*. The order matters.
+Load modules in _`${ZDOTDIR:-$HOME}/.zpreztorc`_. The order matters.
 
 ```sh
 zstyle ':prezto:load' pmodule 'environment' 'terminal'
 ```
 
-Archive
--------
+## Archive
 
 Provides functions to list and extract archives.
 
-Autosuggestions
----------------
+## Autosuggestions
 
 Integrates zsh-autosuggestions into Prezto.
 
-Command-Not-Found
------------------
+## Command-Not-Found
 
 Loads the command-not-found tool on macOS or Debian-based distributions.
 
-Completion
-----------
+## Completion
 
-Loads and configures tab completion and provides additional completions from
-the zsh-completions project.
+Loads and configures <kbd>TAB</kbd> completion and provides additional
+completions from the zsh-completions project.
 
-Directory
----------
+## Directory
 
 Sets directory options and defines directory aliases.
 
-DNF
----
+## DNF
 
-Defines dnf aliases.
+Defines _dnf_ aliases.
 
-Dpkg
-----
+## Dpkg
 
-Defines dpkg aliases and functions.
+Defines _dpkg_ aliases and functions.
 
-Editor
-------
+## Editor
 
 Sets key bindings.
 
-Emacs
------
+## Emacs
 
 Enables Emacs dependency management.
 
-Environment
------------
+## Environment
 
 Sets general shell options and defines environment variables.
 
-Fasd
-----
+## Fasd
 
 Maintains a frequently used file and directory list for fast access.
 
-Git
----
+## Git
 
 Enhances the Git distributed version control system by providing aliases,
 functions and by exposing repository status information to prompts.
 
-GNU Utility
------------
+## GNU Utility
 
 Provides for the interactive use of GNU utilities on non-GNU systems.
 
-GPG
----
+## GPG
 
 Provides for an easier use of GPG by setting up gpg-agent.
 
-Haskell
--------
+## Haskell
 
 Enables local Haskell package installation.
 
-Helper
-------
+## Helper
 
 Provides helper functions for developing modules.
 
-History
--------
+## History
 
 Sets history options and defines history aliases.
 
-History Substring Search
-------------------------
+## History Substring Search
 
 Integrates zsh-history-substring-search into Prezto.
 
-Homebrew
---------
+## Homebrew
 
 Defines Homebrew aliases.
 
-MacPorts
---------
+## MacPorts
 
 Defines MacPorts aliases and adds MacPorts directories to path variables.
 
-Node.js
--------
+## Node.js
 
 Provides utility functions for Node.js and loads npm completion.
 
-OCaml
------
+## OCaml
 
 Initializes OCaml package management.
 
-OSX
----
+## OSX
 
 Defines macOS aliases and functions.
 
-Pacman
-------
+## Pacman
 
 Provides aliases and functions for the Pacman package manager and frontends.
 
-Perl
-----
+## Perl
 
 Enables local Perl module installation on macOS and defines alises.
 
-Prompt
-------
+## Prompt
 
 Loads prompt themes.
 
-Python
-------
+## Python
 
 Enables local Python and local Python package installation.
 
-Ruby on Rails
--------------
+## Ruby on Rails
 
 Defines Ruby on Rails aliases.
 
-Rsync
------
+## Rsync
 
 Defines rsync aliases.
 
-Ruby
-----
+## Ruby
 
 Configures Ruby local gem installation, loads version managers, and defines
 aliases.
 
-GNU Screen
-----------
+## GNU Screen
 
 Defines GNU Screen aliases and provides for auto launching it at start-up.
 
-Spectrum
---------
+## Spectrum
 
 Provides for easier use of 256 colors and effects.
 
-SSH
----
+## SSH
 
 Provides for an easier use of SSH by setting up ssh-agent.
 
-Syntax Highlighting
--------------------
+## Syntax Highlighting
 
 Integrates zsh-syntax-highlighting into Prezto.
 
-Terminal
---------
+## Terminal
 
 Sets terminal window and tab titles.
 
-Tmux
-----
+## Tmux
 
 Defines tmux aliases and provides for auto launching it at start-up.
 
-Utility
--------
+## Utility
 
 Defines general aliases and functions.
 
-Wake-on-LAN
------------
+## Wake-on-LAN
 
 This module provides a wrapper around the wakeonlan tool.
 
-Yum
----
+## Yum
 
 Defines yum aliases.
diff --git a/modules/archive/README.md b/modules/archive/README.md
index 600ff15d..be637880 100644
--- a/modules/archive/README.md
+++ b/modules/archive/README.md
@@ -1,52 +1,53 @@
-Archive
-=======
+# Archive
 
 Provides functions to create, list, and extract archives.
 
-Functions
----------
+This module must be loaded _before_ the [_`completion`_][1] module so that the
+provided completion definitions are loaded automatically by _`completion`_
+module.
 
-  - `archive` creates an archive based on the provided archive name.
-  - `lsarchive` lists the contents of one or more archives.
-  - `unarchive` extracts the contents of one or more archives.
+## Functions
 
-Supported Formats
------------------
+- `archive` creates an archive based on the provided archive name.
+- `lsarchive` lists the contents of one or more archives.
+- `unarchive` extracts the contents of one or more archives.
+
+## Supported Formats
 
 The following archive formats are supported when the required utilities are
 installed:
 
-  - *.tar.gz*, *.tgz* require `tar` (optionally `pigz`).
-  - *.tar.bz2*, *.tbz* require `tar` (optionally `pbzip2`).
-  - *.tar.xz*, *.txz* require `tar` with *xz* support.
-  - *.tar.zma*, *.tlz* require `tar` with *lzma* support.
-  - *.tar* requires `tar`.
-  - *.gz* requires `gunzip`.
-  - *.bz2* requires `bunzip2`.
-  - *.xz* requires `unxz`.
-  - *.lzma* requires `unlzma`.
-  - *.Z* requires `uncompress`.
-  - *.zip*, *.jar* requires `unzip`.
-  - *.rar* requires `rar` (needed for `archive` support), `unrar` or `lsar` and `unar`.
-  - *.7z* requires `7za`.
-  - *.deb* requires `ar`, `tar`.
+- _.tar.gz_, _.tgz_ require `tar` (optionally `pigz`).
+- _.tar.bz2_, _.tbz_ require `tar` (optionally `pbzip2`).
+- _.tar.xz_, _.txz_ require `tar` with _xz_ support.
+- _.tar.zma_, _.tlz_ require `tar` with _lzma_ support.
+- _.tar_ requires `tar`.
+- _.gz_ requires `gunzip`.
+- _.bz2_ requires `bunzip2`.
+- _.xz_ requires `unxz`.
+- _.lzma_ requires `unlzma`.
+- _.Z_ requires `uncompress`.
+- _.zip_, _.jar_ requires `unzip`.
+- _.rar_ requires `rar` (needed for `archive` support), `unrar` or `lsar` and `unar`.
+- _.7z_ requires `7za`.
+- _.deb_ requires `ar`, `tar`.
 
-Additionally, if `pigz` and/or `pbzip2` are installed, `archive` will use them over
-their traditional counterparts, `gzip` and `bzip2` respectively, to take full advantage
-of all available CPU cores for compression.
+Additionally, if `pigz` and/or `pbzip2` are installed, `archive` will use them
+over their traditional counterparts, `gzip` and `bzip2` respectively, to take
+full advantage of all available CPU cores for compression.
 
-Alternatives
-------------
+## Alternatives
 
-Specifically on macOS, [The Unarchiver][1] provides a similar command line tool
+Specifically on macOS, [The Unarchiver][2] provides a similar command line tool
 which doesn't depend on a number of other programs being installed.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][1].*
+_The authors of this module should be contacted via the [issue tracker][3]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
-  - [Matt Hamilton](https://github.com/Eriner)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Matt Hamilton](https://github.com/Eriner)
 
-[1]: https://theunarchiver.com/command-line
+[1]: ../completion#readme
+[2]: https://theunarchiver.com/command-line
+[3]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/archive/functions/_lsarchive b/modules/archive/functions/_lsarchive
index f2cee881..bcbfbd69 100644
--- a/modules/archive/functions/_lsarchive
+++ b/modules/archive/functions/_lsarchive
@@ -10,4 +10,4 @@
 
 _arguments \
   '(-v --verbose)'{-v,--remove}'[verbose archive listing]' \
-  "*::archive file:_files -g '(#i)*.(tar|tgz|tbz|tbz2|txz|tlz|gz|bz2|xz|lzma|Z|zip|jar|rar|7z)(-.)'" && return 0
+  "*::archive file:_files -g '(#i)*.(tar|tgz|tbz|tbz2|txz|tlz|gz|bz2|xz|lzma|Z|zip|zst|jar|rar|7z)(-.)'" && return 0
diff --git a/modules/archive/functions/_unarchive b/modules/archive/functions/_unarchive
index 90e32f1a..6a940b11 100644
--- a/modules/archive/functions/_unarchive
+++ b/modules/archive/functions/_unarchive
@@ -10,4 +10,4 @@
 
 _arguments \
   '(-r --remove)'{-r,--remove}'[remove archive]' \
-  "*::archive file:_files -g '(#i)*.(tar|tgz|tbz|tbz2|txz|tlz|gz|bz2|xz|lzma|Z|zip|jar|rar|7z|deb)(-.)'" && return 0
+  "*::archive file:_files -g '(#i)*.(tar|tgz|tbz|tbz2|txz|tlz|gz|bz2|xz|lzma|Z|zip|zst|jar|rar|7z|deb)(-.)'" && return 0
diff --git a/modules/archive/functions/archive b/modules/archive/functions/archive
index 0e3bb616..b6f95231 100644
--- a/modules/archive/functions/archive
+++ b/modules/archive/functions/archive
@@ -1,4 +1,3 @@
-#!/usr/bin/env zsh
 #
 # Creates archive file
 #
@@ -8,15 +7,15 @@
 
 # function archive {
 
-local archive_name dir_to_archive _gzip_bin _bzip2_bin
+local archive_name path_to_archive _gzip_bin _bzip2_bin _xz_bin _zstd_bin
 
-if (( $# != 2 )); then
+if (( $# < 2 )); then
   cat >&2 <<EOF
-usage: $0 [archive_name.zip] [/path/to/include/into/archive]
+usage: $0 [archive_name.zip] [/path/to/include/into/archive ...]
 
 Where 'archive.zip' uses any of the following extensions:
 
-.tar.gz, .tar.bz2, .tar.xz, .tar.lzma, .tar, .zip, .rar, .7z
+.tar.gz, .tar.bz2, .tar.xz, .tar.lzma, .tar.zst, .tar, .zip, .rar, .7z
 
 There is no '-v' switch; all operations are verbose.
 EOF
@@ -28,14 +27,8 @@ fi
 
 # strip the path, just in case one is provided for some reason
 archive_name="${1:t}"
-# use absolute paths, and follow symlinks
-dir_to_archive="${2}"
-
-# if the directory doesn't exist, quit. Nothing to archive
-if [[ ! -e "${dir_to_archive}" ]]; then
-  print "$0: file or directory not valid: ${dir_to_archive}" >&2
-  return 1
-fi
+# let paths be handled by actual archive helper
+path_to_archive="${@:2}"
 
 # here, we check for dropin/multi-threaded replacements
 # this should eventually be moved to modules/archive/init.zsh
@@ -46,21 +39,32 @@ else
   _gzip_bin='gzip'
 fi
 
-if (( $+commands[pbzip2] )); then
+if (( $+commands[pixz] )); then
+  _xz_bin='pixz'
+else
+  _xz_bin='xz'
+fi
+
+if (( $+commands[lbzip2] )); then
+  _bzip2_bin='lbzip2'
+elif (( $+commands[pbzip2] )); then
   _bzip2_bin='pbzip2'
 else
   _bzip2_bin='bzip2'
 fi
 
+_zstd_bin='zstd'
+
 case "${archive_name}" in
-  (*.tar.gz|*.tgz) tar -cvf "${archive_name}" --use-compress-program="${_gzip_bin}" "${dir_to_archive}" ;;
-  (*.tar.bz2|*.tbz|*.tbz2) tar -cvf "${archive_name}" --use-compress-program="${_bzip2_bin}" "${dir_to_archive}" ;;
-  (*.tar.xz|*.txz) tar -cvJf "${archive_name}" "${dir_to_archive}" ;;
-  (*.tar.lzma|*.tlz) tar -cvf "${archive_name}" --lzma "${dir_to_archive}" ;;
-  (*.tar) tar -cvf "${archive_name}" "${dir_to_archive}" ;;
-  (*.zip|*.jar) zip -r "${archive_name}" "${dir_to_archive}" ;;
-  (*.rar) rar a "${archive_name}" "${dir_to_archive}" ;;
-  (*.7z) 7za a "${archive_name}" "${dir_to_archive}" ;;
+  (*.tar.gz|*.tgz) tar -cvf "${archive_name}" --use-compress-program="${_gzip_bin}" "${=path_to_archive}" ;;
+  (*.tar.bz2|*.tbz|*.tbz2) tar -cvf "${archive_name}" --use-compress-program="${_bzip2_bin}" "${=path_to_archive}" ;;
+  (*.tar.xz|*.txz) tar -cvf "${archive_name}" --use-compress-program="${_xz_bin}" "${=path_to_archive}" ;;
+  (*.tar.lzma|*.tlz) tar -cvf "${archive_name}" --lzma "${=path_to_archive}" ;;
+  (*.tar.zst|*.tzst) tar -cvf "${archive_name}" --use-compress-program="${_zstd_bin}" "${=path_to_archive}" ;;
+  (*.tar) tar -cvf "${archive_name}" "${=path_to_archive}" ;;
+  (*.zip|*.jar) zip -r "${archive_name}" "${=path_to_archive}" ;;
+  (*.rar) rar a "${archive_name}" "${=path_to_archive}" ;;
+  (*.7z) 7za a "${archive_name}" "${=path_to_archive}" ;;
   (*.gz) print "\n.gz is only useful for single files, and does not capture permissions. Use .tar.gz" ;;
   (*.bz2) print "\n.bzip2 is only useful for single files, and does not capture permissions. Use .tar.bz2" ;;
   (*.xz) print "\n.xz is only useful for single files, and does not capture permissions. Use .tar.xz" ;;
diff --git a/modules/archive/functions/lsarchive b/modules/archive/functions/lsarchive
index 7f892d1f..2506b87f 100644
--- a/modules/archive/functions/lsarchive
+++ b/modules/archive/functions/lsarchive
@@ -41,6 +41,7 @@ while (( $# > 0 )); do
     (*.tar.zma|*.tlz) tar --lzma --help &> /dev/null \
       && tar --lzma -t${verbose:+v}f "$1" \
       || lzcat "$1" | tar x${verbose:+v}f - ;;
+    (*.tar.zst|*.tzst) tar -I zstd -t${verbose:+v}f "$1" ;;
     (*.tar) tar t${verbose:+v}f "$1" ;;
     (*.zip|*.jar) unzip -l${verbose:+v} "$1" ;;
     (*.rar) ( (( $+commands[unrar] )) \
diff --git a/modules/archive/functions/unarchive b/modules/archive/functions/unarchive
index 53a24dd7..3e58b867 100644
--- a/modules/archive/functions/unarchive
+++ b/modules/archive/functions/unarchive
@@ -12,6 +12,7 @@ local success
 local file_name
 local file_path
 local extract_dir
+local _gzip_bin _bzip2_bin _xz_bin _zstd_bin
 
 if (( $# == 0 )); then
   cat >&2 <<EOF
@@ -30,6 +31,31 @@ if [[ "$1" == "-r" || "$1" == "--remove" ]]; then
   shift
 fi
 
+# here, we check for dropin/multi-threaded replacements
+# this should eventually be moved to modules/archive/init.zsh
+# as a global alias
+if (( $+commands[unpigz] )); then
+  _gzip_bin='unpigz'
+else
+  _gzip_bin='gunzip'
+fi
+
+if (( $+commands[pixz] )); then
+  _xz_bin='pixz -d'
+else
+  _xz_bin='xz'
+fi
+
+if (( $+commands[lbunzip2] )); then
+  _bzip2_bin='lbunzip2'
+elif (( $+commands[pbunzip2] )); then
+  _bzip2_bin='pbunzip2'
+else
+  _bzip2_bin='bunzip2'
+fi
+
+_zstd_bin='zstd'
+
 while (( $# > 0 )); do
   if [[ ! -s "$1" ]]; then
     print "$0: file not valid: $1" >&2
@@ -42,15 +68,14 @@ while (( $# > 0 )); do
   file_path="${1:A}"
   extract_dir="${file_name:r}"
   case "$1:l" in
-    (*.tar.gz|*.tgz) tar xvzf "$1" ;;
-    (*.tar.bz2|*.tbz|*.tbz2) tar xvjf "$1" ;;
-    (*.tar.xz|*.txz) tar --xz --help &> /dev/null \
-      && tar --xz -xvf "$1" \
-      || xzcat "$1" | tar xvf - ;;
+    (*.tar.gz|*.tgz) tar -xvf "$1" --use-compress-program="${_gzip_bin}" ;;
+    (*.tar.bz2|*.tbz|*.tbz2) tar -xvf "$1" --use-compress-program="${_bzip2_bin}" ;;
+    (*.tar.xz|*.txz) tar -xvf "$1" --use-compress-program="${_xz_bin}" ;;
     (*.tar.zma|*.tlz) tar --lzma --help &> /dev/null \
       && tar --lzma -xvf "$1" \
-      || lzcat "$1" | tar xvf - ;;
-    (*.tar) tar xvf "$1" ;;
+      || lzcat "$1" | tar -xvf - ;;
+    (*.tar.zst|*.tzst) tar -xvf "$1" --use-compress-program="${_zstd_bin}" ;;
+    (*.tar) tar -xvf "$1" ;;
     (*.gz) gunzip "$1" ;;
     (*.bz2) bunzip2 "$1" ;;
     (*.xz) unxz "$1" ;;
diff --git a/modules/autosuggestions/README.md b/modules/autosuggestions/README.md
index c3e90a49..8aedb31b 100644
--- a/modules/autosuggestions/README.md
+++ b/modules/autosuggestions/README.md
@@ -1,66 +1,62 @@
-Autosuggestions
----------------
-
-Integrates zsh-autosuggestions into Prezto.
-
-Autosuggestions
-===============
+# Autosuggestions
 
 Integrates [zsh-autosuggestions][1] into Prezto, which implements the
 [Fish shell][2]'s autosuggestions feature, where the user can type in any part
 of a previously entered command and Zsh suggests commands as you type based on
 history and completions.
 
-If this module is used in conjunction with the *syntax-highlighting* module,
-this module must be loaded **after** the *syntax-highlighting* module.
+If this module is used in conjunction with the [_`syntax-highlighting`_][3]
+module, this module must be loaded _after_ the _`syntax-highlighting`_ module.
 
-If this module is used in conjunction with the *history-substring-search*
-module, this module must be loaded **after** the *history-substring-search*
-module.
+Additionally, if this module is used in conjunction with the
+[_`history-substring-search`_][4] module, this module must be loaded _after_ the
+_`history-substring-search`_ module as well.
 
-Contributors
-------------
+To elaborate, the relative order of loading the modules would be
+_`syntax-highlighting`_, _`history-substring-search`_ and _`autosuggestions`_.
+
+## Contributors
 
 New features and bug fixes should be submitted to the [zsh-autosuggestions][1]
 project according to its rules and regulations. This module will be synchronized
 against it.
 
-Settings
---------
+## Settings
 
 ### Highlighting
 
-If colors are enabled, *autosuggestions* will automatically highlight
+If colors are enabled, _autosuggestions_ will automatically highlight
 positive results.
 
 To enable highlighting for this module only, add the following line to
-*zpreztorc*:
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:autosuggestions' color 'yes'
 ```
 
-To set the query found color, add the following line to *zpreztorc*:
+To set the query found color, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:autosuggestions:color' found ''
 ```
 
-Troubleshooting
----------------
+## Troubleshooting
 
 ### Autosuggestions from previous sessions don't show up
 
 For autosuggestions from previous shell sessions to work, please make sure you
 also have the `history` module enabled.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][3].*
+_The authors of this module should be contacted via the [issue tracker][5]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
 [1]: https://github.com/tarruda/zsh-autosuggestions
-[2]: http://fishshell.com
-[3]: https://github.com/sorin-ionescu/prezto/issues
+[2]: https://fishshell.com
+[3]: ../syntax-highlighting#readme
+[4]: ../history-substring-search#readme
+[5]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/autosuggestions/external b/modules/autosuggestions/external
index 15931f04..c3d4e576 160000
--- a/modules/autosuggestions/external
+++ b/modules/autosuggestions/external
@@ -1 +1 @@
-Subproject commit 15931f04ffac91a2f9a1a044b6b3ee4050751064
+Subproject commit c3d4e576c9c86eac62884bd47c01f6faed043fc5
diff --git a/modules/command-not-found/README.md b/modules/command-not-found/README.md
index 7775c926..c433380d 100644
--- a/modules/command-not-found/README.md
+++ b/modules/command-not-found/README.md
@@ -1,21 +1,21 @@
-Command-Not-Found
-=================
+# Command-Not-Found
 
-When you try to use a command that is not available locally, searches
-the package manager for a package offering that command and suggests
-the proper install command. 
+When you try to use a command that is not available locally, searches the
+package manager for a package offering that command and suggests the proper
+install command.
 
-Debian-based and Arch Linux-based distributions use the [`command-not-found`][1] tool.
+Debian and Arch Linux based distributions use the [`command-not-found`][1] tool.
 
-macOS uses Homebrew's [`command-not-found` clone][2]. Note that you also need to [follow the instructions to tap the `command-not-found` homebrew repository][3].
+macOS uses Homebrew's [`command-not-found` clone][2]. Note that unless you have
+a recent version of Homebrew installed, you might also need to tap the
+`command-not-found` Homebrew repository [following the instructions][3].
 
+## Authors
 
-Authors
--------
+_The authors of this module should be contacted via the [issue tracker][4]._
 
-*The authors of this module should be contacted via the [issue tracker][4].*
-
-  - [Joseph Booker](https://github.com/sargas)
+- [Joseph Booker](https://github.com/sargas)
+- [Indrajit Raychaudhuri](https://github.com/indrajitr)
 
 [1]: https://code.launchpad.net/command-not-found
 [2]: https://github.com/Homebrew/homebrew-command-not-found
diff --git a/modules/command-not-found/init.zsh b/modules/command-not-found/init.zsh
index 2c59a4b3..cf8f64ea 100644
--- a/modules/command-not-found/init.zsh
+++ b/modules/command-not-found/init.zsh
@@ -7,14 +7,16 @@
 #
 
 # Load command-not-found on Debian-based distributions.
-if [[ -s '/etc/zsh_command_not_found' ]]; then
-  source '/etc/zsh_command_not_found'
+if [[ -s /etc/zsh_command_not_found ]]; then
+  source /etc/zsh_command_not_found
 # Load command-not-found on Arch Linux-based distributions.
-elif [[ -s '/usr/share/doc/pkgfile/command-not-found.zsh' ]]; then
-  source '/usr/share/doc/pkgfile/command-not-found.zsh'
-# Load command-not-found on macOS when homebrew tap is configured.
-elif [[ -s '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh' ]]; then
-  source '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh'
+elif [[ -s /usr/share/doc/pkgfile/command-not-found.zsh ]]; then
+  source /usr/share/doc/pkgfile/command-not-found.zsh
+# Load command-not-found on macOS when Homebrew tap is configured.
+elif (( $+commands[brew] )) \
+      && [[ -s ${hb_cnf_handler::="${HOMEBREW_REPOSITORY:-$commands[brew]:A:h:h}/Library/Taps/homebrew/homebrew-command-not-found/handler.sh"} ]]; then
+  source "$hb_cnf_handler"
+  unset hb_cnf_handler
 # Return if requirements are not found.
 else
   return 1
diff --git a/modules/completion/README.md b/modules/completion/README.md
index 7efb3d96..cdce9e51 100644
--- a/modules/completion/README.md
+++ b/modules/completion/README.md
@@ -1,40 +1,55 @@
-Completion
-==========
+# Completion
 
-Loads and configures tab completion and provides additional completions from
-the [zsh-completions][1] project.
+Loads and configures <kbd>TAB</kbd> completion and provides additional
+completions from the [zsh-completions][1] project.
 
-This module must be loaded **after** the *utility* module.
+This module must be loaded late _after_ the _`utility`_ module and all other
+modules that provide completion definitions.
 
-Settings
---------
+## Options
 
-### Ignore */etc/hosts* Entries
+- `COMPLETE_IN_WORD` complete from both ends of a word.
+- `ALWAYS_TO_END` move cursor to the end of a completed word.
+- `PATH_DIRS` perform path search even on command names with slashes.
+- `AUTO_MENU` show completion menu on a successive <kbd>TAB</kbd> press.
+- `AUTO_LIST` automatically list choices on ambiguous completion.
+- `AUTO_PARAM_SLASH` if completed parameter is a directory, add a trailing
+  slash (`/`).
+- `EXTENDED_GLOB` needed for file modification glob modifiers with _compinit_.
+- `MENU_COMPLETE` do not autoselect the first completion entry.
+- `FLOW_CONTROL` disable start/stop characters in shell editor.
 
-To ignore certain entries from static */etc/hosts* for host completion, add the
-following lines in *zpreztorc* with the IP addresses of the hosts as they
-appear in */etc/hosts*. Both IP address and the corresponding hostname will be
-ignored during host completion. However, some of the entries ignored from
-*/etc/hosts* still might appear during completion because of their presence in
-*ssh* configuration or history).
+## Variables
+
+- `LS_COLORS` used by default for Zsh [standard style][2] 'list-colors'.
+
+## Settings
+
+### Ignore _`/etc/hosts`_ Entries
+
+To ignore certain entries from static _`/etc/hosts`_ for host completion, add
+the following lines in _`${ZDOTDIR:-$HOME}/.zpreztorc`_ with the IP addresses of
+the hosts as they appear in _`/etc/hosts`_. Both IP address and the associated
+hostname(s) will be ignored during host completion. However, some of the entries
+ignored from _`/etc/hosts`_ still might appear during completion because of
+their presence in _ssh_ configuration or history).
 
 ```sh
 zstyle ':prezto:module:completion:*:hosts' etc-host-ignores \
-  '0.0.0.0' '127.0.0.1'
+    '0.0.0.0' '127.0.0.1'
 ```
 
-Contributors
-------------
+## Contributors
 
-Completions should be submitted to the [zsh-completions][1] project according
-to its rules and regulations. This module will be synchronized against it.
+Completions should be submitted to the [zsh-completions][1] project according to
+its rules and regulations. This module will be synchronized against it.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][2].*
+_The authors of this module should be contacted via the [issue tracker][3]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
 [1]: https://github.com/zsh-users/zsh-completions
-[2]: https://github.com/sorin-ionescu/prezto/issues
+[2]: https://zsh.sourceforge.net/Doc/Release/Completion-System.html#Standard-Styles
+[3]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/completion/external b/modules/completion/external
index 2a30b05a..c0fe16fd 160000
--- a/modules/completion/external
+++ b/modules/completion/external
@@ -1 +1 @@
-Subproject commit 2a30b05a5cf724a2d1c4c140c302dbf93f6aa6f6
+Subproject commit c0fe16fdadfc8fa8e26247e467bf09aeb7f3b4ca
diff --git a/modules/completion/init.zsh b/modules/completion/init.zsh
index e2cc2d44..12cb3336 100644
--- a/modules/completion/init.zsh
+++ b/modules/completion/init.zsh
@@ -7,53 +7,84 @@
 #
 
 # Return if requirements are not found.
-if [[ "$TERM" == 'dumb' ]]; then
+if [[ $TERM == 'dumb' ]]; then
   return 1
 fi
 
 # Add zsh-completions to $fpath.
-fpath=("${0:h}/external/src" $fpath)
+fpath=(${0:h}/external/src $fpath)
+
+# Add completion for keg-only brewed curl on macOS when available.
+if (( $+commands[brew] )); then
+  brew_prefix=${HOMEBREW_PREFIX:-${HOMEBREW_REPOSITORY:-$commands[brew]:A:h:h}}
+  # $HOMEBREW_PREFIX defaults to $HOMEBREW_REPOSITORY but is explicitly set to
+  # /usr/local when $HOMEBREW_REPOSITORY is /usr/local/Homebrew.
+  # https://github.com/Homebrew/brew/blob/2a850e02d8f2dedcad7164c2f4b95d340a7200bb/bin/brew#L66-L69
+  [[ $brew_prefix == '/usr/local/Homebrew' ]] && brew_prefix=$brew_prefix:h
+  fpath=($brew_prefix/opt/curl/share/zsh/site-functions(/N) $fpath)
+  unset brew_prefix
+fi
 
 #
 # Options
 #
 
-setopt COMPLETE_IN_WORD    # Complete from both ends of a word.
-setopt ALWAYS_TO_END       # Move cursor to the end of a completed word.
-setopt PATH_DIRS           # Perform path search even on command names with slashes.
-setopt AUTO_MENU           # Show completion menu on a successive tab press.
-setopt AUTO_LIST           # Automatically list choices on ambiguous completion.
-setopt AUTO_PARAM_SLASH    # If completed parameter is a directory, add a trailing slash.
-setopt EXTENDED_GLOB       # Needed for file modification glob modifiers with compinit
-unsetopt MENU_COMPLETE     # Do not autoselect the first completion entry.
-unsetopt FLOW_CONTROL      # Disable start/stop characters in shell editor.
+setopt COMPLETE_IN_WORD     # Complete from both ends of a word.
+setopt ALWAYS_TO_END        # Move cursor to the end of a completed word.
+setopt PATH_DIRS            # Perform path search even on command names with slashes.
+setopt AUTO_MENU            # Show completion menu on a successive tab press.
+setopt AUTO_LIST            # Automatically list choices on ambiguous completion.
+setopt AUTO_PARAM_SLASH     # If completed parameter is a directory, add a trailing slash.
+setopt EXTENDED_GLOB        # Needed for file modification glob modifiers with compinit.
+unsetopt MENU_COMPLETE      # Do not autoselect the first completion entry.
+unsetopt FLOW_CONTROL       # Disable start/stop characters in shell editor.
+
+#
+# Variables
+#
+
+# Standard style used by default for 'list-colors'
+LS_COLORS=${LS_COLORS:-'di=34:ln=35:so=32:pi=33:ex=31:bd=36;01:cd=33;01:su=31;40;07:sg=36;40;07:tw=32;40;07:ow=33;40;07:'}
+
+#
+# Initialization
+#
 
 # Load and initialize the completion system ignoring insecure directories with a
 # cache time of 20 hours, so it should almost always regenerate the first time a
 # shell is opened each day.
 autoload -Uz compinit
-_comp_files=(${ZDOTDIR:-$HOME}/.zcompdump(Nm-20))
-if (( $#_comp_files )); then
-  compinit -i -C
+_comp_path="${XDG_CACHE_HOME:-$HOME/.cache}/prezto/zcompdump"
+# #q expands globs in conditional expressions
+if [[ $_comp_path(#qNmh-20) ]]; then
+  # -C (skip function check) implies -i (skip security check).
+  compinit -C -d "$_comp_path"
 else
-  compinit -i
+  mkdir -p "$_comp_path:h"
+  compinit -i -d "$_comp_path"
+  # Keep $_comp_path younger than cache time even if it isn't regenerated.
+  touch "$_comp_path"
 fi
-unset _comp_files
+unset _comp_path
 
 #
 # Styles
 #
 
+# Defaults.
+zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
+zstyle ':completion:*:default' list-prompt '%S%M matches%s'
+
 # Use caching to make completion for commands such as dpkg and apt usable.
 zstyle ':completion::complete:*' use-cache on
-zstyle ':completion::complete:*' cache-path "${ZDOTDIR:-$HOME}/.zcompcache"
+zstyle ':completion::complete:*' cache-path "${XDG_CACHE_HOME:-$HOME/.cache}/prezto/zcompcache"
 
 # Case-insensitive (all), partial-word, and then substring completion.
 if zstyle -t ':prezto:module:completion:*' case-sensitive; then
   zstyle ':completion:*' matcher-list 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
   setopt CASE_GLOB
 else
-  zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
+  zstyle ':completion:*' matcher-list 'm:{[:lower:]}={[:upper:]}' 'm:{[:upper:]}={[:lower:]}'  'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
   unsetopt CASE_GLOB
 fi
 
@@ -66,7 +97,6 @@ zstyle ':completion:*:corrections' format ' %F{green}-- %d (errors: %e) --%f'
 zstyle ':completion:*:descriptions' format ' %F{yellow}-- %d --%f'
 zstyle ':completion:*:messages' format ' %F{purple} -- %d --%f'
 zstyle ':completion:*:warnings' format ' %F{red}-- no matches found --%f'
-zstyle ':completion:*:default' list-prompt '%S%M matches%s'
 zstyle ':completion:*' format ' %F{yellow}-- %d --%f'
 zstyle ':completion:*' group-name ''
 zstyle ':completion:*' verbose yes
@@ -87,7 +117,6 @@ zstyle ':completion:*:functions' ignored-patterns '(_*|pre(cmd|exec))'
 zstyle ':completion:*:*:-subscript-:*' tag-order indexes parameters
 
 # Directories
-zstyle ':completion:*:default' list-colors ${(s.:.)LS_COLORS}
 zstyle ':completion:*:*:cd:*' tag-order local-directories directory-stack path-directories
 zstyle ':completion:*:*:cd:*:directory-stack' menu yes select
 zstyle ':completion:*:-tilde-:*' group-order 'named-directories' 'path-directories' 'users' 'expand'
@@ -99,7 +128,7 @@ zstyle ':completion:*:history-words' remove-all-dups yes
 zstyle ':completion:*:history-words' list false
 zstyle ':completion:*:history-words' menu yes
 
-# Environmental Variables
+# Environment Variables
 zstyle ':completion::*:(-command-|export):*' fake-parameters ${${${_comps[(I)-value-*]#*,}%%,*}:#-*-}
 
 # Populate hostname completion. But allow ignoring custom entries from static
@@ -107,7 +136,7 @@ zstyle ':completion::*:(-command-|export):*' fake-parameters ${${${_comps[(I)-va
 zstyle -a ':prezto:module:completion:*:hosts' etc-host-ignores '_etc_host_ignores'
 
 zstyle -e ':completion:*:hosts' hosts 'reply=(
-  ${=${=${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) 2> /dev/null)"}%%[#| ]*}//\]:[0-9]*/ }//,/ }//\[/ }
+  ${=${=${=${${(f)"$(cat {/etc/ssh/ssh_,~/.ssh/}known_hosts(|2)(N) 2> /dev/null)"}%%[#| ]*}//\]:[0-9]*/ }//,/ }//\[/ }
   ${=${(f)"$(cat /etc/hosts(|)(N) <<(ypcat hosts 2> /dev/null))"}%%(\#${_etc_host_ignores:+|${(j:|:)~_etc_host_ignores}})*}
   ${=${${${${(@M)${(f)"$(cat ~/.ssh/config 2> /dev/null)"}:#Host *}#Host }:#*\**}:#*\?*}}
 )'
diff --git a/modules/directory/README.md b/modules/directory/README.md
index 47c1bc20..8603d9f6 100644
--- a/modules/directory/README.md
+++ b/modules/directory/README.md
@@ -1,35 +1,37 @@
-Directory
-=========
+# Directory
 
 Sets directory options and defines directory aliases.
 
-Options
--------
+## Options
 
-  - `AUTO_CD` auto changes to a directory without typing `cd`.
-  - `AUTO_PUSHD` pushes the old directory onto the stack on `cd`.
-  - `PUSHD_IGNORE_DUPS` does not store duplicates in the stack.
-  - `PUSHD_SILENT` does not print the directory stack after `pushd` or `popd`.
-  - `PUSHD_TO_HOME` pushes to the home directory when no argument is given.
-  - `CDABLE_VARS` changes directory to a path stored in a variable.
-  - `AUTO_NAME_DIRS` auto adds variable-stored paths to `~` list.
-  - `MULTIOS` writes to multiple descriptors.
-  - `EXTENDED_GLOB` uses extended globbing syntax.
-  - `CLOBBER` does not overwrite existing files with `>` and `>>`. Use `>!` and
-    `>>!` to bypass.
+- `AUTO_CD` auto changes to a directory without typing `cd`.
+- `AUTO_PUSHD` pushes the old directory onto the stack on `cd`.
+- `PUSHD_IGNORE_DUPS` does not store duplicates in the stack.
+- `PUSHD_SILENT` does not print the directory stack after `pushd` or `popd`.
+- `PUSHD_TO_HOME` pushes to the home directory when no argument is given.
+- `CDABLE_VARS` changes directory to a path stored in a variable.
+- `MULTIOS` writes to multiple descriptors.
+- `EXTENDED_GLOB` uses extended globbing syntax.
+- `CLOBBER` does not overwrite existing files with `>` and `>>`. Use `>!` and
+  `>>!` to bypass.
 
-Aliases
--------
+## Aliases
 
-  - `d` prints the contents of the directory stack.
-  - `1 ... 9` changes the directory to the **n** previous one.
+Aliases are enabled by default. To disable them, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
-Authors
--------
+```sh
+zstyle ':prezto:module:directory:alias' skip 'yes'
+```
 
-*The authors of this module should be contacted via the [issue tracker][1].*
+- `d` prints the contents of the directory stack.
+- `1 ... 9` changes the directory to the **n** previous one.
 
-  - [James Cox](https://github.com/imajes)
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+## Authors
+
+_The authors of this module should be contacted via the [issue tracker][1]._
+
+- [James Cox](https://github.com/imajes)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
 [1]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/directory/init.zsh b/modules/directory/init.zsh
index 8abc1e24..caf08d2a 100644
--- a/modules/directory/init.zsh
+++ b/modules/directory/init.zsh
@@ -25,5 +25,8 @@ unsetopt CLOBBER            # Do not overwrite existing files with > and >>.
 # Aliases
 #
 
-alias d='dirs -v'
-for index ({1..9}) alias "$index"="cd +${index}"; unset index
+if ! zstyle -t ':prezto:module:directory:alias' skip; then
+  alias -- -='cd -'
+  alias d='dirs -v'
+  for index ({1..9}) alias "$index"="cd +${index}"; unset index
+fi
diff --git a/modules/dnf/README.md b/modules/dnf/README.md
index bbf1c923..91a35e81 100644
--- a/modules/dnf/README.md
+++ b/modules/dnf/README.md
@@ -1,29 +1,25 @@
-DNF
-===
+# DNF
 
 Defines [dnf][1] aliases.
 
-Aliases
--------
+## Aliases
 
-  - `dnfc` removes package(s) and leaves.
-  - `dnfi` installs package(s).
-  - `dnfh` displays history.
-  - `dnfl` lists packages.
-  - `dnfL` lists installed packages.
-  - `dnfq` displays package information.
-  - `dnfr` removes package(s).
-  - `dnfs` searches for a package.
-  - `dnfu` updates packages.
-  - `dnfU` upgrades packages.
+- `dnfc` removes package(s) and leaves.
+- `dnfi` installs package(s).
+- `dnfh` displays history.
+- `dnfl` lists packages.
+- `dnfL` lists installed packages.
+- `dnfq` displays package information.
+- `dnfr` removes package(s).
+- `dnfs` searches for a package.
+- `dnfu` updates packages.
+- `dnfU` upgrades packages.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][2].*
+_The authors of this module should be contacted via the [issue tracker][2]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
 [1]: https://fedoraproject.org/wiki/Features/DNF
 [2]: https://github.com/sorin-ionescu/prezto/issues
-
diff --git a/modules/docker/README.md b/modules/docker/README.md
index 335f77ad..f193dc62 100644
--- a/modules/docker/README.md
+++ b/modules/docker/README.md
@@ -1,4 +1,4 @@
-# ZSH Docker Aliases
+# Docker
 
 Defines [Docker][1] aliases and functions.
 
@@ -21,14 +21,15 @@ Defines [Docker][1] aliases and functions.
 - `dkli` Log in to a Docker registry
 - `dklo` Log out from a Docker registry
 - `dkls` is alias for `dkps`
-- `dkp` Pause all processes within one or more containers<Paste>
+- `dkp` Pause all processes within one or more containers
 - `dkP` Unpause all processes within one or more containers
 - `dkpl` Pull an image or a repository from a registry
 - `dkph` Push an image or a repository to a registry
 - `dkps` List containers
 - `dkpsa` List all containers (default lists just running)
 - `dkr` Run a command in a new container
-- `dkR` Run an interactive command in a new container and automatically remove the container when it exits
+- `dkR` Run an interactive command in a new container and automatically remove
+  the container when it exits
 - `dkRe` like `dkR` and set entry point to `/bin/bash`
 - `dkrm` Remove one or more containers
 - `dkrmi` Remove one or more images
@@ -39,13 +40,14 @@ Defines [Docker][1] aliases and functions.
 - `dks` Start one or more stopped containers
 - `dkS` Restart a container
 - `dkss` Display a live stream of container(s) resource usage statistics
-- `dksv` Save one or more images to a tar archive (streamed to STDOUT by default)
+- `dksv` Save one or more images to a tar archive (streamed to STDOUT by
+  default)
 - `dkt` Tag an image into a repository
 - `dktop` Display the running processes of a container
 - `dkup` Update configuration of one or more containers
 - `dkV` Manage Docker volumes
 - `dkv` Show the Docker version information
-- `dkw` Block until a container stops, then print its exit code<Paste>
+- `dkw` Block until a container stops, then print its exit code
 - `dkx` Stop a running container
 
 #### container (C)
@@ -65,7 +67,8 @@ Defines [Docker][1] aliases and functions.
 - `dkCS` Restart one or more containers
 - `dkCrm` Remove one or more containers
 - `dkCr` Run a command in a new container
-- `dkCR` Run an interactive command in a new container and automatically remove the container when it exits
+- `dkCR` Run an interactive command in a new container and automatically remove
+  the container when it exits
 - `dkCRe` like `dkCR` and set entry point to `/bin/bash`
 - `dkCs` Start one or more stopped containers
 - `dkCss` Display a live stream of container(s) resource usage statistics
@@ -87,7 +90,8 @@ Defines [Docker][1] aliases and functions.
 - `dkIpl` Pull an image or a repository from a registry
 - `dkIph` Push an image or a repository to a registry
 - `dkIrm` Remove one or more images
-- `dkIsv` Save one or more images to a tar archive (streamed to STDOUT by default)
+- `dkIsv` Save one or more images to a tar archive (streamed to STDOUT by
+  default)
 - `dkIt` Tag an image into a repository
 
 #### volume (V)
@@ -130,8 +134,10 @@ Defines [Docker][1] aliases and functions.
 - `dkm` is short for `docker-machine`
 - `dkma` Get or set the active machine
 - `dkmcp` Copy files between machines
-- `dkmd` Set up the default machine ; alowing you to use `dkme` without arguments
-- `dkme` Set up the environment for the Docker client (eg: `dkme staging` to toggle to staging)
+- `dkmd` Set up the default machine ; alowing you to use `dkme` without
+  arguments
+- `dkme` Set up the environment for the Docker client (eg: `dkme staging` to
+  toggle to staging)
 - `dkmin` Inspect information about a machine
 - `dkmip` Get the IP address of a machine
 - `dkmk` Kill a machine
@@ -171,8 +177,8 @@ Defines [Docker][1] aliases and functions.
 - `dkcsc` Set number of containers for a service
 - `dkcS` Restart services
 - `dkcu` Create and start containers
-- `dkcU` Create and start containers in detached mode:
-           Run containers in the background, print new container names
+- `dkcU` Create and start containers in detached mode: Run containers in the
+  background, print new container names
 - `dkcV` Show the Docker-Compose version information
 - `dkcx` Stop services
 
diff --git a/modules/docker/alias.zsh b/modules/docker/alias.zsh
index cdd9f7c8..12eb2542 100644
--- a/modules/docker/alias.zsh
+++ b/modules/docker/alias.zsh
@@ -152,26 +152,26 @@ alias dkmv='docker-machine version'
 alias dkmx='docker-machine stop'
 
 # Docker Compose (c)
-alias dkc='docker-compose'
-alias dkcb='docker-compose build'
-alias dkcB='docker-compose build --no-cache'
-alias dkcd='docker-compose down'
-alias dkce='docker-compose exec'
-alias dkck='docker-compose kill'
-alias dkcl='docker-compose logs'
-alias dkcls='docker-compose ps'
-alias dkcp='docker-compose pause'
-alias dkcP='docker-compose unpause'
-alias dkcpl='docker-compose pull'
-alias dkcph='docker-compose push'
-alias dkcps='docker-compose ps'
-alias dkcr='docker-compose run'
-alias dkcR='docker-compose run --rm'
-alias dkcrm='docker-compose rm'
-alias dkcs='docker-compose start'
-alias dkcsc='docker-compose scale'
-alias dkcS='docker-compose restart'
-alias dkcu='docker-compose up'
-alias dkcU='docker-compose up -d'
-alias dkcv='docker-compose version'
-alias dkcx='docker-compose stop'
+alias dkc='docker compose'
+alias dkcb='docker compose build'
+alias dkcB='docker compose build --no-cache'
+alias dkcd='docker compose down'
+alias dkce='docker compose exec'
+alias dkck='docker compose kill'
+alias dkcl='docker compose logs'
+alias dkcls='docker compose ps'
+alias dkcp='docker compose pause'
+alias dkcP='docker compose unpause'
+alias dkcpl='docker compose pull'
+alias dkcph='docker compose push'
+alias dkcps='docker compose ps'
+alias dkcr='docker compose run'
+alias dkcR='docker compose run --rm'
+alias dkcrm='docker compose rm'
+alias dkcs='docker compose start'
+alias dkcsc='docker compose scale'
+alias dkcS='docker compose restart'
+alias dkcu='docker compose up'
+alias dkcU='docker compose up -d'
+alias dkcv='docker compose version'
+alias dkcx='docker compose stop'
diff --git a/modules/dpkg/README.md b/modules/dpkg/README.md
index 6290c05a..4df9230c 100644
--- a/modules/dpkg/README.md
+++ b/modules/dpkg/README.md
@@ -1,10 +1,8 @@
-Dpkg
-====
+# Dpkg
 
-Defines [dpkg][1] aliases and functions.
+Defines [_dpkg_][1] aliases and functions.
 
-Aliases
--------
+## Aliases
 
 - `debc` cleans the cache.
 - `debf` displays a file's package.
@@ -20,22 +18,20 @@ Aliases
 - `deb-kclean` removes all kernel images and headers, except for the ones in
   use.
 
-Functions
----------
+## Functions
 
-- `deb-clone` generates a script that can be used to duplicate a dpkg-based
+- `deb-clone` generates a script that can be used to duplicate a `dpkg`-based
   system.
-- `deb-history` displays dpkg history.
-- `deb-kbuild` makes a dpkg Linux kernel package.
+- `deb-history` displays `dpkg` history.
+- `deb-kbuild` makes a `dpkg` Linux kernel package.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][2].*
+_The authors of this module should be contacted via the [issue tracker][2]._
 
-  - [Daniel Bolton](https://github.com/dbb)
-  - [Benjamin Boudreau](https://github.com/dreur)
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Daniel Bolton](https://github.com/dbb)
+- [Benjamin Boudreau](https://github.com/dreur)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
-[1]: http://wiki.debian.org/Teams/Dpkg
+[1]: https://wiki.debian.org/Teams/Dpkg
 [2]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/editor/README.md b/modules/editor/README.md
index c27e8642..a1c18520 100644
--- a/modules/editor/README.md
+++ b/modules/editor/README.md
@@ -1,24 +1,41 @@
-Editor
-======
+# Editor
 
-Sets key bindings.
+Sets editor specific key bindings options and variables.
 
-Settings
---------
+## Options
+
+- `BEEP` beep on error in line editor.
+
+## Variables
+
+- `WORDCHARS` treat a given set of characters as part of a word.
+
+## Settings
+
+### Wordchars
+
+To change what characters are considered part of a word, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
+
+```sh
+zstyle ':prezto:module:editor' wordchars <chars>
+```
+
+Defaults to `*?_-.[]~&;!#$%^(){}<>`.
 
 ### Key bindings
 
-To enable key bindings, add the following to *zpreztorc*, and replace 'bindings'
-with 'emacs' or 'vi'.
+To enable key bindings, add the following to _`${ZDOTDIR:-$HOME}/.zpreztorc`_,
+and replace `'<bindings>'` with `'emacs'` or `'vi'`.
 
 ```sh
-zstyle ':prezto:module:editor' key-bindings 'bindings'
+zstyle ':prezto:module:editor' key-bindings '<bindings>'
 ```
 
 ### Dot Expansion
 
 To enable the auto conversion of .... to ../.., add the following to
-*zpreztorc*.
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
 ```sh
 zstyle ':prezto:module:editor' dot-expansion 'yes'
@@ -26,15 +43,14 @@ zstyle ':prezto:module:editor' dot-expansion 'yes'
 
 ### PS Context
 
-To enable the prompt context to be set, add the following to your
-*zpreztorc*.
+To enable the prompt context to be set, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
 ```sh
 zstyle ':prezto:module:editor' ps-context 'yes'
 ```
 
-Theming
--------
+## Theming
 
 To indicate when the editor is in the primary keymap (emacs or viins), add
 the following to your `theme_prompt_setup` function.
@@ -71,29 +87,27 @@ To indicate when the editor is completing, add the following to your
 zstyle ':prezto:module:editor:info:completing' format '...'
 ```
 
-Then add `$editor_info[context]`, where context is *keymap*, *insert*, or
-*overwrite*, to `$PROMPT` or `$RPROMPT`.
+Then add `$editor_info[context]`, where context is _keymap_, _insert_, or
+_overwrite_, to `$PROMPT` or `$RPROMPT`.
 
-Convenience Functions
----------------------
+## Convenience Functions
 
 ### bindkey-all
 
-Provides a function `bindkey-all` which can be useful for checking how all of the
-keys are bound. Normal `bindkey` command will only list the keys bound for one
-keymap, which is not as useful if you want to grep through the output. The
-keymap's names go to stderr so when you grep through bindkey-all's output you
+Provides a function `bindkey-all` which can be useful for checking how all of
+the keys are bound. Normal `bindkey` command will only list the keys bound for
+one keymap, which is not as useful if you want to grep through the output. The
+keymap's names go to stderr so when you grep through `bindkey-all`'s output you
 will still see the headings and can tell which keymap each binding goes to.
 
 It will also pass through arguments so you can use bindkey-all to set bindings
-for all keymaps at once. If provided arguments it will *not* print out the
+for all keymaps at once. If provided arguments it will _not_ print out the
 names of each of the keymaps, and just run the command for each keymap.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][1].*
+_The authors of this module should be contacted via the [issue tracker][1]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
-[1]: https://github.com/sorin-ionescu/oh-my-zsh/issues
+[1]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/editor/init.zsh b/modules/editor/init.zsh
index 085947ef..5798bc80 100644
--- a/modules/editor/init.zsh
+++ b/modules/editor/init.zsh
@@ -21,7 +21,8 @@ setopt BEEP                     # Beep on error in line editor.
 #
 
 # Treat these characters as part of a word.
-WORDCHARS='*?_-.[]~&;!#$%^(){}<>'
+zstyle -s ':prezto:module:editor' wordchars 'WORDCHARS' \
+  || WORDCHARS='*?_-.[]~&;!#$%^(){}<>'
 
 # Use human-friendly identifiers.
 zmodload zsh/terminfo
@@ -91,28 +92,32 @@ function bindkey-all {
 # Exposes information about the Zsh Line Editor via the $editor_info associative
 # array.
 function editor-info {
-  # Clean up previous $editor_info.
-  unset editor_info
-  typeset -gA editor_info
+  # Ensure that we're going to set the editor-info for prompts that
+  # are prezto managed and/or compatible.
+  if zstyle -t ':prezto:module:prompt' managed; then
+    # Clean up previous $editor_info.
+    unset editor_info
+    typeset -gA editor_info
 
-  if [[ "$KEYMAP" == 'vicmd' ]]; then
-    zstyle -s ':prezto:module:editor:info:keymap:alternate' format 'REPLY'
-    editor_info[keymap]="$REPLY"
-  else
-    zstyle -s ':prezto:module:editor:info:keymap:primary' format 'REPLY'
-    editor_info[keymap]="$REPLY"
-
-    if [[ "$ZLE_STATE" == *overwrite* ]]; then
-      zstyle -s ':prezto:module:editor:info:keymap:primary:overwrite' format 'REPLY'
-      editor_info[overwrite]="$REPLY"
+    if [[ "$KEYMAP" == 'vicmd' ]]; then
+      zstyle -s ':prezto:module:editor:info:keymap:alternate' format 'REPLY'
+      editor_info[keymap]="$REPLY"
     else
-      zstyle -s ':prezto:module:editor:info:keymap:primary:insert' format 'REPLY'
-      editor_info[overwrite]="$REPLY"
-    fi
-  fi
+      zstyle -s ':prezto:module:editor:info:keymap:primary' format 'REPLY'
+      editor_info[keymap]="$REPLY"
 
-  unset REPLY
-  zle zle-reset-prompt
+      if [[ "$ZLE_STATE" == *overwrite* ]]; then
+        zstyle -s ':prezto:module:editor:info:keymap:primary:overwrite' format 'REPLY'
+        editor_info[overwrite]="$REPLY"
+      else
+        zstyle -s ':prezto:module:editor:info:keymap:primary:insert' format 'REPLY'
+        editor_info[overwrite]="$REPLY"
+      fi
+    fi
+
+    unset REPLY
+    zle zle-reset-prompt
+  fi
 }
 zle -N editor-info
 
@@ -269,9 +274,11 @@ bindkey -d
 # Emacs Key Bindings
 #
 
-for key in "$key_info[Escape]"{B,b} "${(s: :)key_info[ControlLeft]}"
+for key in "$key_info[Escape]"{B,b} "${(s: :)key_info[ControlLeft]}" \
+  "${key_info[Escape]}${key_info[Left]}"
   bindkey -M emacs "$key" emacs-backward-word
-for key in "$key_info[Escape]"{F,f} "${(s: :)key_info[ControlRight]}"
+for key in "$key_info[Escape]"{F,f} "${(s: :)key_info[ControlRight]}" \
+  "${key_info[Escape]}${key_info[Right]}"
   bindkey -M emacs "$key" emacs-forward-word
 
 # Kill to the beginning of the line.
@@ -312,6 +319,7 @@ bindkey -M vicmd "$key_info[Control]X$key_info[Control]E" edit-command-line
 
 # Undo/Redo
 bindkey -M vicmd "u" undo
+bindkey -M viins "$key_info[Control]_" undo
 bindkey -M vicmd "$key_info[Control]R" redo
 
 if (( $+widgets[history-incremental-pattern-search-backward] )); then
diff --git a/modules/emacs/README.md b/modules/emacs/README.md
index fa9a514b..8cf7bfc8 100644
--- a/modules/emacs/README.md
+++ b/modules/emacs/README.md
@@ -1,10 +1,8 @@
-Emacs
-=====
+# Emacs
 
 Enables Emacs dependency management.
 
-Dependency management
----------------------
+## Dependency management
 
 [Carton][1] installs and manages Emacs packages for Emacs package development
 and Emacs configuration.
@@ -12,22 +10,27 @@ and Emacs configuration.
 This module prepends the Carton directory to the path variable to enable the
 execution of `carton`.
 
-Aliases
--------
+## Aliases
+
+Aliases are enabled by default. To disable them, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
+
+```sh
+zstyle ':prezto:module:emacs:alias' skip 'yes'
+```
 
 ### Carton
 
-  - `cai` installs dependencies.
-  - `cau` updates dependencies.
-  - `caI` initializes the current directory for dependency management.
-  - `cae` executes a command which correct dependencies.
+- `cai` installs dependencies.
+- `cau` updates dependencies.
+- `caI` initializes the current directory for dependency management.
+- `cae` executes a command which correct dependencies.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][2].*
+_The authors of this module should be contacted via the [issue tracker][2]._
 
-  - [Sebastian Wiesner](https://github.com/lunaryorn)
+- [Sebastian Wiesner](https://github.com/lunaryorn)
 
 [1]: https://github.com/rejeep/carton
 [2]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/emacs/init.zsh b/modules/emacs/init.zsh
index 3acc965c..a53285ab 100644
--- a/modules/emacs/init.zsh
+++ b/modules/emacs/init.zsh
@@ -19,7 +19,9 @@ source "$HOME/.cask/etc/cask_completion.zsh" 2> /dev/null
 # Aliases
 #
 
-alias cai='cask install'
-alias cau='cask update'
-alias caI='cask init'
-alias cae='cask exec'
+if ! zstyle -t ':prezto:module:emacs:alias' skip; then
+  alias cai='cask install'
+  alias cau='cask update'
+  alias caI='cask init'
+  alias cae='cask exec'
+fi
diff --git a/modules/environment/README.md b/modules/environment/README.md
index b0d579bb..5243f266 100644
--- a/modules/environment/README.md
+++ b/modules/environment/README.md
@@ -1,26 +1,52 @@
-Environment
-===========
+# Environment
 
 Sets general shell options and defines environment variables.
 
 This module must be loaded first.
 
-Environment Variables
----------------------
+## Contributors
 
-Contributors
-------------
+This module **MUST NOT** rely on any command that is not built in Zsh.
 
-This module **MUST NOT** rely on any command not built in Zsh.
+Non-interactive environment variables should be defined in
+[_`${ZDOTDIR:-$HOME}/.zshenv`_][1].
 
-Non-interactive environment variables should be defined in [`zshenv`][1].
+## Options
 
-Authors
--------
+### General
 
-*The authors of this module should be contacted via the [issue tracker][2].*
+- `COMBINING_CHARS` combine zero-length punctuation characters (accents) with
+  the base character.
+- `INTERACTIVE_COMMENTS` enable comments in interactive shell.
+- `RC_QUOTES` allow 'Henry''s Garage' instead of 'Henry'\''s Garage'.
+- `MAIL_WARNING` don't print a warning message if a mail file has been accessed.
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+### Jobs
 
-[1]: https://github.com/sorin-ionescu/prezto/blob/master/runcoms/zshenv
+- `LONG_LIST_JOBS` list jobs in the long format by default.
+- `AUTO_RESUME` attempt to resume existing job before creating a new process.
+- `NOTIFY` report status of background jobs immediately.
+- `BG_NICE` don't run all background jobs at a lower priority.
+- `HUP` don't kill jobs on shell exit.
+- `CHECK_JOBS` don't report on jobs when shell exit.
+
+## Variables
+
+### Termcap
+
+- `LESS_TERMCAP_mb` begins blinking.
+- `LESS_TERMCAP_md` begins bold.
+- `LESS_TERMCAP_me` ends mode.
+- `LESS_TERMCAP_se` ends standout-mode.
+- `LESS_TERMCAP_so` begins standout-mode.
+- `LESS_TERMCAP_ue` ends underline.
+- `LESS_TERMCAP_us` begins underline.
+
+## Authors
+
+_The authors of this module should be contacted via the [issue tracker][2]._
+
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
+
+[1]: ../../runcoms#zshenv
 [2]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/environment/init.zsh b/modules/environment/init.zsh
index 4f3bbfe3..3011f590 100644
--- a/modules/environment/init.zsh
+++ b/modules/environment/init.zsh
@@ -14,15 +14,13 @@
 # paste had a regression. Additionally, 5.2 added bracketed-paste-url-magic
 # which is generally better than url-quote-magic so we load that when possible.
 autoload -Uz is-at-least
-if [[ ${ZSH_VERSION} != 5.1.1 ]]; then
+if [[ ${ZSH_VERSION} != 5.1.1 && ${TERM} != "dumb" ]]; then
   if is-at-least 5.2; then
     autoload -Uz bracketed-paste-url-magic
     zle -N bracketed-paste bracketed-paste-url-magic
-  else
-    if is-at-least 5.1; then
-      autoload -Uz bracketed-paste-magic
-      zle -N bracketed-paste bracketed-paste-magic
-    fi
+  elif is-at-least 5.1; then
+    autoload -Uz bracketed-paste-magic
+    zle -N bracketed-paste bracketed-paste-magic
   fi
   autoload -Uz url-quote-magic
   zle -N self-insert url-quote-magic
@@ -38,6 +36,9 @@ setopt INTERACTIVE_COMMENTS # Enable comments in interactive shell.
 setopt RC_QUOTES            # Allow 'Henry''s Garage' instead of 'Henry'\''s Garage'.
 unsetopt MAIL_WARNING       # Don't print a warning message if a mail file has been accessed.
 
+# Allow mapping Ctrl+S and Ctrl+Q shortcuts
+[[ -r ${TTY:-} && -w ${TTY:-} && $+commands[stty] == 1 ]] && stty -ixon <$TTY >$TTY
+
 #
 # Jobs
 #
diff --git a/modules/fasd/README.md b/modules/fasd/README.md
index cb3fc20b..04f9693a 100644
--- a/modules/fasd/README.md
+++ b/modules/fasd/README.md
@@ -1,44 +1,48 @@
-Fasd
-====
+# Fasd
 
 [Fasd][1] is a command-line productivity booster, inspired by tools like
 [autojump][2], [z][3] and [v][4], it offers quick access to files and
-directories by keeping track of files and directories  that were previously
+directories by keeping track of files and directories that were previously
 accessed.
 
-For completion to work, this module must be loaded **after** the *completion*
-module.
+For shell completion to work, this module must be loaded _after_ the
+[_`completion`_][5] module.
 
 The Prezto Fasd configuration differs from the default. The default aliases have
 been disabled.
 
-Installation
-------------
+## Installation
 
-`fasd` is bundled with prezto as a git submodule. Alternatively, you can manually install `fasd`.
-If a manual install is found, it will be used instead of the bundled version.
+`fasd` is bundled with prezto as a git submodule. Alternatively, you can
+manually install `fasd`. If a manual installation is found, it will be used
+instead of the bundled version.
 
-Aliases
--------
+## Aliases
 
-  - `j` changes the current working directory interactively.
+Aliases are enabled by default. To disable them, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
-Completion
-----------
+```sh
+zstyle ':prezto:module:fasd:alias' skip 'yes'
+```
 
-Type `,`, `f,`, `d,` in front of a comma-separated query or type `,,`,  `,,f`,
-`,,d` at the end of a comma-separated query then hit <kbd>tab</kbd>.
+- `j` changes the current working directory interactively.
 
-Authors
--------
+## Completion
 
-*The authors of this module should be contacted via the [issue tracker][5].*
+Type `,`, `f,`, `d,` in front of a comma-separated query or type `,,`, `,,f`,
+`,,d` at the end of a comma-separated query then hit <kbd>TAB</kbd>.
 
-  - [Wei Dai](https://github.com/clvv)
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+## Authors
+
+_The authors of this module should be contacted via the [issue tracker][6]._
+
+- [Wei Dai](https://github.com/clvv)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
 [1]: https://github.com/clvv/fasd
 [2]: https://github.com/joelthelion/autojump
 [3]: https://github.com/rupa/z
 [4]: https://github.com/rupa/v
-[5]: https://github.com/sorin-ionescu/prezto/issues
+[5]: ../completion#readme
+[6]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/fasd/init.zsh b/modules/fasd/init.zsh
index 37babd8e..bd142f80 100644
--- a/modules/fasd/init.zsh
+++ b/modules/fasd/init.zsh
@@ -19,7 +19,7 @@ fi
 # Initialization
 #
 
-cache_file="${TMPDIR:-/tmp}/prezto-fasd-cache.$UID.zsh"
+cache_file="${XDG_CACHE_HOME:-$HOME/.cache}/prezto/fasd-cache.zsh"
 if [[ "${commands[fasd]}" -nt "$cache_file" \
       || "${ZDOTDIR:-$HOME}/.zpreztorc" -nt "$cache_file" \
       || ! -s "$cache_file"  ]]; then
@@ -31,6 +31,7 @@ if [[ "${commands[fasd]}" -nt "$cache_file" \
     init_args+=(zsh-ccomp zsh-ccomp-install zsh-wcomp zsh-wcomp-install)
   fi
 
+  mkdir -p "$cache_file:h"
   # Cache init code.
   fasd --init "$init_args[@]" >! "$cache_file" 2> /dev/null
 fi
@@ -52,5 +53,7 @@ function fasd_cd {
 # Aliases
 #
 
-# Changes the current working directory interactively.
-alias j='fasd_cd -i'
+if ! zstyle -t ':prezto:module:fasd:alias' skip; then
+  # Changes the current working directory interactively.
+  alias j='fasd_cd -i'
+fi
diff --git a/modules/git/README.md b/modules/git/README.md
index a4978262..fad57a11 100644
--- a/modules/git/README.md
+++ b/modules/git/README.md
@@ -1,39 +1,45 @@
-Git
-===
+# Git
 
 Enhances the [Git][1] distributed version control system by providing aliases,
 functions and by exposing repository status information to prompts.
 
-Git **1.7.2** is the [minimum required version][7].
+This module must be loaded _before_ the [_`completion`_][13] module so that the
+provided completion definitions are loaded automatically by _`completion`_
+module.
 
-Settings
---------
+**Note:** Git **2.11** is the minimum required version for better
+[git-rev-list][7] and [git-submodule][14] support.
+
+## Settings
 
 ### Log
 
-The format of the [git-log][8] output is configurable via the following style,
-where context is *brief*, *oneline*, and *medium*, which will be passed to the
-`--pretty=format:` switch.
+To configure the format of the [git-log][8] output, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_, and replace `'<context>'` with `'brief'`,
+`'oneline'`, and `'medium'`. This will be passed to the `--pretty=format:`
+switch.
 
 ```sh
-zstyle ':prezto:module:git:log:context' format ''
+zstyle ':prezto:module:git:log:context' format '<context>'
 ```
 
 ### Status
 
-Retrieving the status of a repository with submodules can take a long time.
-Submodules may be ignored when they are *dirty*, *untracked*, *all*, or *none*.
+Retrieving the status of a repository with [git-submodule][9] can take a long
+time. To configure the submodules to ignore, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_, and replace `'<state>'` with `'dirty'`,
+`'untracked'`, `'all'`, or `'none'`.
 
 ```sh
-zstyle ':prezto:module:git:status:ignore' submodules 'all'
+zstyle ':prezto:module:git:status:ignore' submodules '<state>'
 ```
 
 This setting affects all aliases and functions that call `git-status`.
 
-Aliases
--------
+## Aliases
 
-Aliases are enabled by default. You can disable them with:
+Aliases are enabled by default. To disable them, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
 ```sh
 zstyle ':prezto:module:git:alias' skip 'yes'
@@ -41,284 +47,290 @@ zstyle ':prezto:module:git:alias' skip 'yes'
 
 ### Git
 
-  - `g` is short for `git`.
+- `g` is short for `git`.
 
-### Branch
+### Branch (b)
 
-  - `gb` lists, creates, renames, and deletes branches.
-  - `gbc` creates a new branch.
-  - `gbl` lists branches and their commits. (also `gbv`)
-  - `gbL` lists all local and remote branches and their commits.
-  - `gbr` renames a branch. (also `gbm`)
-  - `gbR` renames a branch even if the new branch name already exists. (also
-    `gbM`)
-  - `gbs` lists branches and their commits with ancestry graphs.
-  - `gbS` lists local and remote branches and their commits with ancestry
-    graphs.
-  - `gbV` lists branches with more verbose information about their commits.
-  - `gbx` deletes a branch. (also `gbd`)
-  - `gbX` deletes a branch irrespective of its merged status. (also `gbD`)
+- `gb` lists, creates, renames, and deletes branches.
+- `gbc` creates a new branch.
+- `gbl` lists branches and their commits. (also `gbv`)
+- `gbL` lists all local and remote branches and their commits.
+- `gbr` renames a branch. (also `gbm`)
+- `gbR` renames a branch even if the new branch name already exists. (also
+  `gbM`)
+- `gbs` lists branches and their commits with ancestry graphs.
+- `gbS` lists local and remote branches and their commits with ancestry graphs.
+- `gbV` lists branches with more verbose information about their commits.
+- `gbx` deletes a branch. (also `gbd`)
+- `gbX` deletes a branch irrespective of its merged status. (also `gbD`)
 
+### Commit (c)
 
-### Commit
+- `gc` records changes to the repository.
+- `gcS` records changes to the repository. (Signed)
+- `gca` stages all modified and deleted files.
+- `gcaS` stages all modified and deleted files. (Signed)
+- `gcm` records changes to the repository with the given message.
+- `gcmS` records changes to the repository with the given message. (Signed)
+- `gcam` stages all modified and deleted files, and records changes to the
+  repository with the given message.
+- `gco` checks out a branch or paths to work tree.
+- `gcO` checks out hunks from the index or the tree interactively.
+- `gcf` amends the tip of the current branch using the same log message as
+  _HEAD_.
+- `gcfS` amends the tip of the current branch using the same log message as
+  _HEAD_. (Signed)
+- `gcF` amends the tip of the current branch.
+- `gcFS` amends the tip of the current branch. (Signed)
+- `gcp` applies changes introduced by existing commits.
+- `gcP` applies changes introduced by existing commits without committing.
+- `gcr` reverts existing commits by reverting patches and recording new commits.
+- `gcR` removes the _HEAD_ commit.
+- `gcs` displays commits with various objects.
+- `gcsS` displays commits with GPG signature.
+- `gcl` lists lost commits.
+- `gcy` displays commits yet to be applied to upstream in the short format.
+- `gcY` displays commits yet to be applied to upstream.
 
-  - `gc` records changes to the repository.
-  - `gca` stages all modified and deleted files.
-  - `gcm` records changes to the repository with the given message.
-  - `gcS` records changes to the repository. (Signed)
-  - `gcSa` stages all modified and deleted files. (Signed)
-  - `gcSm` records changes to the repository with the given message. (Signed)  - `gco`  checks out a branch or paths to work tree.
-  - `gcam` stages all modified and deleted files, and records changes to the repository with the given message.
-  - `gco` checks out a branch or paths to work tree.
-  - `gcO` checks out hunks from the index or the tree interactively.
-  - `gcf` amends the tip of the current branch using the same log message as *HEAD*.
-  - `gcSf` amends the tip of the current branch using the same log message as *HEAD*. (Signed)
-  - `gcF` amends the tip of the current branch.
-  - `gcSF` amends the tip of the current branch. (Signed)
-  - `gcp` applies changes introduced by existing commits.
-  - `gcP` applies changes introduced by existing commits without committing.
-  - `gcr` reverts existing commits by reverting patches and recording new
-     commits.
-  - `gcR` removes the *HEAD* commit.
-  - `gcs` displays various types of objects.
-  - `gcl` lists lost commits.
-  - `gcy` displays commits yet to be applied to upstream in the short format.
-  - `gcY` displays commits yet to be applied to upstream.
+### Conflict (C)
 
-### Conflict
+- `gCl` lists unmerged files.
+- `gCa` adds unmerged file contents to the index.
+- `gCe` executes merge-tool on all unmerged file.
+- `gCo` checks out our changes for unmerged paths.
+- `gCO` checks out our changes for all unmerged paths.
+- `gCt` checks out their changes for unmerged paths.
+- `gCT` checks out their changes for all unmerged paths.
 
-  - `gCl` lists unmerged files.
-  - `gCa` adds unmerged file contents to the index.
-  - `gCe` executes merge-tool on all unmerged file.
-  - `gCo` checks out our changes for unmerged paths.
-  - `gCO` checks out our changes for all unmerged paths.
-  - `gCt` checks out their changes for unmerged paths.
-  - `gCT` checks out their changes for all unmerged paths.
+### Data (d)
 
-### Data
+- `gd` displays information about files in the index and the work tree.
+- `gdc` lists cached files.
+- `gdx` lists deleted files.
+- `gdm` lists modified files.
+- `gdu` lists untracked files.
+- `gdk` lists killed files.
+- `gdi` lists ignored files.
 
-  - `gd` displays information about files in the index and the work tree.
-  - `gdc` lists cached files.
-  - `gdx` lists deleted files.
-  - `gdm` lists modified files.
-  - `gdu` lists untracked files.
-  - `gdk` lists killed files.
-  - `gdi` lists ignored files.
+### Fetch (f)
 
-### Fetch
+- `gf` downloads objects and references from another repository.
+- `gfa` downloads objects and references from all remote repositories.
+- `gfc` clones a repository into a new directory.
+- `gfcr` clones a repository into a new directory including all submodules.
+- `gfm` fetches from and merges with another repository or local branch.
+- `gfr` fetches from and rebases on another repository or local branch.
 
-  - `gf` downloads objects and references from another repository.
-  - `gfa` downloads objects and references from all remote repositories.
-  - `gfc` clones a repository into a new directory.
-  - `gfcr` clones a repository into a new directory including all submodules.
-  - `gfm` fetches from and merges with another repository or local branch.
-  - `gfr` fetches from and rebases on another repository or local branch.
+### Flow (F)
 
-### Flow
+- `gFi` is short for `git flow init`
 
-  - `gFi` is short for `git flow init`
+#### Feature (Ff)
 
-#### Feature
+- `gFf` is short for `git flow feature`
+- `gFfl` is short for `git flow feature list`
+- `gFfs` is short for `git flow feature start`
+- `gFff` is short for `git flow feature finish`
+- `gFfp` is short for `git flow feature publish`
+- `gFft` is short for `git flow feature track`
+- `gFfd` is short for `git flow feature diff`
+- `gFfr` is short for `git flow feature rebase`
+- `gFfc` is short for `git flow feature checkout`
+- `gFfm` is short for `git flow feature pull`
+- `gFfx` is short for `git flow feature delete`
 
-  - `gFf` is short for `git flow feature`
-  - `gFfl` is short for `git flow feature list`
-  - `gFfs` is short for `git flow feature start`
-  - `gFff` is short for `git flow feature finish`
-  - `gFfp` is short for `git flow feature publish`
-  - `gFft` is short for `git flow feature track`
-  - `gFfd` is short for `git flow feature diff`
-  - `gFfr` is short for `git flow feature rebase`
-  - `gFfc` is short for `git flow feature checkout`
-  - `gFfm` is short for `git flow feature pull`
-  - `gFfx` is short for `git flow feature delete`
+#### Bugfix (Fb)
 
-#### Bugfix
+- `gFb` is short for `git flow bugfix`
+- `gFbl` is short for `git flow bugfix list`
+- `gFbs` is short for `git flow bugfix start`
+- `gFbf` is short for `git flow bugfix finish`
+- `gFbp` is short for `git flow bugfix publish`
+- `gFbt` is short for `git flow bugfix track`
+- `gFbd` is short for `git flow bugfix diff`
+- `gFbr` is short for `git flow bugfix rebase`
+- `gFbc` is short for `git flow bugfix checkout`
+- `gFbm` is short for `git flow bugfix pull`
+- `gFbx` is short for `git flow bugfix delete`
 
-  - `gFb` is short for `git flow bugfix`
-  - `gFbl` is short for `git flow bugfix list`
-  - `gFbs` is short for `git flow bugfix start`
-  - `gFbf` is short for `git flow bugfix finish`
-  - `gFbp` is short for `git flow bugfix publish`
-  - `gFbt` is short for `git flow bugfix track`
-  - `gFbd` is short for `git flow bugfix diff`
-  - `gFbr` is short for `git flow bugfix rebase`
-  - `gFbc` is short for `git flow bugfix checkout`
-  - `gFbm` is short for `git flow bugfix pull`
-  - `gFbx` is short for `git flow bugfix delete`
+#### Release (Fl)
 
-#### Release
+- `gFl` is short for `git flow release`
+- `gFll` is short for `git flow release list`
+- `gFls` is short for `git flow release start`
+- `gFlf` is short for `git flow release finish`
+- `gFlp` is short for `git flow release publish`
+- `gFlt` is short for `git flow release track`
+- `gFld` is short for `git flow release diff`
+- `gFlr` is short for `git flow release rebase`
+- `gFlc` is short for `git flow release checkout`
+- `gFlm` is short for `git flow release pull`
+- `gFlx` is short for `git flow release delete`
 
-  - `gFl` is short for `git flow release`
-  - `gFll` is short for `git flow release list`
-  - `gFls` is short for `git flow release start`
-  - `gFlf` is short for `git flow release finish`
-  - `gFlp` is short for `git flow release publish`
-  - `gFlt` is short for `git flow release track`
-  - `gFld` is short for `git flow release diff`
-  - `gFlr` is short for `git flow release rebase`
-  - `gFlc` is short for `git flow release checkout`
-  - `gFlm` is short for `git flow release pull`
-  - `gFlx` is short for `git flow release delete`
+#### Hotfix (Fh)
 
-#### Hotfix
+- `gFh` is short for `git flow hotfix`
+- `gFhl` is short for `git flow hotfix list`
+- `gFhs` is short for `git flow hotfix start`
+- `gFhf` is short for `git flow hotfix finish`
+- `gFhp` is short for `git flow hotfix publish`
+- `gFht` is short for `git flow hotfix track`
+- `gFhd` is short for `git flow hotfix diff`
+- `gFhr` is short for `git flow hotfix rebase`
+- `gFhc` is short for `git flow hotfix checkout`
+- `gFhm` is short for `git flow hotfix pull`
+- `gFhx` is short for `git flow hotfix delete`
 
-  - `gFh` is short for `git flow hotfix`
-  - `gFhl` is short for `git flow hotfix list`
-  - `gFhs` is short for `git flow hotfix start`
-  - `gFhf` is short for `git flow hotfix finish`
-  - `gFhp` is short for `git flow hotfix publish`
-  - `gFht` is short for `git flow hotfix track`
-  - `gFhd` is short for `git flow hotfix diff`
-  - `gFhr` is short for `git flow hotfix rebase`
-  - `gFhc` is short for `git flow hotfix checkout`
-  - `gFhm` is short for `git flow hotfix pull`
-  - `gFhx` is short for `git flow hotfix delete`
+#### Support (Fs)
 
-#### Support
+- `gFs` is short for `git flow support`
+- `gFsl` is short for `git flow support list`
+- `gFss` is short for `git flow support start`
+- `gFsf` is short for `git flow support finish`
+- `gFsp` is short for `git flow support publish`
+- `gFst` is short for `git flow support track`
+- `gFsd` is short for `git flow support diff`
+- `gFsr` is short for `git flow support rebase`
+- `gFsc` is short for `git flow support checkout`
+- `gFsm` is short for `git flow support pull`
+- `gFsx` is short for `git flow support delete`
 
-  - `gFs` is short for `git flow support`
-  - `gFsl` is short for `git flow support list`
-  - `gFss` is short for `git flow support start`
-  - `gFsf` is short for `git flow support finish`
-  - `gFsp` is short for `git flow support publish`
-  - `gFst` is short for `git flow support track`
-  - `gFsd` is short for `git flow support diff`
-  - `gFsr` is short for `git flow support rebase`
-  - `gFsc` is short for `git flow support checkout`
-  - `gFsm` is short for `git flow support pull`
-  - `gFsx` is short for `git flow support delete`
+### Grep (g)
 
-### Grep
+- `gg` displays lines matching a pattern.
+- `ggi` displays lines matching a pattern ignoring case.
+- `ggl` lists files matching a pattern.
+- `ggL` lists files that are not matching a pattern.
+- `ggv` displays lines not matching a pattern.
+- `ggw` displays lines matching a pattern at word boundary.
 
-  - `gg` displays lines matching a pattern.
-  - `ggi` displays lines matching a pattern ignoring case.
-  - `ggl` lists files matching a pattern.
-  - `ggL` lists files that are not matching a pattern.
-  - `ggv` displays lines not matching a pattern.
-  - `ggw` displays lines matching a pattern at word boundary.
+### Index (i)
 
-### Index
+- `gia` adds file contents to the index.
+- `giA` adds file contents to the index interactively.
+- `giu` adds file contents to the index (updates only known files).
+- `gid` displays changes between the index and a named commit (diff).
+- `giD` displays changes between the index and a named commit (word diff).
+- `gii` temporarily ignore differences in a given file.
+- `giI` unignore differences in a given file.
+- `gir` resets the current HEAD to the specified state.
+- `giR` resets the current index interactively.
+- `gix` removes files/directories from the index (recursively).
+- `giX` removes files/directories from the index (recursively and forced).
 
-  - `gia` adds file contents to the index.
-  - `giA` adds file contents to the index interactively.
-  - `giu` adds file contents to the index (updates only known files).
-  - `gid` displays changes between the index and a named commit (diff).
-  - `giD` displays changes between the index and a named commit (word diff).
-  - `gii` temporarily ignore differences in a given file.
-  - `giI` unignore differences in a given file.
-  - `gir` resets the current HEAD to the specified state.
-  - `giR` resets the current index interactively.
-  - `gix` removes files/directories from the index (recursively).
-  - `giX` removes files/directories from the index (recursively and forced).
+### Log (l)
 
-### Log
+- `gl` displays the log.
+- `gls` displays the stats log.
+- `gld` displays the diff log.
+- `glo` displays the one line log.
+- `glg` displays the graph log.
+- `glb` displays the brief commit log.
+- `glc` displays the commit count for each contributor in descending order.
+- `glS` displays the log and checks the validity of signed commits.
 
-  - `gl` displays the log.
-  - `gls` displays the stats log.
-  - `gld` displays the diff log.
-  - `glo` displays the one line log.
-  - `glg` displays the graph log.
-  - `glb` displays the brief commit log.
-  - `glc` displays the commit count for each contributor in descending order.
+### Merge (m)
 
-### Merge
+- `gm` joins two or more development histories together.
+- `gmC` joins two or more development histories together but does not commit.
+- `gmF` joins two or more development histories together but does not commit
+  generating a merge commit even if the merge resolved as a fast-forward.
+- `gma` aborts the conflict resolution, and reconstructs the pre-merge state.
+- `gmt` runs the merge conflict resolution tools to resolve conflicts.
 
-  - `gm` joins two or more development histories together.
-  - `gmC` joins two or more development histories together but does not commit.
-  - `gmF` joins two or more development histories together but does not commit
-     generating a merge commit even if the merge resolved as a fast-forward.
-  - `gma` aborts the conflict resolution, and reconstructs the pre-merge state.
-  - `gmt` runs the merge conflict resolution tools to resolve conflicts.
+### Push (p)
 
-### Push
+- `gp` updates remote refs along with associated objects.
+- `gpf` forcefully updates remote refs along with associated objects using the
+  safer `--force-with-lease` option.
+- `gpF` forcefully updates remote refs along with associated objects using the
+  riskier `--force` option.
+- `gpa` updates remote branches along with associated objects.
+- `gpA` updates remote branches and tags along with associated objects.
+- `gpt` updates remote tags along with associated objects.
+- `gpc` updates remote refs along with associated objects and adds _origin_ as
+  an upstream reference for the current branch.
+- `gpp` pulls and pushes from origin to origin.
 
-  - `gp` updates remote refs along with associated objects.
-  - `gpf` forcefully updates remote refs along with associated objects using the safer `--force-with-lease` option.
-  - `gpF` forcefully updates remote refs along with associated objects using the riskier `--force` option.
-  - `gpa` updates remote branches along with associated objects.
-  - `gpA` updates remote branches and tags along with associated objects.
-  - `gpt` updates remote tags along with associated objects.
-  - `gpc` updates remote refs along with associated objects and adds *origin*
-     as an upstream reference for the current branch.
-  - `gpp` pulls and pushes from origin to origin.
+### Rebase (r)
 
-### Rebase
+- `gr` forward-ports local commits to the updated upstream _HEAD_.
+- `gra` aborts the rebase.
+- `grc` continues the rebase after merge conflicts are resolved.
+- `gri` makes a list of commits to be rebased and opens the editor.
+- `grs` skips the current patch.
 
-  - `gr` forward-ports local commits to the updated upstream head.
-  - `gra` aborts the rebase.
-  - `grc` continues the rebase after merge conflicts are resolved.
-  - `gri` makes a list of commits to be rebased and opens the editor.
-  - `grs` skips the current patch.
+### Remote (R)
 
-### Remote
+- `gR` manages tracked repositories.
+- `gRl` lists remote names and their URLs.
+- `gRa` adds a new remote.
+- `gRx` removes a remote.
+- `gRm` renames a remote.
+- `gRu` fetches remotes updates.
+- `gRp` prunes all stale remote tracking branches.
+- `gRs` displays information about a given remote.
+- `gRb` opens a remote on [GitHub][3] in the default browser.
 
-  - `gR` manages tracked repositories.
-  - `gRl` lists remote names and their URLs.
-  - `gRa` adds a new remote.
-  - `gRx` removes a remote.
-  - `gRm` renames a remote.
-  - `gRu` fetches remotes updates.
-  - `gRp` prunes all stale remote tracking branches.
-  - `gRs` displays information about a given remote.
-  - `gRb` opens a remote on [GitHub][3] in the default browser.
+### Stash (s)
 
-### Stash
+- `gs` stashes the changes of the dirty working directory.
+- `gsa` applies the changes recorded in a stash to the working directory.
+- `gsx` drops a stashed state.
+- `gsX` drops all the stashed states.
+- `gsl` lists stashed states.
+- `gsL` lists dropped stashed states.
+- `gsd` displays changes between the stash and its original parent.
+- `gsp` removes and applies a single stashed state from the stash list.
+- `gsr` recovers a given stashed state.
+- `gss` stashes the changes of the dirty working directory, including untracked.
+- `gsS` stashes the changes of the dirty working directory interactively.
+- `gsw` stashes the changes of the dirty working directory retaining the index.
 
-  - `gs` stashes the changes of the dirty working directory.
-  - `gsa` applies the changes recorded in a stash to the working directory.
-  - `gsx` drops a stashed state.
-  - `gsX` drops all the stashed states.
-  - `gsl` lists stashed states.
-  - `gsL` lists dropped stashed states.
-  - `gsd` displays changes between the stash and its original parent.
-  - `gsp` removes and applies a single stashed state from the stash list.
-  - `gsr` recovers a given stashed state.
-  - `gss` stashes the changes of the dirty working directory, including untracked.
-  - `gsS` stashes the changes of the dirty working directory interactively.
-  - `gsw` stashes the changes of the dirty working directory retaining the index.
+### Submodule (S)
 
-### Submodule
+- `gS` initializes, updates, or inspects submodules.
+- `gSa` adds given a repository as a submodule.
+- `gSf` evaluates a shell command in each of checked out submodules.
+- `gSi` initializes submodules.
+- `gSI` initializes and clones submodules recursively.
+- `gSl` lists the commits of all submodules.
+- `gSm` moves a submodule.
+- `gSs` synchronizes submodules' remote URL to the value specified in
+  _.gitmodules_.
+- `gSu` fetches and merges the latest changes for all submodule.
+- `gSx` removes a submodule.
 
-  - `gS` initializes, updates, or inspects submodules.
-  - `gSa` adds given a repository as a submodule.
-  - `gSf` evaluates a shell command in each of checked out submodules.
-  - `gSi` initializes submodules.
-  - `gSI` initializes and clones submodules recursively.
-  - `gSl` lists the commits of all submodules.
-  - `gSm` moves a submodule.
-  - `gSs` synchronizes submodules' remote URL to the value specified in
-    .gitmodules.
-  - `gSu` fetches and merges the latest changes for all submodule.
-  - `gSx` removes a submodule.
+### Tag (t)
 
-### Tag
+- `gt` lists tags or creates tag.
+- `gtl` lists tags matching pattern.
+- `gts` creates a signed tag.
+- `gtv` validate a signed tag.
 
-  - `gt` lists tags or creates tag.
-  - `gtl` lists tags matching pattern.
+### Working directory (w)
 
-### Working directory
-
-  - `gws` displays working-tree status in the short format.
-  - `gwS` displays working-tree status.
-  - `gwd` displays changes between the working tree and the index (diff).
-  - `gwD` displays changes between the working tree and the index (word diff).
-  - `gwr` resets the current HEAD to the specified state, does not touch the
-     index nor the working tree.
-  - `gwR` resets the current HEAD, index and working tree to the specified state.
-  - `gwc` removes untracked files from the working tree (dry-run).
-  - `gwC` removes untracked files from the working tree.
-  - `gwx` removes files from the working tree and from the index recursively.
-  - `gwX` removes files from the working tree and from the index recursively and
-    forcefully.
+- `gws` displays working-tree status in the short format.
+- `gwS` displays working-tree status.
+- `gwd` displays changes between the working tree and the index (diff).
+- `gwD` displays changes between the working tree and the index (word diff).
+- `gwr` resets the current HEAD to the specified state, does not touch the
+  index nor the working tree.
+- `gwR` resets the current HEAD, index and working tree to the specified state.
+- `gwc` removes untracked files from the working tree (dry-run).
+- `gwC` removes untracked files from the working tree.
+- `gwx` removes files from the working tree and from the index recursively.
+- `gwX` removes files from the working tree and from the index recursively and
+  forcefully.
 
 ### Shadows
 
 The following aliases may shadow system commands:
 
-  - `gb` shadows the [GB][9].
-  - `gm` shadows the [Graphics Magick image processor][11].
-  - `gpt` shadows the [GUID partition table maintenance utility][4].
-  - `gs` shadows the [Ghostscript interpreter and previewer][5].
+- `gb` shadows the [GB][10].
+- `gm` shadows the [GraphicsMagick image processor][11].
+- `gpt` shadows the [GUID partition table maintenance utility][4].
+- `gs` shadows the [Ghostscript interpreter and previewer][5].
 
 If you frequently use the above commands, you may wish to remove said aliases
 from this module or to disable them at the bottom of the zshrc with `unalias`.
@@ -326,25 +338,23 @@ from this module or to disable them at the bottom of the zshrc with `unalias`.
 You can temporarily bypass an alias by prefixing it with a backward slash:
 `\gpt`.
 
-Functions
----------
+## Functions
 
-  - `git-branch-current` displays the current branch.
-  - `git-commit-lost` lists lost commits.
-  - `git-dir` displays the path to the Git directory.
-  - `git-hub-browse` opens the [GitHub][3] repository in the default browser.
-  - `git-hub-shorten-url` shortens [GitHub URLs][10].
-  - `git-info` exposes repository information via the `$git_info` associative
-    array.
-  - `git-root` displays the path to the working tree root.
-  - `git-stash-clear-interactive` asks for confirmation before clearing the stash.
-  - `git-stash-dropped` lists dropped stashed states.
-  - `git-stash-recover` recovers given dropped stashed states.
-  - `git-submodule-move` moves a submodule.
-  - `git-submodule-remove` removes a submodule.
+- `git-branch-current` displays the current branch.
+- `git-commit-lost` lists lost commits.
+- `git-dir` displays the path to the Git directory.
+- `git-hub-browse` opens the [GitHub][3] repository in the default browser.
+- `git-hub-shorten-url` shortens [GitHub URLs][12].
+- `git-info` exposes repository information via the `$git_info` associative
+  array.
+- `git-root` displays the path to the working tree root.
+- `git-stash-clear-interactive` asks for confirmation before clearing the stash.
+- `git-stash-dropped` lists dropped stashed states.
+- `git-stash-recover` recovers given dropped stashed states.
+- `git-submodule-move` moves a submodule.
+- `git-submodule-remove` removes a submodule.
 
-Theming
--------
+## Theming
 
 To display information about the current repository in a prompt, define the
 following styles in the `prompt_name_setup` function, where the syntax for
@@ -356,26 +366,26 @@ zstyle ':prezto:module:git:info:context:subcontext' format 'string'
 
 ### Main Contexts
 
-| Name      | Format Code | Description
-| --------- | :---------: | ---------------------------------------------------
-| action    |     %s      | Special action name
-| ahead     |     %A      | Commits ahead of remote count
-| behind    |     %B      | Commits behind of remote count
-| branch    |     %b      | Branch name
-| commit    |     %c      | Commit hash
-| position  |     %p      | Commits from the nearest tag count
-| remote    |     %R      | Remote name
-| stashed   |     %S      | Stashed states count
+| Name     | Format Code | Description                        |
+| -------- | :---------: | ---------------------------------- |
+| action   |     %s      | Special action name                |
+| ahead    |     %A      | Commits ahead of remote count      |
+| behind   |     %B      | Commits behind of remote count     |
+| branch   |     %b      | Branch name                        |
+| commit   |     %c      | Commit hash                        |
+| position |     %p      | Commits from the nearest tag count |
+| remote   |     %R      | Remote name                        |
+| stashed  |     %S      | Stashed states count               |
 
 ### Concise Contexts
 
-| Name      | Format Code | Description
-| --------- | :---------: | ---------------------------------------------------
-| clean     |     %C      | Clean state
-| dirty     |     %D      | Dirty files count
-| indexed   |     %i      | Indexed files count
-| unindexed |     %I      | Unindexed files count
-| untracked |     %u      | Untracked files count
+| Name      | Format Code | Description           |
+| --------- | :---------: | --------------------- |
+| clean     |     %C      | Clean state           |
+| dirty     |     %D      | Dirty files count     |
+| indexed   |     %i      | Indexed files count   |
+| unindexed |     %I      | Unindexed files count |
+| untracked |     %u      | Untracked files count |
 
 The following contexts must be enabled with the following zstyle:
 
@@ -385,31 +395,31 @@ zstyle ':prezto:module:git:info' verbose 'yes'
 
 ### Verbose Contexts
 
-| Name      | Format Code | Description
-| --------- | :---------: | ---------------------------------------------------
-| added     |     %a      | Added files count
-| clean     |     %C      | Clean state
-| deleted   |     %d      | Deleted files count
-| dirty     |     %D      | Dirty files count
-| modified  |     %m      | Modified files count
-| renamed   |     %r      | Renamed files count
-| unmerged  |     %U      | Unmerged files count
-| untracked |     %u      | Untracked files count
+| Name      | Format Code | Description           |
+| --------- | :---------: | --------------------- |
+| added     |     %a      | Added files count     |
+| clean     |     %C      | Clean state           |
+| deleted   |     %d      | Deleted files count   |
+| dirty     |     %D      | Dirty files count     |
+| modified  |     %m      | Modified files count  |
+| renamed   |     %r      | Renamed files count   |
+| unmerged  |     %U      | Unmerged files count  |
+| untracked |     %u      | Untracked files count |
 
 ### Special Action Contexts
 
-| Name                 |   Format    | Description
-| -------------------- | :---------: | -----------------------------------------
-| apply                |    value    | Applying patches
-| bisect               |    value    | Binary searching for changes
-| cherry-pick          |    value    | Cherry picking
-| cherry-pick-sequence |    value    | Cherry picking sequence
-| merge                |    value    | Merging
-| rebase               |    value    | Rebasing
-| rebase-interactive   |    value    | Rebasing interactively
-| rebase-merge         |    value    | Rebasing merge
-| revert               |    value    | Reverting
-| revert-sequence      |    value    | Reverting sequence
+| Name                 | Format | Description                  |
+| -------------------- | :----: | ---------------------------- |
+| apply                | value  | Applying patches             |
+| bisect               | value  | Binary searching for changes |
+| cherry-pick          | value  | Cherry picking               |
+| cherry-pick-sequence | value  | Cherry picking sequence      |
+| merge                | value  | Merging                      |
+| rebase               | value  | Rebasing                     |
+| rebase-interactive   | value  | Rebasing interactively       |
+| rebase-merge         | value  | Rebasing merge               |
+| revert               | value  | Reverting                    |
+| revert-sequence      | value  | Reverting sequence           |
 
 First, format the repository state attributes. For example, to format the branch
 and remote names, define the following styles.
@@ -431,22 +441,24 @@ Last, add `$git_info[prompt]` to `$PROMPT` and `$git_info[rprompt]` to
 `$RPROMPT` respectively and call `git-info` in the `prompt_name_preexec` hook
 function.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][6].*
+_The authors of this module should be contacted via the [issue tracker][6]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
-  - [Colin Hebert](https://github.com/ColinHebert)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Colin Hebert](https://github.com/ColinHebert)
 
-[1]: http://www.git-scm.com
-[2]: https://github.com/defunkt/hub
+[1]: https://www.git-scm.com
+[2]: https://hub.github.com
 [3]: https://www.github.com
-[4]: http://www.manpagez.com/man/8/gpt/
-[5]: http://www.manpagez.com/man/1/gs/
+[4]: https://www.manpagez.com/man/8/gpt/
+[5]: https://www.manpagez.com/man/1/gs/
 [6]: https://github.com/sorin-ionescu/prezto/issues
 [7]: https://github.com/sorin-ionescu/prezto/issues/219
-[8]: http://www.kernel.org/pub/software/scm/git/docs/git-log.html
-[9]: https://getgb.io/
-[10]: https://github.com/blog/985-git-io-github-url-shortener
-[11]: http://www.manpagez.com/man/1/gm/
+[8]: https://git-scm.com/docs/git-log
+[9]: https://git-scm.com/docs/git-submodule
+[10]: https://getgb.io/
+[11]: https://www.manpagez.com/man/1/gm/
+[12]: https://github.blog/2011-11-10-git-io-github-url-shortener
+[13]: ../completion#readme
+[14]: https://github.com/sorin-ionescu/prezto/pull/1929
diff --git a/modules/git/alias.zsh b/modules/git/alias.zsh
index dde5b351..f14cca59 100644
--- a/modules/git/alias.zsh
+++ b/modules/git/alias.zsh
@@ -8,25 +8,24 @@
 #
 # Settings
 #
-#
 
 # Log
 zstyle -s ':prezto:module:git:log:medium' format '_git_log_medium_format' \
-  || _git_log_medium_format='%C(bold)Commit:%C(reset) %C(green)%H%C(red)%d%n%C(bold)Author:%C(reset) %C(cyan)%an <%ae>%n%C(bold)Date:%C(reset)   %C(blue)%ai (%ar)%C(reset)%n%+B'
+    || _git_log_medium_format='%C(bold)Commit:%C(reset) %C(green)%H%C(red)%d%n%C(bold)Author:%C(reset) %C(cyan)%an <%ae>%n%C(bold)Date:%C(reset)   %C(blue)%ai (%ar)%C(reset)%n%+B'
 zstyle -s ':prezto:module:git:log:oneline' format '_git_log_oneline_format' \
-  || _git_log_oneline_format='%C(green)%h%C(reset) %s%C(red)%d%C(reset)%n'
+    || _git_log_oneline_format='%C(green)%h%C(reset) %s%C(red)%d%C(reset)%n'
 zstyle -s ':prezto:module:git:log:brief' format '_git_log_brief_format' \
-  || _git_log_brief_format='%C(green)%h%C(reset) %s%n%C(blue)(%ar by %an)%C(red)%d%C(reset)%n'
+    || _git_log_brief_format='%C(green)%h%C(reset) %s%n%C(blue)(%ar by %an)%C(red)%d%C(reset)%n'
 
 # Status
 zstyle -s ':prezto:module:git:status:ignore' submodules '_git_status_ignore_submodules' \
-  || _git_status_ignore_submodules='none'
+    || _git_status_ignore_submodules='none'
 
 #
 # Aliases
 #
 
-if ! zstyle -t ':prezto:module:git:alias' skip 'yes'; then
+if ! zstyle -t ':prezto:module:git:alias' skip; then
   # Git
   alias g='git'
 
@@ -51,26 +50,27 @@ if ! zstyle -t ':prezto:module:git:alias' skip 'yes'; then
 
   # Commit (c)
   alias gc='git commit --verbose'
+  alias gcS='git commit --verbose --gpg-sign'
   alias gca='git commit --verbose --all'
+  alias gcaS='git commit --verbose --all --gpg-sign'
   alias gcm='git commit --message'
-  alias gcS='git commit -S --verbose'
-  alias gcSa='git commit -S --verbose --all'
-  alias gcSm='git commit -S --message'
+  alias gcmS='git commit --message --gpg-sign'
   alias gcam='git commit --all --message'
   alias gco='git checkout'
   alias gcO='git checkout --patch'
   alias gcf='git commit --amend --reuse-message HEAD'
-  alias gcSf='git commit -S --amend --reuse-message HEAD'
+  alias gcfS='git commit --amend --reuse-message HEAD --gpg-sign'
   alias gcF='git commit --verbose --amend'
-  alias gcSF='git commit -S --verbose --amend'
+  alias gcFS='git commit --verbose --amend --gpg-sign'
   alias gcp='git cherry-pick --ff'
   alias gcP='git cherry-pick --no-commit'
   alias gcr='git revert'
   alias gcR='git reset "HEAD^"'
   alias gcs='git show'
+  alias gcsS='git show --pretty=short --show-signature'
   alias gcl='git-commit-lost'
-  alias gcy='git cherry -v --abbrev'
-  alias gcY='git cherry -v'
+  alias gcy='git cherry --verbose --abbrev'
+  alias gcY='git cherry --verbose'
 
   # Conflict (C)
   alias gCl='git --no-pager diff --name-only --diff-filter=U'
@@ -96,7 +96,9 @@ if ! zstyle -t ':prezto:module:git:alias' skip 'yes'; then
   alias gfc='git clone'
   alias gfcr='git clone --recurse-submodules'
   alias gfm='git pull'
+  alias gfma='git pull --autostash'
   alias gfr='git pull --rebase'
+  alias gfra='git pull --rebase --autostash'
 
   # Flow (F)
   alias gFi='git flow init'
@@ -180,16 +182,17 @@ if ! zstyle -t ':prezto:module:git:alias' skip 'yes'; then
   alias gir='git reset'
   alias giR='git reset --patch'
   alias gix='git rm -r --cached'
-  alias giX='git rm -rf --cached'
+  alias giX='git rm -r --force --cached'
 
   # Log (l)
-  alias gl='git log --topo-order --pretty=format:"${_git_log_medium_format}"'
-  alias gls='git log --topo-order --stat --pretty=format:"${_git_log_medium_format}"'
-  alias gld='git log --topo-order --stat --patch --full-diff --pretty=format:"${_git_log_medium_format}"'
-  alias glo='git log --topo-order --pretty=format:"${_git_log_oneline_format}"'
-  alias glg='git log --topo-order --all --graph --pretty=format:"${_git_log_oneline_format}"'
-  alias glb='git log --topo-order --pretty=format:"${_git_log_brief_format}"'
+  alias gl='git log --topo-order --pretty=format:"$_git_log_medium_format"'
+  alias gls='git log --topo-order --stat --pretty=format:"$_git_log_medium_format"'
+  alias gld='git log --topo-order --stat --patch --full-diff --pretty=format:"$_git_log_medium_format"'
+  alias glo='git log --topo-order --pretty=format:"$_git_log_oneline_format"'
+  alias glg='git log --topo-order --graph --pretty=format:"$_git_log_oneline_format"'
+  alias glb='git log --topo-order --pretty=format:"$_git_log_brief_format"'
   alias glc='git shortlog --summary --numbered'
+  alias glS='git log --show-signature'
 
   # Merge (m)
   alias gm='git merge'
@@ -249,22 +252,24 @@ if ! zstyle -t ':prezto:module:git:alias' skip 'yes'; then
   alias gSl='git submodule status'
   alias gSm='git-submodule-move'
   alias gSs='git submodule sync'
-  alias gSu='git submodule foreach git pull origin master'
+  alias gSu='git submodule update --remote --recursive'
   alias gSx='git-submodule-remove'
 
   # Tag (t)
   alias gt='git tag'
-  alias gtl='git tag -l'
+  alias gtl='git tag --list'
+  alias gts='git tag --sign'
+  alias gtv='git verify-tag'
 
   # Working Copy (w)
-  alias gws='git status --ignore-submodules=${_git_status_ignore_submodules} --short'
-  alias gwS='git status --ignore-submodules=${_git_status_ignore_submodules}'
+  alias gws='git status --ignore-submodules=$_git_status_ignore_submodules --short'
+  alias gwS='git status --ignore-submodules=$_git_status_ignore_submodules'
   alias gwd='git diff --no-ext-diff'
   alias gwD='git diff --no-ext-diff --word-diff'
   alias gwr='git reset --soft'
   alias gwR='git reset --hard'
-  alias gwc='git clean -n'
-  alias gwC='git clean -f'
+  alias gwc='git clean --dry-run'
+  alias gwC='git clean --force'
   alias gwx='git rm -r'
-  alias gwX='git rm -rf'
+  alias gwX='git rm -r --force'
 fi
diff --git a/modules/git/functions/git-hub-browse b/modules/git/functions/git-hub-browse
index cb3fc60d..3451198c 100644
--- a/modules/git/functions/git-hub-browse
+++ b/modules/git/functions/git-hub-browse
@@ -15,7 +15,7 @@ fi
 local remotes remote references reference file url
 
 remote="${1:-origin}"
-remotes=($(command git config --get-regexp 'remote.*.url' | cut -d. -f2))
+remotes=($(command git remote show))
 
 if (( $remotes[(i)$remote] == $#remotes + 1 )); then
   print "$0: remote not found: $remote" >&2
@@ -23,14 +23,14 @@ if (( $remotes[(i)$remote] == $#remotes + 1 )); then
 fi
 
 url=$(
-  command git config --get "remote.${remote}.url" \
-    | sed -En "s/(git|https?)(@|:\/\/)github.com(:|\/)(.+)\/(.+).git/https:\/\/github.com\/\4\/\5/p"
+  command git remote get-url "$remote" \
+      | sed -En "s#(git@|https?://)(github.com)(:|/)(.+)/(.+)\.git#https://\2/\4/\5#p"
 )
 
 reference="${${2:-$(git-branch-current)}:-HEAD}"
 references=(
   HEAD
-  ${$(command git ls-remote --heads --tags "$remote" | awk '{print $2}')##refs/(heads|tags)/}
+  ${${(f)"$(command git ls-remote --heads --tags "$remote")"}##*refs/(heads|tags)/}
 )
 
 if (( $references[(i)$reference] == $#references + 1 )); then
@@ -45,9 +45,9 @@ fi
 file="$3"
 
 if [[ -n "$url" ]]; then
-  url="${url}/tree/${reference}/${file}"
+  url="$url/tree/$reference/$file"
 
-  if (( $+commands[$BROWSER] )); then
+  if [[ -n "$BROWSER" ]]; then
     "$BROWSER" "$url"
     return 0
   else
diff --git a/modules/git/functions/git-hub-shorten-url b/modules/git/functions/git-hub-shorten-url
index 470c093f..b9edd01c 100644
--- a/modules/git/functions/git-hub-shorten-url
+++ b/modules/git/functions/git-hub-shorten-url
@@ -19,7 +19,7 @@ if [[ -z "$url" || ! "$url" =~ ^https?:\/\/.*github.com\/ ]]; then
 fi
 
 if (( $+commands[curl] )); then
-  curl -s -i 'https://git.io' -F "url=$url" ${(s: :)code:+ -F "code=$code"} | sed -n 's/^Location: //p'
+  print "${${(@M)${(f)"$(curl -s -i 'https://git.io' -F "url=$url" ${(z)code:+ -F "code=$code"})"}:#Location: *}#Location: }"
 else
   print "$0: command not found: curl" >&2
   return 1
diff --git a/modules/git/functions/git-info b/modules/git/functions/git-info
index a173c20f..eca50462 100644
--- a/modules/git/functions/git-info
+++ b/modules/git/functions/git-info
@@ -22,20 +22,22 @@ function _git-action {
   local revert_sequence_formatted
 
   for action_dir in \
-    "${git_dir}/rebase-apply" \
-    "${git_dir}/rebase" \
-    "${git_dir}/../.dotest"
+    "$git_dir/rebase-apply" \
+    "$git_dir/rebase" \
+    "$git_dir/../.dotest"
   do
     if [[ -d "$action_dir" ]] ; then
-      zstyle -s ':prezto:module:git:info:action:apply' format 'apply_formatted' || apply_formatted='apply'
-      zstyle -s ':prezto:module:git:info:action:rebase' format 'rebase_formatted' || rebase_formatted='rebase'
+      zstyle -s ':prezto:module:git:info:action:apply' format 'apply_formatted' \
+          || apply_formatted='apply'
+      zstyle -s ':prezto:module:git:info:action:rebase' format 'rebase_formatted' \
+          || rebase_formatted='rebase'
 
-      if [[ -f "${action_dir}/rebasing" ]] ; then
+      if [[ -f "$action_dir/rebasing" ]] ; then
         print "$rebase_formatted"
-      elif [[ -f "${action_dir}/applying" ]] ; then
+      elif [[ -f "$action_dir/applying" ]] ; then
         print "$apply_formatted"
       else
-        print "${rebase_formatted}/${apply_formatted}"
+        print "$rebase_formatted/$apply_formatted"
       fi
 
       return 0
@@ -43,59 +45,67 @@ function _git-action {
   done
 
   for action_dir in \
-    "${git_dir}/rebase-merge/interactive" \
-    "${git_dir}/.dotest-merge/interactive"
+    "$git_dir/rebase-merge/interactive" \
+    "$git_dir/.dotest-merge/interactive"
   do
     if [[ -f "$action_dir" ]]; then
-      zstyle -s ':prezto:module:git:info:action:rebase-interactive' format 'rebase_interactive_formatted' || rebase_interactive_formatted='rebase-interactive'
+      zstyle -s ':prezto:module:git:info:action:rebase-interactive' format 'rebase_interactive_formatted' \
+          || rebase_interactive_formatted='rebase-interactive'
       print "$rebase_interactive_formatted"
       return 0
     fi
   done
 
   for action_dir in \
-    "${git_dir}/rebase-merge" \
-    "${git_dir}/.dotest-merge"
+    "$git_dir/rebase-merge" \
+    "$git_dir/.dotest-merge"
   do
     if [[ -d "$action_dir" ]]; then
-      zstyle -s ':prezto:module:git:info:action:rebase-merge' format 'rebase_merge_formatted' || rebase_merge_formatted='rebase-merge'
+      zstyle -s ':prezto:module:git:info:action:rebase-merge' format 'rebase_merge_formatted' \
+          || rebase_merge_formatted='rebase-merge'
       print "$rebase_merge_formatted"
       return 0
     fi
   done
 
-  if [[ -f "${git_dir}/MERGE_HEAD" ]]; then
-    zstyle -s ':prezto:module:git:info:action:merge' format 'merge_formatted' || merge_formatted='merge'
+  if [[ -f "$git_dir/MERGE_HEAD" ]]; then
+    zstyle -s ':prezto:module:git:info:action:merge' format 'merge_formatted' \
+        || merge_formatted='merge'
     print "$merge_formatted"
     return 0
   fi
 
-  if [[ -f "${git_dir}/CHERRY_PICK_HEAD" ]]; then
-    if [[ -d "${git_dir}/sequencer" ]] ; then
-      zstyle -s ':prezto:module:git:info:action:cherry-pick-sequence' format 'cherry_pick_sequence_formatted' || cherry_pick_sequence_formatted='cherry-pick-sequence'
+  if [[ -f "$git_dir/CHERRY_PICK_HEAD" ]]; then
+    if [[ -d "$git_dir/sequencer" ]] ; then
+      zstyle -s ':prezto:module:git:info:action:cherry-pick-sequence' format 'cherry_pick_sequence_formatted' \
+          || cherry_pick_sequence_formatted='cherry-pick-sequence'
       print "$cherry_pick_sequence_formatted"
     else
-      zstyle -s ':prezto:module:git:info:action:cherry-pick' format 'cherry_pick_formatted' || cherry_pick_formatted='cherry-pick'
+      zstyle -s ':prezto:module:git:info:action:cherry-pick' format 'cherry_pick_formatted' \
+          || cherry_pick_formatted='cherry-pick'
       print "$cherry_pick_formatted"
     fi
 
     return 0
   fi
 
-  if [[ -f "${git_dir}/REVERT_HEAD" ]]; then
-    if [[ -d "${git_dir}/sequencer" ]] ; then
-      zstyle -s ':prezto:module:git:info:action:revert-sequence' format 'revert_sequence_formatted' || revert_sequence_formatted='revert-sequence'
+  if [[ -f "$git_dir/REVERT_HEAD" ]]; then
+    if [[ -d "$git_dir/sequencer" ]] ; then
+      zstyle -s ':prezto:module:git:info:action:revert-sequence' format 'revert_sequence_formatted' \
+          || revert_sequence_formatted='revert-sequence'
       print "$revert_sequence_formatted"
     else
-      zstyle -s ':prezto:module:git:info:action:revert' format 'revert_formatted' || revert_formatted='revert'
+      zstyle -s ':prezto:module:git:info:action:revert' format 'revert_formatted' \
+          || revert_formatted='revert'
       print "$revert_formatted"
     fi
 
     return 0
   fi
 
-  if [[ -f "${git_dir}/BISECT_LOG" ]]; then
-    zstyle -s ':prezto:module:git:info:action:bisect' format 'bisect_formatted' || bisect_formatted='bisect'
+  if [[ -f "$git_dir/BISECT_LOG" ]]; then
+    zstyle -s ':prezto:module:git:info:action:bisect' format 'bisect_formatted' \
+        || bisect_formatted='bisect'
     print "$bisect_formatted"
     return 0
   fi
@@ -212,10 +222,17 @@ function git-info {
 
   # Format stashed.
   zstyle -s ':prezto:module:git:info:stashed' format 'stashed_format'
-  if [[ -n "$stashed_format" && -f "$(git-dir)/refs/stash" ]]; then
-    stashed="$(command git stash list 2> /dev/null | wc -l | awk '{print $1}')"
-    if [[ -n "$stashed" ]]; then
-      zformat -f stashed_formatted "$stashed_format" "S:$stashed"
+  if [[ -n "$stashed_format" ]]; then
+    commondir=""
+    if [[ -f "$(git-dir)/commondir" ]]; then
+      commondir="$(<$(git-dir)/commondir)"
+      [[ "$commondir" =~ ^/ ]] || commondir="$(git-dir)/$commondir"
+    fi
+    if [[ -f "$(git-dir)/refs/stash" || ( -n "$commondir" && -f "$commondir/refs/stash" ) ]]; then
+      stashed=${#${(f)"$(command git stash list 2> /dev/null)"}}
+      if (( $stashed > 0 )); then
+        zformat -f stashed_formatted "$stashed_format" "S:$stashed"
+      fi
     fi
   fi
 
@@ -268,7 +285,7 @@ function git-info {
 
     # Format ahead.
     if [[ -n "$ahead_format" ]]; then
-      ahead="$ahead_and_behind[(w)1]"
+      ahead="$ahead_and_behind[(pws:\t:)1]"
       if (( ahead > 0 )); then
         zformat -f ahead_formatted "$ahead_format" "A:$ahead"
       fi
@@ -276,7 +293,7 @@ function git-info {
 
     # Format behind.
     if [[ -n "$behind_format" ]]; then
-      behind="$ahead_and_behind[(w)2]"
+      behind="$ahead_and_behind[(pws:\t:)2]"
       if (( behind > 0 )); then
         zformat -f behind_formatted "$behind_format" "B:$behind"
       fi
@@ -400,6 +417,11 @@ function git-info {
   if (( dirty > 0 )); then
     zstyle -s ':prezto:module:git:info:dirty' format 'dirty_format'
     zformat -f dirty_formatted "$dirty_format" "D:$dirty"
+    # Overwrite branch format to use dirty-branch format
+    zstyle -s ':prezto:module:git:info:dirty-branch' format 'branch_format'
+    if [[ -n "$branch" && -n "$branch_format" ]]; then
+      zformat -f branch_formatted "$branch_format" "b:$branch"
+    fi
   else
     zstyle -s ':prezto:module:git:info:clean' format 'clean_formatted'
   fi
diff --git a/modules/git/functions/git-stash-clear-interactive b/modules/git/functions/git-stash-clear-interactive
index cc665a18..163deac8 100644
--- a/modules/git/functions/git-stash-clear-interactive
+++ b/modules/git/functions/git-stash-clear-interactive
@@ -15,7 +15,7 @@ fi
 local stashed
 
 if [[ -f "$(git-dir)/refs/stash" ]]; then
-  stashed="$(command git stash list 2> /dev/null | wc -l | awk '{print $1}')"
+  stashed=${#${(f)"$(command git stash list 2> /dev/null)"}}
   if (( $stashed > 0 )); then
     if read -q "?Clear $stashed stashed state(s) [y/N]? "; then
       command git stash clear
diff --git a/modules/git/functions/git-stash-dropped b/modules/git/functions/git-stash-dropped
index d9e759e8..142a4a75 100644
--- a/modules/git/functions/git-stash-dropped
+++ b/modules/git/functions/git-stash-dropped
@@ -16,7 +16,7 @@ command git fsck --unreachable 2> /dev/null \
   | grep 'commit' \
   | awk '{print $3}' \
   | command git log \
-      --pretty=format:${_git_log_oneline_format} \
+      --pretty=format:$_git_log_oneline_format \
       --extended-regexp \
       --grep="${1:-(WIP )?[Oo]n [^:]+:}" \
       --merges \
diff --git a/modules/git/functions/git-submodule-move b/modules/git/functions/git-submodule-move
index 746f46e5..5e162a13 100644
--- a/modules/git/functions/git-submodule-move
+++ b/modules/git/functions/git-submodule-move
@@ -26,7 +26,7 @@ if [[ -z "$url" ]]; then
   return 1
 fi
 
-mkdir -p "${dst:h}"
+mkdir -p "$dst:h"
 
 git-submodule-remove "$src"
 command git submodule add "$url" "$dst"
diff --git a/modules/git/functions/git-submodule-remove b/modules/git/functions/git-submodule-remove
index c8c11aa8..b5233141 100644
--- a/modules/git/functions/git-submodule-remove
+++ b/modules/git/functions/git-submodule-remove
@@ -22,9 +22,9 @@ command git config --file "$(git-dir)/config" --remove-section "submodule.${1}"
 command git config --file "$(git-root)/.gitmodules" --remove-section "submodule.${1}" &> /dev/null
 command git add .gitmodules
 
-command git rm --cached -rf "${1}"
-rm -rf "${1}"
-rm -rf "$(git-dir)/modules/${1}"
+command git rm --cached -rf "$1"
+rm -rf "$1"
+rm -rf "$(git-dir)/modules/$1"
 
 return 0
 
diff --git a/modules/git/init.zsh b/modules/git/init.zsh
index ba540828..ac7ef753 100644
--- a/modules/git/init.zsh
+++ b/modules/git/init.zsh
@@ -13,5 +13,8 @@ fi
 # Load dependencies.
 pmodload 'helper'
 
+# Load 'run-help' function.
+autoload -Uz run-help-git
+
 # Source module files.
 source "${0:h}/alias.zsh"
diff --git a/modules/gnu-utility/README.md b/modules/gnu-utility/README.md
index 7e62a176..747c72fb 100644
--- a/modules/gnu-utility/README.md
+++ b/modules/gnu-utility/README.md
@@ -1,34 +1,34 @@
-GNU Utility
-===========
+# GNU Utility
 
 Provides for the interactive use of GNU utilities on BSD systems.
 
-Installing GNU utilities on non-GNU systems in `$PATH` without a prefix, i.e.
+Installing GNU utilities on non-GNU systems in `$PATH` without a prefix, i.e.,
 `ls` instead of `gls`, is not recommended since scripts that target other
 utilities will be broken.
 
 This module wraps GNU utilities in functions without a prefix for interactive
 use.
 
-This module must be loaded **before** the *utility* module.
+This module must be loaded _before_ the [_`utility`_][1] module so that GNU
+utilities enabled in this module are available for configuration in _`utility`_
+module.
 
-Settings
---------
+## Settings
 
 ### Prefix
 
-To use a different prefix, add the following to *zpreztorc*, and replace 'g' with
-the desired prefix:
+To use a different prefix, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_, and replace `'g'` with the desired prefix.
 
 ```sh
 zstyle ':prezto:module:gnu-utility' prefix 'g'
 ```
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][1].*
+_The authors of this module should be contacted via the [issue tracker][2]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
-[1]: https://github.com/sorin-ionescu/prezto/issues
+[1]: ../utility#readme
+[2]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/gnu-utility/init.zsh b/modules/gnu-utility/init.zsh
index cbf9a4ba..2cfbf2fa 100644
--- a/modules/gnu-utility/init.zsh
+++ b/modules/gnu-utility/init.zsh
@@ -6,34 +6,36 @@
 #
 
 # Get the prefix or use the default.
-zstyle -s ':prezto:module:gnu-utility' prefix '_gnu_utility_p' || _gnu_utility_p='g'
+zstyle -s ':prezto:module:gnu-utility' prefix '_gnu_utility_p' \
+    || _gnu_utility_p='g'
 
 # Return if requirements are not found.
-if (( ! ${+commands[${_gnu_utility_p}whoami]} )); then
+if (( ! $+commands[${_gnu_utility_p}whoami] )); then
   return 1
 fi
 
 _gnu_utility_cmds=(
   # Coreutils
-  '[' 'base64' 'basename' 'cat' 'chcon' 'chgrp' 'chmod' 'chown'
-  'chroot' 'cksum' 'comm' 'cp' 'csplit' 'cut' 'date' 'dd' 'df'
-  'dir' 'dircolors' 'dirname' 'du' 'echo' 'env' 'expand' 'expr'
-  'factor' 'false' 'fmt' 'fold' 'groups' 'head' 'hostid' 'id'
-  'install' 'join' 'kill' 'link' 'ln' 'logname' 'ls' 'md5sum'
-  'mkdir' 'mkfifo' 'mknod' 'mktemp' 'mv' 'nice' 'nl' 'nohup' 'nproc'
-  'od' 'paste' 'pathchk' 'pinee' 'pr' 'printenv' 'printf' 'ptx'
-  'pwd' 'readlink' 'realpath' 'rm' 'rmdir' 'runcon' 'seq' 'sha1sum'
-  'sha224sum' 'sha256sum' 'sha384sum' 'sha512sum' 'shred' 'shuf'
-  'sleep' 'sort' 'split' 'stat' 'stty' 'sum' 'sync' 'tac' 'tail'
-  'tee' 'test' 'timeout' 'touch' 'tr' 'true' 'truncate' 'tsort'
-  'tty' 'uname' 'unexpand' 'uniq' 'unlink' 'uptime' 'users' 'vdir'
+  '[' 'b2sum' 'base32' 'base64' 'basename' 'basenc' 'cat' 'chcon' 'chgrp'
+  'chmod' 'chown' 'chroot' 'cksum' 'comm' 'cp' 'csplit' 'cut'
+  'date' 'dd' 'df' 'dir' 'dircolors' 'dirname' 'du' 'echo' 'env' 'expand' 'expr'
+  'factor' 'false' 'fmt' 'fold' 'groups' 'head' 'hostid' 'id' 'install' 'join'
+  'kill' 'link' 'ln' 'logname' 'ls' 'md5sum' 'mkdir' 'mkfifo'
+  'mknod' 'mktemp' 'mv' 'nice' 'nl' 'nohup' 'nproc' 'numfmt' 'od'
+  'paste' 'pathchk' 'pinky' 'pr' 'printenv' 'printf' 'ptx' 'pwd'
+  'readlink' 'realpath' 'rm' 'rmdir' 'runcon'
+  'seq' 'sha1sum' 'sha224sum' 'sha256sum' 'sha384sum' 'sha512sum' 'shred' 'shuf'
+  'sleep' 'sort' 'split' 'stat' 'stdbuf' 'stty' 'sum' 'sync' 'tac' 'tail'
+  'tee' 'test' 'timeout' 'touch' 'tr' 'true' 'truncate' 'tsort' 'tty'
+  'uname' 'unexpand' 'uniq' 'unlink' 'uptime' 'users' 'vdir'
   'wc' 'who' 'whoami' 'yes'
 
   # The following utilities are not part of Coreutils but installed separately.
 
   # Binutils
-  'addr2line' 'ar' 'c++filt' 'elfedit' 'nm' 'objcopy' 'objdump'
-  'ranlib' 'readelf' 'size' 'strings' 'strip'
+  'addr2line' 'ar' 'c++filt' 'coffdump' 'dlltool' 'dllwrap' 'elfedit' 'nm'
+  'objcopy' 'objdump' 'ranlib' 'readelf'
+  'size' 'srconv' 'strings' 'strip' 'sysdump' 'windmc' 'windres'
 
   # Findutils
   'find' 'locate' 'oldfind' 'updatedb' 'xargs'
@@ -42,16 +44,17 @@ _gnu_utility_cmds=(
   'libtool' 'libtoolize'
 
   # Miscellaneous
-  'getopt' 'grep' 'indent' 'make' 'sed' 'tar' 'time' 'units' 'which'
+  'awk' 'getopt' 'grep' 'indent' 'make' 'sed' 'tar' 'time' 'units' 'which'
 )
 
 # Wrap GNU utilities in functions.
 for _gnu_utility_cmd in "${_gnu_utility_cmds[@]}"; do
   _gnu_utility_pcmd="${_gnu_utility_p}${_gnu_utility_cmd}"
-  if (( ${+commands[${_gnu_utility_pcmd}]} && ! ${+builtins[${_gnu_utility_cmd}]} )); then
+  if (( $+commands[$_gnu_utility_pcmd] \
+        && ! $+builtins[$_gnu_utility_cmd] )); then
     eval "
-      function ${_gnu_utility_cmd} {
-        '${commands[${_gnu_utility_pcmd}]}' \"\$@\"
+      function $_gnu_utility_cmd {
+        '$commands[$_gnu_utility_pcmd]' \"\$@\"
       }
     "
   fi
diff --git a/modules/gpg/README.md b/modules/gpg/README.md
index be3c1a92..08730ebd 100644
--- a/modules/gpg/README.md
+++ b/modules/gpg/README.md
@@ -1,13 +1,14 @@
-GPG
-===
+# GPG
 
 Provides for an easier use of [GPG][1] by setting up [gpg-agent][2].
 
+## Settings
+
 ### SSH
 
 To enable OpenSSH Agent protocol emulation, and make `gpg-agent` a drop-in
 replacement for `ssh-agent`, add the following line to
-*~/.gnupg/gpg-agent.conf*:
+_`$GNUPGHOME/gpg-agent.conf`_ or _`$$HOME/.gnupg/gpg-agent.conf`_:
 
 ```conf
 enable-ssh-support
@@ -16,13 +17,12 @@ enable-ssh-support
 When OpenSSH Agent protocol emulation is enabled, this module will load the SSH
 module for additional processing.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][3].*
+_The authors of this module should be contacted via the [issue tracker][3]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
-[1]: http://www.gnupg.org
-[2]: http://linux.die.net/man/1/gpg-agent
+[1]: https://www.gnupg.org
+[2]: https://linux.die.net/man/1/gpg-agent
 [3]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/gpg/init.zsh b/modules/gpg/init.zsh
index 7976fd7d..a3b37ba3 100644
--- a/modules/gpg/init.zsh
+++ b/modules/gpg/init.zsh
@@ -12,7 +12,7 @@ fi
 
 # Set the default paths to gpg-agent files.
 _gpg_agent_conf="${GNUPGHOME:-$HOME/.gnupg}/gpg-agent.conf"
-_gpg_agent_env="${TMPDIR:-/tmp}/gpg-agent.env.$UID"
+_gpg_agent_env="${XDG_CACHE_HOME:-$HOME/.cache}/prezto/gpg-agent.env"
 
 # Load environment variables from previous run
 source "$_gpg_agent_env" 2> /dev/null
@@ -21,12 +21,13 @@ source "$_gpg_agent_env" 2> /dev/null
 if [[ -z "$GPG_AGENT_INFO" && ! -S "${GNUPGHOME:-$HOME/.gnupg}/S.gpg-agent" ]]; then
   # Start gpg-agent if not started.
   if ! ps -U "$LOGNAME" -o pid,ucomm | grep -q -- "${${${(s.:.)GPG_AGENT_INFO}[2]}:--1} gpg-agent"; then
+    mkdir -p "$_gpg_agent_env:h"
     eval "$(gpg-agent --daemon | tee "$_gpg_agent_env")"
   fi
 fi
 
 # Inform gpg-agent of the current TTY for user prompts.
-export GPG_TTY="$(tty)"
+export GPG_TTY=$TTY
 
 # Integrate with the SSH module.
 if grep '^enable-ssh-support' "$_gpg_agent_conf" &> /dev/null; then
diff --git a/modules/haskell/README.md b/modules/haskell/README.md
index dcf144c6..db7bfae0 100644
--- a/modules/haskell/README.md
+++ b/modules/haskell/README.md
@@ -1,10 +1,8 @@
-Haskell
-=======
+# Haskell
 
 Enables local Haskell package installation.
 
-Per-user Package Installation
------------------------------
+## Per-user Package Installation
 
 [Cabal][1], the Haskell package manager, can install packages into per user
 directories.
@@ -17,12 +15,11 @@ documentation.
 
 Install packages into per user directories with `cabal install --user`.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][2].*
+_The authors of this module should be contacted via the [issue tracker][2]._
 
-  - [Sebastian Wiesner](https://github.com/lunaryorn)
+- [Sebastian Wiesner](https://github.com/lunaryorn)
 
-[1]: http://www.haskell.org/cabal/
+[1]: https://www.haskell.org/cabal/
 [2]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/haskell/init.zsh b/modules/haskell/init.zsh
index c1c78ca2..cb768641 100644
--- a/modules/haskell/init.zsh
+++ b/modules/haskell/init.zsh
@@ -10,8 +10,11 @@ if (( ! $+commands[ghc] )); then
   return 1
 fi
 
+# Load dependencies.
+pmodload 'helper'
+
 # Prepend Cabal per user directories to PATH.
-if [[ "$OSTYPE" == darwin* && -d $HOME/Library/Haskell ]]; then
+if is-darwin && [[  -d $HOME/Library/Haskell ]]; then
   path=($HOME/Library/Haskell/bin(/N) $path)
 else
   path=($HOME/.cabal/bin(/N) $path)
diff --git a/modules/helper/README.md b/modules/helper/README.md
index 9f10d6ee..5c90a63c 100644
--- a/modules/helper/README.md
+++ b/modules/helper/README.md
@@ -1,24 +1,26 @@
-Helper
-======
+# Helper
 
 Provides helper functions for developing modules.
 
-Functions
----------
+## Functions
 
-  - `add-zsh-trap` adds a function name to a list to be called when a trap is
-    triggered.
-  - `is-autoloadable` checks if a file can be autoloaded by trying to load it
-    in a subshell.
-  - `is-callable` checks if a name is a command, function, or alias.
-  - `is-true` checks a boolean variable for "true".
-  - `coalesce` prints the first non-empty string in the arguments array.
+- `add-zsh-trap` adds a function name to a list to be called when a trap is
+  triggered.
+- `is-autoloadable` checks if a file can be autoloaded by trying to load it in
+  a subshell.
+- `is-callable` checks if a name is a command, function, or alias.
+- `is-true` checks a boolean variable for "true".
+- `coalesce` prints the first non-empty string in the arguments array.
+- `is-darwin` checks if running on macOS Darwin.
+- `is-linux` checks if running on Linux.
+- `is-bsd` checks if running on BSD.
+- `is-cygwin` checks if running on Cygwin (Windows).
+- `is-termux` checks if running on Termux (Android).
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][1].*
+_The authors of this module should be contacted via the [issue tracker][1]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
 [1]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/helper/init.zsh b/modules/helper/init.zsh
index 328bed4f..0a33d7c8 100644
--- a/modules/helper/init.zsh
+++ b/modules/helper/init.zsh
@@ -29,3 +29,28 @@ function coalesce {
   done
   return 1
 }
+
+# Checks if running on macOS Darwin.
+function is-darwin {
+  [[ "$OSTYPE" == darwin* ]]
+}
+
+# Checks if running on Linux.
+function is-linux {
+  [[ "$OSTYPE" == linux* ]]
+}
+
+# Checks if running on BSD.
+function is-bsd {
+  [[ "$OSTYPE" == *bsd* ]]
+}
+
+# Checks if running on Cygwin (Windows).
+function is-cygwin {
+  [[ "$OSTYPE" == cygwin* ]]
+}
+
+# Checks if running on termux (Android).
+function is-termux {
+  [[ "$OSTYPE" == linux-android ]]
+}
diff --git a/modules/history-substring-search/README.md b/modules/history-substring-search/README.md
index 050a5c2e..e7c55c53 100644
--- a/modules/history-substring-search/README.md
+++ b/modules/history-substring-search/README.md
@@ -1,28 +1,32 @@
-History Substring Search
-========================
+# History Substring Search
 
-Integrates [zsh-history-substring-search][1] into Prezto, which implements
-the [Fish shell][2]'s history search feature, where the user can type in any
-part of a previously entered command and press up and down to cycle through
-matching commands.
+Integrates [`zsh-history-substring-search`][1] into Prezto, which implements the
+[Fish shell][2]'s history search feature, where the user can type in any part of
+a previously entered command and press up and down to cycle through matching
+commands.
 
-If this module is used in conjunction with the *syntax-highlighting* module,
-this module must be loaded **after** the *syntax-highlighting* module.
+If this module is used in conjunction with the [_`syntax-highlighting`_][3]
+module, this module must be loaded _after_ the _`syntax-highlighting`_ module.
 
-Contributors
-------------
+Additionally, if this module is used in conjunction with the
+[_`autosuggestions`_][4] module, this module must be loaded _before_ the
+_`autosuggestions`_ module.
+
+To elaborate, the relative order of loading the modules would be
+_`syntax-highlighting`_, _`history-substring-search`_ and _`autosuggestions`_.
+
+## Contributors
 
 New features and bug fixes should be submitted to the
-[zsh-history-substring-search][1] project according to its rules and
+[`zsh-history-substring-search`][1] project according to its rules and
 regulations. This module will be synchronized against it.
 
-Settings
---------
+## Settings
 
 ### Case Sensitivity
 
 To enable case-sensitivity for this module only, add the following line to
-*zpreztorc*:
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:history-substring-search' case-sensitive 'yes'
@@ -30,42 +34,82 @@ zstyle ':prezto:module:history-substring-search' case-sensitive 'yes'
 
 ### Highlighting
 
-If colors are enabled, *history-substring-search* will automatically highlight
+If colors are enabled, _history-substring-search_ will automatically highlight
 positive results.
 
-To enable highlighting for this module only, add the following line to
-*zpreztorc*:
+To disable highlighting for this module only, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
-zstyle ':prezto:module:history-substring-search' color 'yes'
+zstyle ':prezto:module:history-substring-search' color 'no'
 ```
 
-To set the query found color, add the following line to *zpreztorc*:
+To set the query found color, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:history-substring-search:color' found ''
 ```
 
-To set the query not found color, add the following line to *zpreztorc*:
+To set the query not found color, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:history-substring-search:color' not-found ''
 ```
 
-To set the search globbing flags, add the following line to *zpreztorc*:
+To set the search globbing flags, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:history-substring-search' globbing-flags ''
 ```
 
-Authors
--------
+### Case sensitive search
 
-*The authors of this module should be contacted via the [issue tracker][3].*
+To set the search case-sensitivity, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
-  - [Suraj N. Kurapati](https://github.com/sunaku)
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+```sh
+zstyle ':prezto:module:history-substring-search' case-sensitive 'yes'
+```
+
+### Fuzzy search
+
+To enable search for fuzzy matches, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
+
+```sh
+zstyle ':prezto:module:history-substring-search' fuzzy 'yes'
+```
+
+### Unique results
+
+To enable unique results, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
+
+```sh
+zstyle ':prezto:module:history-substring-search' unique 'yes'
+```
+
+### Prefixed search
+
+To enable prefixed search matches, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
+
+```sh
+zstyle ':prezto:module:history-substring-search' prefixed 'yes'
+```
+
+## Authors
+
+_The authors of this module should be contacted via the [issue tracker][5]._
+
+- [Suraj N. Kurapati](https://github.com/sunaku)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
 [1]: https://github.com/zsh-users/zsh-history-substring-search
-[2]: http://fishshell.com
-[3]: https://github.com/sorin-ionescu/prezto/issues
+[2]: https://fishshell.com
+[3]: ../syntax-highlighting#readme
+[4]: ../autosuggestions#readme
+[5]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/history-substring-search/external b/modules/history-substring-search/external
index aae33884..8dd05bfc 160000
--- a/modules/history-substring-search/external
+++ b/modules/history-substring-search/external
@@ -1 +1 @@
-Subproject commit aae3388491c2312c4efb2e86bcb999927bb2900e
+Subproject commit 8dd05bfcc12b0cd1ee9ea64be725b3d9f713cf64
diff --git a/modules/history-substring-search/init.zsh b/modules/history-substring-search/init.zsh
index d3ee3a11..54e8b00e 100644
--- a/modules/history-substring-search/init.zsh
+++ b/modules/history-substring-search/init.zsh
@@ -10,7 +10,9 @@
 pmodload 'editor'
 
 # Source module files.
-source "${0:h}/external/zsh-history-substring-search.zsh" || return 1
+if (( ! $+functions[history-substring-search-up] )); then
+  source "${0:h}/external/zsh-history-substring-search.zsh" || return 1
+fi
 
 #
 # Search
@@ -36,6 +38,18 @@ if ! zstyle -t ':prezto:module:history-substring-search' color; then
   unset HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_{FOUND,NOT_FOUND}
 fi
 
+if zstyle -t ':prezto:module:history-substring-search' fuzzy; then
+  HISTORY_SUBSTRING_SEARCH_FUZZY=1
+fi
+
+if zstyle -t ':prezto:module:history-substring-search' unique; then
+  HISTORY_SUBSTRING_SEARCH_ENSURE_UNIQUE=1
+fi
+
+if zstyle -t ':prezto:module:history-substring-search' prefixed; then
+  HISTORY_SUBSTRING_SEARCH_PREFIXED=1
+fi
+
 #
 # Key Bindings
 #
diff --git a/modules/history/README.md b/modules/history/README.md
index 3dc9a264..51e6e8ca 100644
--- a/modules/history/README.md
+++ b/modules/history/README.md
@@ -1,43 +1,86 @@
-History
-=======
+# History
 
 Sets [history][1] options and defines history aliases.
 
-Variables
----------
+**Note:** Default path of `HISTFILE` has changed from
+_`${ZDOTDIR:-$HOME}/.zhistory`_ to _`${ZDOTDIR:-$HOME}/.zsh_history`_. The file
+will be automatically renamed if possible (when the new one doesn't exist).
+Otherwise, if you want to preserve previous history, you will need to move them
+from _`${ZDOTDIR:-$HOME}/.zhistory`_ to _`${ZDOTDIR:-$HOME}/.zsh_history`_.
 
-  - `HISTFILE` stores the path to the history file.
-  - `HISTSIZE` stores the maximum number of events to save in the internal history.
-  - `SAVEHIST` stores the maximum number of events to save in the history file.
+Alternately, you can set `HISTFILE` manually to _`${ZDOTDIR:-$HOME}/.zhistory`_.
 
-Options
--------
+## Options
 
-  - `BANG_HIST` treats the **!** character specially during expansion.
-  - `EXTENDED_HISTORY` writes the history file in the *:start:elapsed;command* format.
-  - `INC_APPEND_HISTORY` writes to the history file immediately, not when the shell exits.
-  - `SHARE_HISTORY` shares history between all sessions.
-  - `HIST_EXPIRE_DUPS_FIRST` expires a duplicate event first when trimming history.
-  - `HIST_IGNORE_DUPS` does not record an event that was just recorded again.
-  - `HIST_IGNORE_ALL_DUPS` deletes an old recorded event if a new event is a duplicate.
-  - `HIST_FIND_NO_DUPS` does not display a previously found event.
-  - `HIST_IGNORE_SPACE` does not record an event starting with a space.
-  - `HIST_SAVE_NO_DUPS` does not write a duplicate event to the history file.
-  - `HIST_VERIFY` does not execute immediately upon history expansion.
-  - `HIST_BEEP` beeps when accessing non-existent history.
+- `BANG_HIST` treats the **!** character specially during expansion.
+- `EXTENDED_HISTORY` writes the history file in the _:start:elapsed;command_
+  format.
+- `SHARE_HISTORY` shares history between all sessions. Note that
+  `SHARE_HISTORY`, `INC_APPEND_HISTORY`, and `INC_APPEND_HISTORY_TIME` are
+  mutually exclusive.
+- `HIST_EXPIRE_DUPS_FIRST` expires a duplicate event first when trimming history.
+- `HIST_IGNORE_DUPS` does not record an event that was just recorded again.
+- `HIST_IGNORE_ALL_DUPS` deletes an old recorded event if a new event is a
+  duplicate.
+- `HIST_FIND_NO_DUPS` does not display a previously found event.
+- `HIST_IGNORE_SPACE` does not record an event starting with a space.
+- `HIST_SAVE_NO_DUPS` does not write a duplicate event to the history file.
+- `HIST_VERIFY` does not execute immediately upon history expansion.
+- `HIST_BEEP` beeps when accessing non-existent history.
 
-Aliases
--------
+## Variables
 
-  - `history-stat` lists the ten most used commands
+- `HISTFILE` stores the path to the history file.
+- `HISTSIZE` stores the maximum number of events to save in the internal history.
+- `SAVEHIST` stores the maximum number of events to save in the history file.
 
-Authors
--------
+## Aliases
 
-*The authors of this module should be contacted via the [issue tracker][2].*
+Aliases are enabled by default. To disable them, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
-  - [Robby Russell](https://github.com/robbyrussell)
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+```sh
+zstyle ':prezto:module:history:alias' skip 'yes'
+```
 
-[1]: http://zsh.sourceforge.net/Guide/zshguide02.html#l16
+- `history-stat` lists the ten most used commands
+
+## Settings
+
+### histfile
+
+Can be configured either by setting HISTFILE manually before loading this
+module or by using zstyle:
+
+```sh
+zstyle ':prezto:module:history' histfile "<file_name>"
+```
+
+defaults to "${ZDOTDIR:-$HOME}/.zsh_history".
+
+### histsize
+
+```sh
+zstyle ':prezto:module:history' histsize <number>
+```
+
+defaults to 10000.
+
+### savehist
+
+```sh
+zstyle ':prezto:module:history' savehist <number>
+```
+
+defaults to histsize
+
+## Authors
+
+_The authors of this module should be contacted via the [issue tracker][2]._
+
+- [Robby Russell](https://github.com/robbyrussell)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Indrajit Raychaudhuri](https://github.com/indrajitr)
+
+[1]: https://zsh.sourceforge.net/Guide/zshguide02.html#l16
 [2]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/history/init.zsh b/modules/history/init.zsh
index 31db4c5b..069dc2f1 100644
--- a/modules/history/init.zsh
+++ b/modules/history/init.zsh
@@ -6,34 +6,38 @@
 #   Sorin Ionescu <sorin.ionescu@gmail.com>
 #
 
-#
-# Variables
-#
-
-HISTFILE="${ZDOTDIR:-$HOME}/.zhistory"       # The path to the history file.
-HISTSIZE=10000                   # The maximum number of events to save in the internal history.
-SAVEHIST=10000                   # The maximum number of events to save in the history file.
-
 #
 # Options
 #
 
-setopt BANG_HIST                 # Treat the '!' character specially during expansion.
-setopt EXTENDED_HISTORY          # Write the history file in the ':start:elapsed;command' format.
-setopt INC_APPEND_HISTORY        # Write to the history file immediately, not when the shell exits.
-setopt SHARE_HISTORY             # Share history between all sessions.
-setopt HIST_EXPIRE_DUPS_FIRST    # Expire a duplicate event first when trimming history.
-setopt HIST_IGNORE_DUPS          # Do not record an event that was just recorded again.
-setopt HIST_IGNORE_ALL_DUPS      # Delete an old recorded event if a new event is a duplicate.
-setopt HIST_FIND_NO_DUPS         # Do not display a previously found event.
-setopt HIST_IGNORE_SPACE         # Do not record an event starting with a space.
-setopt HIST_SAVE_NO_DUPS         # Do not write a duplicate event to the history file.
-setopt HIST_VERIFY               # Do not execute immediately upon history expansion.
-setopt HIST_BEEP                 # Beep when accessing non-existent history.
+setopt BANG_HIST              # Treat the '!' character specially during expansion.
+setopt EXTENDED_HISTORY       # Write the history file in the ':start:elapsed;command' format.
+setopt SHARE_HISTORY          # Share history between all sessions.
+setopt HIST_EXPIRE_DUPS_FIRST # Expire a duplicate event first when trimming history.
+setopt HIST_IGNORE_DUPS       # Do not record an event that was just recorded again.
+setopt HIST_IGNORE_ALL_DUPS   # Delete an old recorded event if a new event is a duplicate.
+setopt HIST_FIND_NO_DUPS      # Do not display a previously found event.
+setopt HIST_IGNORE_SPACE      # Do not record an event starting with a space.
+setopt HIST_SAVE_NO_DUPS      # Do not write a duplicate event to the history file.
+setopt HIST_VERIFY            # Do not execute immediately upon history expansion.
+setopt HIST_BEEP              # Beep when accessing non-existent history.
+
+#
+# Variables
+#
+
+zstyle -s ':prezto:module:history' histfile 'HISTFILE' \
+    || HISTFILE="${HISTFILE:-${ZDOTDIR:-$HOME}/.zsh_history}" # The path to the history file.
+zstyle -s ':prezto:module:history' histsize 'HISTSIZE' \
+    || HISTSIZE=10000                                         # The maximum number of events to save in the internal history.
+zstyle -s ':prezto:module:history' savehist 'SAVEHIST' \
+    || SAVEHIST=$HISTSIZE                                     # The maximum number of events to save in the history file.
 
 #
 # Aliases
 #
 
-# Lists the ten most used commands.
-alias history-stat="history 0 | awk '{print \$2}' | sort | uniq -c | sort -n -r | head"
+if ! zstyle -t ':prezto:module:history:alias' skip; then
+  # Lists the ten most used commands.
+  alias history-stat="history 0 | awk '{print \$2}' | sort | uniq -c | sort -n -r | head"
+fi
diff --git a/modules/homebrew/README.md b/modules/homebrew/README.md
index 98a3444c..77d8f377 100644
--- a/modules/homebrew/README.md
+++ b/modules/homebrew/README.md
@@ -1,39 +1,50 @@
-Homebrew
-========
+# Homebrew
 
-Defines Homebrew aliases.
+Defines Homebrew specific environment variables and aliases.
 
-Aliases
--------
+## Variables
 
-### Homebrew
+Execute the following to list the environment variables loaded in the shell:
 
-  - `brewc` cleans outdated brews and their cached archives.
-  - `brewC` cleans outdated brews, including keg-only, and their cached archives.
-  - `brewi` installs a formula.
-  - `brewl` lists installed formulae.
-  - `brewo` lists brews which have an update available.
-  - `brews` searches for a formula.
-  - `brewu` updates and upgrades Homebrew packages and formulae.
-  - `brewx` uninstalls a formula.
+```sh
+brew shellenv
+```
+
+## Aliases
+
+Aliases are enabled by default. To disable them, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
+
+```sh
+zstyle ':prezto:module:homebrew:alias' skip 'yes'
+```
+
+### Homebrew Core
+
+- `brewc` cleans outdated brews and their cached archives.
+- `brewi` installs a formula.
+- `brewL` lists installed formulae that are not dependencies of another
+  installed formula.
+- `brewl` lists installed formulae.
+- `brewo` lists brews which have an update available.
+- `brews` searches for a formula.
+- `brewu` upgrades outdated formulae.
+- `brewx` uninstalls a formula.
 
 ### Homebrew Cask
 
-  - `cask` is aliased to `brew cask`.
-  - `caskc` cleans up old cached downloads.
-  - `caskC` cleans up all cached downloads.
-  - `caski` installs a cask.
-  - `caskl` lists installed casks.
-  - `casko` lists casks which have an update available.
-  - `casks` searches for a cask.
-  - `caskx` uninstalls a cask.
+- `caski` installs a cask.
+- `caskl` lists installed casks.
+- `casko` lists casks which have an update available.
+- `casks` searches for a cask.
+- `casku` upgrades outdated casks.
+- `caskx` uninstalls a cask.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][1].*
+_The authors of this module should be contacted via the [issue tracker][1]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
-  - [Griffin Yourick](https://github.com/tough-griff)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Griffin Yourick](https://github.com/tough-griff)
 
 [1]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/homebrew/init.zsh b/modules/homebrew/init.zsh
index e517c0a5..dd2b5658 100644
--- a/modules/homebrew/init.zsh
+++ b/modules/homebrew/init.zsh
@@ -5,31 +5,55 @@
 #   Sorin Ionescu <sorin.ionescu@gmail.com>
 #
 
+# Load dependencies.
+pmodload 'helper'
+
 # Return if requirements are not found.
-if [[ "$OSTYPE" != (darwin|linux)* ]]; then
+if ! is-darwin && ! is-linux; then
   return 1
 fi
 
+#
+# Variables
+#
+
+# Load standard Homebrew shellenv into the shell session.
+# Load 'HOMEBREW_' prefixed variables only. Avoid loading 'PATH' related
+# variables as they are already handled in standard zsh configuration.
+if (( $+commands[brew] )); then
+  cache_file="${XDG_CACHE_HOME:-$HOME/.cache}/prezto/brew-shellenv-cache.zsh"
+  if [[ "$commands[brew]" -nt "$cache_file" \
+      || "${ZDOTDIR:-$HOME}/.zpreztorc" -nt "$cache_file" \
+      || ! -s "$cache_file" ]]; then
+    mkdir -p "$cache_file:h"
+    # Cache the result.
+    echo "${(@M)${(f)"$(brew shellenv 2> /dev/null)"}:#export HOMEBREW*}" >! "$cache_file" 2> /dev/null
+  fi
+
+  source "$cache_file"
+  unset cache_file
+fi
+
 #
 # Aliases
 #
 
 # Homebrew
-alias brewc='brew cleanup'
-alias brewC='brew cleanup --force'
-alias brewi='brew install'
-alias brewl='brew list'
-alias brewo='brew outdated'
-alias brews='brew search'
-alias brewu='brew update && brew upgrade'
-alias brewx='brew remove'
+if ! zstyle -t ':prezto:module:homebrew:alias' skip; then
+  alias brewc='brew cleanup'
+  alias brewi='brew install'
+  alias brewL='brew leaves'
+  alias brewl='brew list'
+  alias brewo='brew outdated'
+  alias brews='brew search'
+  alias brewu='brew upgrade'
+  alias brewx='brew uninstall'
 
-# Homebrew Cask
-alias cask='brew cask'
-alias caskc='brew cask cleanup --outdated'
-alias caskC='brew cask cleanup'
-alias caski='brew cask install'
-alias caskl='brew cask list'
-alias casko='brew cask outdated'
-alias casks='brew cask search'
-alias caskx='brew cask uninstall'
+  # Homebrew Cask
+  alias caski='brew install --cask'
+  alias caskl='brew list --cask'
+  alias casko='brew outdated --cask'
+  alias casks='brew search --cask'
+  alias casku='brew upgrade --cask'
+  alias caskx='brew uninstall --cask'
+fi
diff --git a/modules/macports/README.md b/modules/macports/README.md
index 70e4b8b9..15963b33 100644
--- a/modules/macports/README.md
+++ b/modules/macports/README.md
@@ -1,25 +1,29 @@
-MacPorts
-========
+# MacPorts
 
 Defines MacPorts aliases and adds MacPorts directories to path variables.
 
-Aliases
--------
+## Aliases
 
-  - `portc` cleans the files used to build ports.
-  - `porti` installs a port.
-  - `ports` searches for a port.
-  - `portu` upgrades a port.
-  - `portU` upgrades MacPorts, the ports collection, and outdated ports.
-  - `portx` uninstalls a port.
-  - `portX` uninstalls inactive ports.
+Aliases are enabled by default. To disable them, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
-Authors
--------
+```sh
+zstyle ':prezto:module:macports:alias' skip 'yes'
+```
 
-*The authors of this module should be contacted via the [issue tracker][1].*
+- `portc` cleans the files used to build ports.
+- `porti` installs a port.
+- `ports` searches for a port.
+- `portu` upgrades a port.
+- `portU` upgrades MacPorts, the ports collection, and outdated ports.
+- `portx` uninstalls a port.
+- `portX` uninstalls inactive ports.
 
-  - [Matt Cable](https://github.com/curiousstranger)
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+## Authors
+
+_The authors of this module should be contacted via the [issue tracker][1]._
+
+- [Matt Cable](https://github.com/curiousstranger)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
 [1]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/macports/init.zsh b/modules/macports/init.zsh
index d55744a8..1ac3c531 100644
--- a/modules/macports/init.zsh
+++ b/modules/macports/init.zsh
@@ -6,8 +6,11 @@
 #   Sorin Ionescu <sorin.ionescu@gmail.com>
 #
 
+# Load dependencies.
+pmodload 'helper'
+
 # Return if requirements are not found.
-if [[ "$OSTYPE" != darwin* ]]; then
+if ! is-darwin; then
   return 1
 fi
 
@@ -25,10 +28,12 @@ path=(
 # Aliases
 #
 
-alias portc='sudo port clean --all installed'
-alias porti='sudo port install'
-alias ports='port search'
-alias portU='sudo port selfupdate && sudo port upgrade outdated'
-alias portu='sudo port upgrade'
-alias portX='sudo port -u uninstall'
-alias portx='sudo port uninstall'
+if ! zstyle -t ':prezto:module:macports:alias' skip; then
+  alias portc='sudo port clean --all installed'
+  alias porti='sudo port install'
+  alias ports='port search'
+  alias portU='sudo port selfupdate && sudo port upgrade outdated'
+  alias portu='sudo port upgrade'
+  alias portX='sudo port -u uninstall'
+  alias portx='sudo port uninstall'
+fi
diff --git a/modules/node/README.md b/modules/node/README.md
index 951f2a74..bc262151 100644
--- a/modules/node/README.md
+++ b/modules/node/README.md
@@ -1,32 +1,66 @@
-Node.js
-=======
+# Node.js
 
 Provides utility functions for [Node.js][1], loads the Node Version Manager, and
-enables [npm][2] completion.
+enables [_npm_][2] completion.
 
-nvm
----
+This module must be loaded _before_ the _`completion`_ module so that the
+provided completion definitions are loaded.
 
-[nvm][5] allows for managing multiple, isolated Node.js installations in the
+## nodenv
+
+[_nodenv_][5] does one thing well - it is concerned solely with switching
+Node versions. It is simple and predictable, Just Works, and is rock solid in
+production. nodenv is forked from the popular [_rbenv_][6].
+
+This will be loaded automatically if nodenv is installed in `$NODENV_ROOT`,
+_`$XDG_CONFIG_HOME/nodenv`_, _`~/.nodenv`_, or `nodenv` is on the path.
+
+## nvm
+
+[_nvm_][7] allows for managing multiple, isolated Node.js installations in the
 home directory.
 
-nodenv
-------
+This will be loaded automatically if nvm is installed in `$NVM_DIR`,
+_`$XDG_CONFIG_HOME/nvm`_, _`~/.nvm`_, or is installed with homebrew.
 
-[nodenv][6] does one thing well. nodenv is concerned solely with switching
-Node versions. It's simple and predictable, Just Works, and is rock solid in
-production. nodenv is forked from the popular [rbenv][7].
+## Variables
 
-Functions
----------
+- `N_PREFIX` stores the path to [_n_][8] cache.
 
-  - `node-doc` opens the Node.js online [API documentation][3] in the default
-    browser.
-  - `node-info` exposes information about the Node.js environment via the
-    `$node_info` associative array.
+## Aliases
 
-Theming
--------
+Aliases are enabled by default. To disable them, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
+
+```sh
+zstyle ':prezto:module:node:alias' skip 'yes'
+```
+
+### npm
+
+- `npmi` install a package.
+- `npml` list installed packages.
+- `npmo` check for outdated packages.
+- `npmp` publish a package.
+- `npmP` remove extraneous packages.
+- `npmr` run arbitrary package scripts.
+- `npms` search for packages.
+- `npmt` test a package.
+- `npmu` update packages.
+- `npmx` uninstalls a package.
+
+- `npmci` install a project with a clean slate.
+- `npmcit` install a project with a clean slate and run tests.
+- `npmit` install package(s) and run tests.
+
+## Functions
+
+- `node-doc` opens the Node.js online [API documentation][3] in the default
+  browser.
+- `node-info` exposes information about the Node.js environment via the
+  `$node_info` associative array.
+
+## Theming
 
 To display the version number of the current Node.js version, define the
 following style inside the `prompt_name_setup` function.
@@ -39,18 +73,19 @@ zstyle ':prezto:module:node:info:version' format 'version:%v'
 Then add `$node_info[version]` to either `$PROMPT` or `$RPROMPT` and call
 `node-info` in `prompt_name_preexec` hook function.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][4].*
+_The authors of this module should be contacted via the [issue tracker][4]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
-  - [Zeh Rizzatti](https://github.com/zehrizzatti)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Zeh Rizzatti](https://github.com/zehrizzatti)
+- [Indrajit Raychaudhuri](https://github.com/indrajitr)
 
 [1]: http://nodejs.org
 [2]: http://npmjs.org
 [3]: http://nodejs.org/api
 [4]: https://github.com/sorin-ionescu/prezto/issues
-[5]: https://github.com/creationix/nvm
-[6]: https://github.com/nodenv/nodenv
-[7]: https://github.com/sstephenson/rbenv
+[5]: https://github.com/nodenv/nodenv
+[6]: https://github.com/sstephenson/rbenv
+[7]: https://github.com/nvm-sh/nvm
+[8]: https://github.com/tj/n
diff --git a/modules/node/functions/_grunt b/modules/node/functions/_grunt
new file mode 100644
index 00000000..4f1a1888
--- /dev/null
+++ b/modules/node/functions/_grunt
@@ -0,0 +1,15 @@
+#compdef grunt
+#autoload
+
+#
+# Grunt completion, delegating to grunt to do all the completion work.
+#
+# Authors:
+#   Indrajit Raychaudhuri <irc@indrajit.com>
+#
+
+if (( $+commands[grunt] )); then
+  eval "$(grunt --completion=zsh)"
+
+  _grunt_completion "$@"
+fi
diff --git a/modules/node/functions/_gulp b/modules/node/functions/_gulp
new file mode 100644
index 00000000..b06acca7
--- /dev/null
+++ b/modules/node/functions/_gulp
@@ -0,0 +1,15 @@
+#compdef gulp
+#autoload
+
+#
+# Gulp completion, delegating to gulp to do all the completion work.
+#
+# Authors:
+#   Indrajit Raychaudhuri <irc@indrajit.com>
+#
+
+if (( $+commands[gulp] )); then
+  eval "$(gulp --completion=zsh)"
+
+  _gulp_completion "$@"
+fi
diff --git a/modules/node/functions/node-doc b/modules/node/functions/node-doc
index b1a048bd..92ac71d0 100644
--- a/modules/node/functions/node-doc
+++ b/modules/node/functions/node-doc
@@ -13,6 +13,6 @@ if [[ -z "$BROWSER" ]]; then
 fi
 
 # TODO: Make the sections easier to use.
-"$BROWSER" "http://nodejs.org/docs/$(node --version | sed 's/-.*//')/api/all.html#${1}"
+"$BROWSER" "https://nodejs.org/docs/${$(node --version 2> /dev/null)/%-*}/api/all.html#${1}"
 
 # }
diff --git a/modules/node/functions/node-info b/modules/node/functions/node-info
index 22ac31bd..7a591279 100644
--- a/modules/node/functions/node-info
+++ b/modules/node/functions/node-info
@@ -15,13 +15,15 @@ local version_formatted
 unset node_info
 typeset -gA node_info
 
-if (( $+functions[nvm_version] )); then
-  version="${$(nvm_version)#v}"
-elif (( $+commands[nodenv] )); then
+if (( $+commands[nodenv] )); then
   version="${${$(nodenv version)#v}[(w)0]}"
+elif (( $+functions[nvm_version] )); then
+  version="${$(nvm_version)#v}"
+elif (( $+commands[node] )) ; then
+  version="${$(node -v)#v}"
 fi
 
-if [[ "$version" != (none|) ]]; then
+if [[ "$version" != (none|system) ]]; then
   zstyle -s ':prezto:module:node:info:version' format 'version_format'
   zformat -f version_formatted "$version_format" "v:$version"
   node_info[version]="$version_formatted"
diff --git a/modules/node/init.zsh b/modules/node/init.zsh
index 0a516f0d..0c27764d 100644
--- a/modules/node/init.zsh
+++ b/modules/node/init.zsh
@@ -1,45 +1,67 @@
 #
-# Loads the Node Version Manager and enables npm completion.
+# Configures Node local installation, loads version managers, and defines
+# variables and aliases.
 #
 # Authors:
 #   Sorin Ionescu <sorin.ionescu@gmail.com>
 #   Zeh Rizzatti <zehrizzatti@gmail.com>
+#   Indrajit Raychaudhuri <irc@indrajit.com>
 #
 
-# Load manually installed NVM into the shell session.
-if [[ -s "$HOME/.nvm/nvm.sh" ]]; then
-  source "$HOME/.nvm/nvm.sh"
+# Possible lookup locations for manually installed nodenv and nvm.
+local_nodenv_paths=({$NODENV_ROOT,{$XDG_CONFIG_HOME/,$HOME/.}nodenv}/bin/nodenv(N))
+local_nvm_paths=({$NVM_DIR,{$XDG_CONFIG_HOME/,$HOME/.}nvm}/nvm.sh(N))
 
-# Load package manager installed NVM into the shell session.
-elif (( $+commands[brew] )) && [[ -d "$(brew --prefix nvm 2> /dev/null)" ]]; then
-  source "$(brew --prefix nvm)/nvm.sh"
+# Load manually installed or package manager installed nodenv into the shell
+# session.
+if (( $#local_nodenv_paths || $+commands[nodenv] )); then
 
-# Load manually installed nodenv into the shell session.
-elif [[ -s "$HOME/.nodenv/bin/nodenv" ]]; then
-  path=("$HOME/.nodenv/bin" $path)
-  eval "$(nodenv init - --no-rehash zsh)"
+  # Ensure manually installed nodenv is added to path when present.
+  [[ -s $local_nodenv_paths[1] ]] && path=($local_nodenv_paths[1]:h $path)
 
-# Load package manager installed nodenv into the shell session.
-elif (( $+commands[nodenv] )); then
-  eval "$(nodenv init - --no-rehash zsh)"
+  eval "$(nodenv init - zsh)"
+
+# Load manually installed nvm into the shell session.
+elif (( $#local_nvm_paths )); then
+  source "$local_nvm_paths[1]" --no-use
+
+# Load package manager installed nvm into the shell session.
+elif (( $+commands[brew] )) \
+      && [[ -d "${nvm_path::="$(brew --prefix 2> /dev/null)"/opt/nvm}" ]]; then
+  source "$nvm_path/nvm.sh" --no-use
+fi
+
+unset local_n{odenv,vm}_paths nvm_path
 
 # Return if requirements are not found.
-elif (( ! $+commands[node] )); then
+if (( ! $+commands[node] && ! $#functions[(i)n(odenv|vm)] )); then
   return 1
 fi
 
-# Load NPM completion.
-if (( $+commands[npm] )); then
-  cache_file="${TMPDIR:-/tmp}/prezto-node-cache.$UID.zsh"
+#
+# Variables
+#
 
-  if [[ "$commands[npm]" -nt "$cache_file" \
-        || "${ZDOTDIR:-$HOME}/.zpreztorc" -nt "$cache_file" \
-        || ! -s "$cache_file" ]]; then
-    # npm is slow; cache its output.
-    npm completion >! "$cache_file" 2> /dev/null
-  fi
+N_PREFIX="${XDG_CONFIG_HOME:-$HOME/.config}/n"  # The path to 'n' cache.
 
-  source "$cache_file"
+#
+# Aliases
+#
 
-  unset cache_file
+if ! zstyle -t ':prezto:module:node:alias' skip; then
+  # npm
+  alias npmi='npm install'
+  alias npml='npm list'
+  alias npmo='npm outdated'
+  alias npmp='npm publish'
+  alias npmP='npm prune'
+  alias npmr='npm run'
+  alias npms='npm search'
+  alias npmt='npm test'
+  alias npmu='npm update'
+  alias npmx='npm uninstall'
+
+  alias npmci='npm ci'
+  alias npmcit='npm cit'
+  alias npmit='npm it'
 fi
diff --git a/modules/ocaml/README.md b/modules/ocaml/README.md
index e1701586..75aed540 100644
--- a/modules/ocaml/README.md
+++ b/modules/ocaml/README.md
@@ -1,10 +1,8 @@
-OCaml
-=====
+# OCaml
 
 Initializes [OCaml][1] package management.
 
-OPAM
-----
+## OPAM
 
 [OPAM][2] is a package manager for OCaml.
 
@@ -15,13 +13,12 @@ relevant path and OCaml variables.
 
 Install packages to your local package directory with `opam install`.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][3].*
+_The authors of this module should be contacted via the [issue tracker][3]._
 
-  - [Sebastian Wiesner](https://github.com/lunaryorn)
+- [Sebastian Wiesner](https://github.com/lunaryorn)
 
-[1]: http://ocaml.org/
+[1]: https://ocaml.org/
 [2]: http://opam.ocamlpro.com/
 [3]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/osx/README.md b/modules/osx/README.md
index 1f93a2c3..893d3af3 100644
--- a/modules/osx/README.md
+++ b/modules/osx/README.md
@@ -1,50 +1,50 @@
-OSX
-===
+# OSX
 
 Defines [macOS][1] aliases and functions.
 
-Settings
---------
+This module must be loaded _before_ the [_`completion`_][2] module so that the
+provided completion definitions are loaded automatically by _`completion`_
+module.
+
+## Settings
 
 ### Dash Keyword
 
-To change the keyword used by `mand` to open man pages in [_Dash.app_][2] from
-its default value of 'manpages', add the following line in *zpreztorc* and
-replace the **keyword** with the one configured in [_Dash.app_][2].
+To change the keyword used by `mand` to open man pages in [_Dash.app_][3] from
+its default value of 'manpages', add the following line in
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_ and replace the **keyword** with the one
+configured in [_Dash.app_][3].
 
 ```sh
 zstyle ':prezto:module:osx:man' dash-keyword 'keyword'
 ```
 
-Aliases
--------
+## Aliases
 
-  - `cdf` changes the current working director to the current _Finder_
-    directory.
-  - `pushdf` pushes the current working directory onto the directory queue and
-    changes the current working director to the current _Finder_ directory.
+- `cdf` changes the current working director to the current _Finder_ directory.
+- `pushdf` pushes the current working directory onto the directory queue and
+  changes the current working director to the current _Finder_ directory.
 
-Functions
----------
+## Functions
 
-  - `mand` opens _man_ pages in [_Dash.app_][2].
-  - `manp` opens _man_ pages in _Preview.app_.
-  - `pfd` prints the current _Finder_ directory.
-  - `pfs` prints the current _Finder_ selection.
-  - `tab` creates a new tab (works in both _Terminal_ and [_iTerm_][3]).
-  - `ql` previews files in Quick Look.
-  - `osx-rm-dir-metadata` deletes .DS\_Store, \_\_MACOSX cruft.
-  - `osx-ls-download-history` displays the macOS download history.
-  - `osx-rm-download-history` deletes the macOS download history.
+- `mand` opens _man_ pages in [_Dash.app_][3].
+- `manp` opens _man_ pages in _Preview.app_.
+- `pfd` prints the current _Finder_ directory.
+- `pfs` prints the current _Finder_ selection.
+- `tab` creates a new tab (works in both _Terminal_ and [_iTerm.app_][4]).
+- `ql` previews files in Quick Look.
+- `osx-rm-dir-metadata` deletes _`.DS_Store`_, _`__MACOSX`_ cruft.
+- `osx-ls-download-history` displays the macOS download history.
+- `osx-rm-download-history` deletes the macOS download history.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][4].*
+_The authors of this module should be contacted via the [issue tracker][5]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
-[1]: http://www.apple.com/macosx/
-[2]: http://kapeli.com/dash
-[3]: http://www.iterm2.com/
-[4]: https://github.com/sorin-ionescu/prezto/issues
+[1]: https://www.apple.com/macos/
+[2]: ../completion#readme
+[3]: https://kapeli.com/dash
+[4]: https://www.iterm2.com/
+[5]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/osx/functions/mand b/modules/osx/functions/mand
index 2902c76b..b62fab33 100644
--- a/modules/osx/functions/mand
+++ b/modules/osx/functions/mand
@@ -8,7 +8,7 @@
 function mand {
   if (( $# > 0 )); then
     zstyle -s ':prezto:module:osx:man' dash-keyword 'dashkw' || dashkw='manpages'
-    open "dash://$dashkw:$1" 2> /dev/null
+    open "dash://$dashkw%3A$1" 2> /dev/null
     if (( $? != 0 )); then
       print "$0: Dash is not installed" >&2
       break
diff --git a/modules/osx/functions/manp b/modules/osx/functions/manp
index fcb2a026..d31bbc40 100644
--- a/modules/osx/functions/manp
+++ b/modules/osx/functions/manp
@@ -9,7 +9,7 @@ function manp {
   local page
   if (( $# > 0 )); then
     for page in "$@"; do
-      man -t "$page" | open -f -a Preview
+      mandoc -T pdf "$(/usr/bin/man -w $page)" | open -fa Preview
     done
   else
     print 'What manual page do you want?' >&2
diff --git a/modules/osx/functions/trash b/modules/osx/functions/trash
new file mode 100644
index 00000000..0efa2154
--- /dev/null
+++ b/modules/osx/functions/trash
@@ -0,0 +1,31 @@
+#
+# Moves files to the macOS trash.
+#
+
+# function trash {
+
+emulate -L zsh
+setopt LOCAL_OPTIONS EXTENDED_GLOB
+
+local file
+local -a files=()
+for file in $@; do
+  if [[ -e $file ]]; then
+    # ':a' gets the full path (do not use ':A', which would resolve symlinks)
+    files+=("the POSIX file \"${file:a}\"")
+  else
+    print "trash: No such file or directory '$file'." >&2
+    return 1
+  fi
+done
+
+if (( $#files == 0 )); then
+  print 'usage: trash <files...>' >&2
+  return 64  # Match rm's return code.
+fi
+
+# Join file list with commas, and tell Finder to trash that list.
+local file_list="${(pj., .)files}"
+osascript 2>&1 > /dev/null -e "tell app \"Finder\" to move { "${file_list}" } to trash"
+
+# }
diff --git a/modules/osx/init.zsh b/modules/osx/init.zsh
index f7871ca7..62f21943 100644
--- a/modules/osx/init.zsh
+++ b/modules/osx/init.zsh
@@ -5,8 +5,11 @@
 #   Sorin Ionescu <sorin.ionescu@gmail.com>
 #
 
+# Load dependencies.
+pmodload 'helper'
+
 # Return if requirements are not found.
-if [[ "$OSTYPE" != darwin* ]]; then
+if ! is-darwin; then
   return 1
 fi
 
diff --git a/modules/pacman/README.md b/modules/pacman/README.md
index a619a747..4e6ad8bc 100644
--- a/modules/pacman/README.md
+++ b/modules/pacman/README.md
@@ -1,11 +1,9 @@
-Pacman
-======
+# Pacman
 
 Provides aliases and functions for the [Pacman][1] package manager and
 frontends.
 
-Settings
---------
+## Settings
 
 It is possible to use a Pacman frontend with the pacman aliases provided by this
 package as long as that frontend supports the same command line options (The
@@ -17,53 +15,51 @@ supported by Archlinux. It is currently recommended to manually build AUR
 packages using the [provided instructions][3]. The [aurutils][4] project has a
 set of small utilities to make this easier.
 
-To enable a Pacman frontend, add the following line to *zpreztorc*, substituting
-`pacman_frontend` with the name of the frontent:
+To enable a different Pacman frontend, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_, and replace `'<frontend>'` with the name
+of the preferred frontend.
 
 ```sh
-zstyle ':prezto:module:pacman' frontend 'pacman_frontend'
+zstyle ':prezto:module:pacman' frontend '<frontend>'
 ```
 
-Aliases
--------
+## Aliases
 
 ### Pacman
 
-  - `pac` is short for `pacman`.
-  - `paci` installs packages from repositories.
-  - `pacI` installs packages from files.
-  - `pacx` removes packages and unneeded dependencies.
-  - `pacX` removes packages, their configuration, and unneeded dependencies.
-  - `pacq` displays information about a package from the repositories.
-  - `pacQ` displays information about a package from the local database.
-  - `pacs` searches for packages in the repositories.
-  - `pacS` searches for packages in the local database.
-  - `pacu` synchronizes the local package and Arch Build System (requires `abs`)
-    databases against the repositories.
-  - `pacU` synchronizes the local package database against the repositories then
-    upgrades outdated packages.
-  - `pacman-list-orphans` lists orphan packages.
-  - `pacman-remove-orphans` removes orphan packages.
+- `pac` is short for `pacman`.
+- `paci` installs packages from repositories.
+- `pacI` installs packages from files.
+- `pacx` removes packages and unneeded dependencies.
+- `pacX` removes packages, their configuration, and unneeded dependencies.
+- `pacq` displays information about a package from the repositories.
+- `pacQ` displays information about a package from the local database.
+- `pacs` searches for packages in the repositories.
+- `pacS` searches for packages in the local database.
+- `pacu` synchronizes the local package and Arch Build System (requires `abs`)
+  databases against the repositories.
+- `pacU` synchronizes the local package database against the repositories then
+  upgrades outdated packages.
+- `pacman-list-orphans` lists orphan packages.
+- `pacman-remove-orphans` removes orphan packages.
 
 ### Frontends
 
-Functions
----------
+## Functions
 
-  - `aurget` clone an aur package
-  - `pacman-list-explicit` lists explicitly installed pacman packages.
-  - `pacman-list-disowned` lists pacman disowned files.
+- `aurget` clone an aur package.
+- `pacman-list-explicit` lists explicitly installed pacman packages.
+- `pacman-list-disowned` lists pacman disowned files.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][5].*
+_The authors of this module should be contacted via the [issue tracker][5]._
 
-  - [Benjamin Boudreau](https://github.com/dreur)
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Benjamin Boudreau](https://github.com/dreur)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
-[1]: http://www.archlinux.org/pacman/
-[2]: https://wiki.archlinux.org/index.php/AUR_helpers#Comparison_table
-[3]: https://wiki.archlinux.org/index.php/Arch_User_Repository#Installing_packages
+[1]: https://www.archlinux.org/pacman/
+[2]: https://wiki.archlinux.org/title/AUR_helpers#Comparison_tables
+[3]: https://wiki.archlinux.org/title/Arch_User_Repository#Installing_and_upgrading_packages
 [4]: https://github.com/AladW/aurutils
 [5]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/pacman/functions/pacman-list-disowned b/modules/pacman/functions/pacman-list-disowned
index 9c8f56a0..c5e84fcf 100644
--- a/modules/pacman/functions/pacman-list-disowned
+++ b/modules/pacman/functions/pacman-list-disowned
@@ -8,11 +8,11 @@
 
 # function pacman-list-disowned {
 
-local tmp="${TMPDIR:-/tmp}/pacman-disowned-$UID-$$"
+local tmp="${XDG_CACHE_HOME:-$HOME/.cache}/prezto/pacman-disowned-$$"
 local db="$tmp/db"
 local fs="$tmp/fs"
 
-mkdir "$tmp"
+mkdir -p "$tmp"
 trap  'rm -rf "$tmp"' EXIT
 
 pacman --quiet --query --list | sort --unique > "$db"
diff --git a/modules/perl/README.md b/modules/perl/README.md
index 67f2a177..dd594491 100644
--- a/modules/perl/README.md
+++ b/modules/perl/README.md
@@ -1,18 +1,16 @@
-Perl
-====
+# Perl
 
 Enables local [Perl][1] module installation on macOS and defines aliases.
 
-Local Module Installation
--------------------------
+## Local Module Installation
 
 Perl versions older than 5.14 do not support the local installation of Perl
 modules natively. This module allows for local installation of Perl modules on
-macOS in *~/Library/Perl/5.12* by altering the environment.
+macOS in _`~/Library/Perl/5.12`_ by altering the environment.
 
 ### Usage
 
-For Perl versions older than 5.14, install *local::lib*.
+For Perl versions older than 5.14, install _`local::lib`_.
 
 ```console
 curl -L -C - -O http://search.cpan.org/CPAN/authors/id/A/AP/APEIRON/local-lib-1.008004.tar.gz
@@ -22,73 +20,75 @@ perl Makefile.PL --bootstrap=$HOME/Library/Perl/5.12
 make && make test && make install
 ```
 
-Install *cpanminus*:
+Install _cpanminus_:
 
 ```console
 curl -L http://cpanmin.us | perl - --self-upgrade
 ```
 
-Perlbrew
---------
+## Perlbrew
 
 An alternative to the above is to use [Perlbrew][2], which allows for the
 management of multiple, isolated Perl installations in the home directory.
 
-plenv
------
+## plenv
 
-Yet another alternative is [plenv][3]. This is inspired from rbenv and enables
-switching between multiple binary installations.
+Yet another alternative is [_plenv_][3]. This is inspired from _rbenv_ and
+enables switching between multiple binary installations.
 
-The subcommands of plenv is similar with rbenv.
+The subcommands of _plenv_ is similar with _rbenv_.
 
-Aliases
--------
+## Aliases
+
+Aliases are enabled by default. To disable them, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
+
+```sh
+zstyle ':prezto:module:perl:alias' skip 'yes'
+```
 
 ### General
 
-  - `pl` is short for `perl`.
-  - `pld` looks up Perl documentation (`perldoc`).
-  - `ple` executes a one line program in a loop (`perl -wlne`).
+- `pl` is short for `perl`.
+- `pld` looks up Perl documentation (`perldoc`).
+- `ple` executes a one line program in a loop (`perl -wlne`).
 
-### Perlbrew
+### Perlbrew (plb)
 
-  - `plb` manages Perl environments.
-  - `plba` lists available Perl versions.
-  - `plbi` installs a Perl version.
-  - `plbl` lists installed Perl versions.
-  - `plbo` temporarily turns off Perlbrew.
-  - `plbO` turns off Perlbrew.
-  - `plbs` switches to a Perl version.
-  - `plbu` uninstalls a Perl version.
-  - `plbx` temporarily sets the Perl version to use.
+- `plb` manages Perl environments.
+- `plba` lists available Perl versions.
+- `plbi` installs a Perl version.
+- `plbl` lists installed Perl versions.
+- `plbo` temporarily turns off Perlbrew.
+- `plbO` turns off Perlbrew.
+- `plbs` switches to a Perl version.
+- `plbu` uninstalls a Perl version.
+- `plbx` temporarily sets the Perl version to use.
 
-### plenv
+### plenv (plv)
 
-  - `plv` manages Perl environments.
-  - `plvc` List all available plenv commands.
-  - `plvl` Set or show the local application-specific Perl version.
-  - `plvg` Set or show the global Perl version.
-  - `plvs` Set or show the shell-specific Perl version.
-  - `plvi` Install a Perl version using the perl-build plugin.
-  - `plvu` Uninstall a specific Perl version.
-  - `plvr` Rehash plenv shims (run this after installing executables).
-  - `plvv` Show the current Perl version and its origin.
-  - `plvV` List all Perl versions available to plenv.
-  - `plvw` Display the full path to an executable.
-  - `plvW` List all Perl versions that contain the given executable.
-  - `plvm` List cpan modules in current perl.
-  - `plvM` Migrate cpan modules from other version.
-  - `plvI` Install cpanm.
+- `plv` manages Perl environments.
+- `plvc` List all available plenv commands.
+- `plvl` Set or show the local application-specific Perl version.
+- `plvg` Set or show the global Perl version.
+- `plvs` Set or show the shell-specific Perl version.
+- `plvi` Install a Perl version using the perl-build plugin.
+- `plvu` Uninstall a specific Perl version.
+- `plvr` Rehash plenv shims (run this after installing executables).
+- `plvv` Show the current Perl version and its origin.
+- `plvV` List all Perl versions available to plenv.
+- `plvw` Display the full path to an executable.
+- `plvW` List all Perl versions that contain the given executable.
+- `plvm` List cpan modules in current perl.
+- `plvM` Migrate cpan modules from other version.
+- `plvI` Install cpanm.
 
-Functions
----------
+## Functions
 
-  - `perl-info` exposes information about the Perl environment via the
-    `$perl_info` associative array.
+- `perl-info` exposes information about the Perl environment via the
+  `$perl_info` associative array.
 
-Theming
--------
+## Theming
 
 To display the name of the current Perl version in a prompt, define the
 following style in the `prompt_name_setup` function.
@@ -101,14 +101,13 @@ zstyle ':prezto:module:perl:info:version' format 'version:%v'
 Then add `$perl_info[version]` to `$PROMPT` or `$RPROMPT` and call
 `perl-info` in the `prompt_name_precmd` hook function.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][4].*
+_The authors of this module should be contacted via the [issue tracker][4]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
-[1]: http://www.perl.org
-[2]: http://perlbrew.pl
+[1]: https://www.perl.org
+[2]: https://perlbrew.pl
 [3]: https://github.com/tokuhirom/plenv
 [4]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/perl/init.zsh b/modules/perl/init.zsh
index b7a79479..efadd9ea 100644
--- a/modules/perl/init.zsh
+++ b/modules/perl/init.zsh
@@ -10,6 +10,9 @@ if (( ! $+commands[perl] )); then
   return 1
 fi
 
+# Load dependencies.
+pmodload 'helper'
+
 #
 # Load Perlbrew or plenv
 #
@@ -37,13 +40,14 @@ fi
 # Local Module Installation
 #
 
-if [[ "$OSTYPE" == darwin* ]]; then
+if is-darwin; then
   # Perl is slow; cache its output.
-  cache_file="${TMPDIR:-/tmp}/prezto-perl-cache.$UID.zsh"
+  cache_file="${XDG_CACHE_HOME:-$HOME/.cache}/prezto/perl-cache.zsh"
   perl_path="$HOME/Library/Perl/5.12"
 
   if [[ -f "$perl_path/lib/perl5/local/lib.pm" ]]; then
     if [[ "${ZDOTDIR:-$HOME}/.zpreztorc" -nt "$cache_file" || ! -s "$cache_file" ]]; then
+      mkdir -p "$cache_file:h"
       perl -I$perl_path/lib/perl5 -Mlocal::lib=$perl_path >! "$cache_file"
     fi
 
@@ -57,37 +61,39 @@ fi
 # Aliases
 #
 
-# General
-alias pl='perl'
-alias pld='perldoc'
-alias ple='perl -wlne'
+if ! zstyle -t ':prezto:module:perl:alias' skip; then
+  # General
+  alias pl='perl'
+  alias pld='perldoc'
+  alias ple='perl -wlne'
 
-# Perlbrew
-if (( $+commands[perlbrew] )); then
-  alias plb='perlbrew'
-  alias plba='perlbrew available'
-  alias plbi='perlbrew install'
-  alias plbl='perlbrew list'
-  alias plbo='perlbrew off'
-  alias plbO='perlbrew switch-off'
-  alias plbs='perlbrew switch'
-  alias plbu='perlbrew use'
-  alias plbx='perlbrew uninstall'
+  # Perlbrew
+  if (( $+commands[perlbrew] )); then
+    alias plb='perlbrew'
+    alias plba='perlbrew available'
+    alias plbi='perlbrew install'
+    alias plbl='perlbrew list'
+    alias plbo='perlbrew off'
+    alias plbO='perlbrew switch-off'
+    alias plbs='perlbrew switch'
+    alias plbu='perlbrew use'
+    alias plbx='perlbrew uninstall'
 
-elif (( $+commands[plenv] )); then
-  alias plv='plenv'
-  alias plvc='plenv commands'
-  alias plvl='plenv local'
-  alias plvg='plenv global'
-  alias plvs='plenv shell'
-  alias plvi='plenv install'
-  alias plvu='plenv uninstall'
-  alias plvr='plenv rehash'
-  alias plvv='plenv version'
-  alias plvV='plenv versions'
-  alias plvw='plenv which'
-  alias plvW='plenv whence'
-  alias plvm='plenv list-modules'
-  alias plvM='plenv migrate-modules'
-  alias plvI='plenv install-cpanm'
+  elif (( $+commands[plenv] )); then
+    alias plv='plenv'
+    alias plvc='plenv commands'
+    alias plvl='plenv local'
+    alias plvg='plenv global'
+    alias plvs='plenv shell'
+    alias plvi='plenv install'
+    alias plvu='plenv uninstall'
+    alias plvr='plenv rehash'
+    alias plvv='plenv version'
+    alias plvV='plenv versions'
+    alias plvw='plenv which'
+    alias plvW='plenv whence'
+    alias plvm='plenv list-modules'
+    alias plvM='plenv migrate-modules'
+    alias plvI='plenv install-cpanm'
+  fi
 fi
diff --git a/modules/prompt/README.md b/modules/prompt/README.md
index 523c83e9..2279b559 100644
--- a/modules/prompt/README.md
+++ b/modules/prompt/README.md
@@ -1,26 +1,24 @@
-Prompt
-======
+# Prompt
 
 Loads prompt [themes][1].
 
-Settings
---------
+## Settings
 
 ### Prompt Theme
 
-To select a prompt theme, add the following to *zpreztorc*, and replace **name**
-with the name of the theme you wish to load. Setting it to **random** will load
-a random theme.
+To select a prompt theme, add the following to _`${ZDOTDIR:-$HOME}/.zpreztorc`_,
+and replace `'<name>'` with the name of the theme you wish to load. Setting it
+to `'random'` will load a random theme every time.
 
 ```sh
-zstyle ':prezto:module:prompt' theme 'name'
+zstyle ':prezto:module:prompt' theme '<name>'
 ```
 
 ### Prompt Display Length
 
 To change working directory prompt display length from 'short', set the
-following to 'long' (without `~` expansion) or 'full' (with `~` expansion)
-in *zpreztorc*.
+following to 'long' (without `~` expansion) or 'full' (with `~` expansion) in
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
 ```sh
 zstyle ':prezto:module:prompt' pwd-length 'short'
@@ -35,14 +33,29 @@ this can be disabled with the following snippet.
 zstyle ':prezto:module:prompt' show-return-val 'no'
 ```
 
-Theming
--------
+## Theming
 
 A prompt theme is an autoloadable function file with a special name,
 `prompt_name_setup`, placed anywhere in `$fpath`, but for the purpose of this
-project, themes **should** be placed in the *modules/prompt/functions*
+project, themes **should** be placed in the _modules/prompt/functions_
 directory.
 
+### Required Variables
+
+To ensure that your function works with the editor-info module you'll need to
+set the following variable in _`${ZDOTDIR:-$HOME}/.zpreztorc`_:
+
+```sh
+# Tell prezto we can manage this prompt
+zstyle ':prezto:module:prompt' managed 'yes'
+```
+
+This is to ensure compatibility with outside prompts, while allowing prezto
+and prezto-compatible prompts to take full advantage of the editor module.
+This should be set in the `prompt_name_setup` function after you've added
+any additional hooks with `add-zsh-hook precmd prompt_name_precmd`. See below
+for additional information about functions and hooks.
+
 ### Theme Functions
 
 There are three theme functions, a setup function, a help function, and
@@ -106,7 +119,7 @@ function prompt_name_preview {
 
 ### Hook Functions
 
-There are many Zsh [hook][2] functions, but mostly the *precmd* hook will be
+There are many Zsh [hook][2] functions, but mostly the _precmd_ hook will be
 used.
 
 #### `prompt_name_precmd`
@@ -118,7 +131,8 @@ When calling functions to get information to display in a prompt, do not assume
 that all the dependencies have been loaded. Always check for the availability of
 a function before you calling it.
 
-**Do not register hook functions. They will be registered by the `prompt` function.**
+**Do not register hook functions. They will be automatically registered by the
+`prompt` function.**
 
 The most basic example of this function can be seen below.
 
@@ -130,10 +144,9 @@ function prompt_name_precmd {
 }
 ```
 
-Troubleshooting
----------------
+## Troubleshooting
 
-### Fonts aren't displaying properly.
+### Fonts aren't displaying properly
 
 On most systems, themes which use special characters need to have a patched font
 installed and configured properly.
@@ -141,16 +154,14 @@ installed and configured properly.
 Powerline provides some information on [terminal support][4] and [how to install
 patched fonts][5] which should fix most font issues.
 
+## Authors
 
-Authors
--------
+_The authors of this module should be contacted via the [issue tracker][3]._
 
-*The authors of this module should be contacted via the [issue tracker][3].*
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
-
-[1]: http://zsh.sourceforge.net/Doc/Release/User-Contributions.html#Prompt-Themes
-[2]: http://zsh.sourceforge.net/Doc/Release/Functions.html#Hook-Functions
+[1]: https://zsh.sourceforge.net/Doc/Release/User-Contributions.html#Prompt-Themes
+[2]: https://zsh.sourceforge.net/Doc/Release/Functions.html#Hook-Functions
 [3]: https://github.com/sorin-ionescu/prezto/issues
-[4]: http://powerline.readthedocs.io/en/master/usage.html#terminal-emulator-requirements
-[5]: http://powerline.readthedocs.io/en/latest/installation.html#fonts-installation
+[4]: https://powerline.readthedocs.io/en/master/usage.html#terminal-emulator-requirements
+[5]: https://powerline.readthedocs.io/en/latest/installation.html#fonts-installation
diff --git a/modules/prompt/external/agnoster b/modules/prompt/external/agnoster
index 3ad94b65..6bba672c 160000
--- a/modules/prompt/external/agnoster
+++ b/modules/prompt/external/agnoster
@@ -1 +1 @@
-Subproject commit 3ad94b659910c775a6560c45b1524d23d8c83b09
+Subproject commit 6bba672c7812a76defc3efed9b6369eeee2425dc
diff --git a/modules/prompt/external/async b/modules/prompt/external/async
index b001fa52..ee1d11b6 160000
--- a/modules/prompt/external/async
+++ b/modules/prompt/external/async
@@ -1 +1 @@
-Subproject commit b001fa529a874fbe8bd22a9d4526153138645289
+Subproject commit ee1d11b68c38dec24c22b1c51a45e8a815a79756
diff --git a/modules/prompt/external/powerlevel10k b/modules/prompt/external/powerlevel10k
new file mode 160000
index 00000000..35833ea1
--- /dev/null
+++ b/modules/prompt/external/powerlevel10k
@@ -0,0 +1 @@
+Subproject commit 35833ea15f14b71dbcebc7e54c104d8d56ca5268
diff --git a/modules/prompt/external/powerlevel9k b/modules/prompt/external/powerlevel9k
deleted file mode 160000
index 17c069d2..00000000
--- a/modules/prompt/external/powerlevel9k
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 17c069d25ac7b24af6b5dc7ecb9597cef881f582
diff --git a/modules/prompt/external/pure b/modules/prompt/external/pure
index a95d55cc..87e6f5dd 160000
--- a/modules/prompt/external/pure
+++ b/modules/prompt/external/pure
@@ -1 +1 @@
-Subproject commit a95d55cc7d3a73fc562ac11e23c26113ed6d58cf
+Subproject commit 87e6f5dd4c793f6d980532205aaefe196780606f
diff --git a/modules/prompt/functions/prompt-pwd b/modules/prompt/functions/prompt-pwd
index 53613e72..d2d1788f 100644
--- a/modules/prompt/functions/prompt-pwd
+++ b/modules/prompt/functions/prompt-pwd
@@ -28,3 +28,4 @@ unset current_pwd
 print "$ret_directory"
 
 # }
+# vim: ft=zsh
diff --git a/modules/prompt/functions/prompt_cloud_setup b/modules/prompt/functions/prompt_cloud_setup
index 0637208b..908e3c93 100644
--- a/modules/prompt/functions/prompt_cloud_setup
+++ b/modules/prompt/functions/prompt_cloud_setup
@@ -9,7 +9,7 @@
 #   - The prompt is prefixed by a character sequence of your choice.
 #   - Only displays the current directory instead of the full path.
 #   - Displays the current branch when in a git project (this requires loading
-#     the git module before prompt in ~/.zpreztorc).
+#     the git module before prompt in ${ZDOTDIR:-$HOME}/.zpreztorc).
 #   - Displays a character at the end of the prompt when in a git project with
 #     "dirty" files.
 #
@@ -17,7 +17,7 @@
 #   This prompt's prefix symbol and colors are customizable:
 #     prompt cloud [<symbol>] [<color1>] [<color2>]
 #
-#   In ~/.zpreztorc:
+#   In ${ZDOTDIR:-$HOME}/.zpreztorc:
 #     zstyle ':prezto:module:prompt' theme 'cloud' \
 #       ['<symbol>'] \
 #       ['<color1>'] \
@@ -53,7 +53,7 @@ This prompt's prefix symbol and colors are customizable:
 
   prompt cloud [<symbol>] [<color1>] [<color2>]
 
-In ~/.zpreztorc:
+In ${ZDOTDIR:-$HOME}/.zpreztorc:
   zstyle ':prezto:module:prompt' theme 'cloud' ['<symbol>'] ['<color1>'] ['<color2>']
 
 If these options are not provided, the symbol defaults to ☁ with colors cyan
@@ -104,6 +104,9 @@ function prompt_cloud_setup {
   # Add hook for calling git-info before each command.
   add-zsh-hook precmd prompt_cloud_precmd
 
+  # Tell prezto we can manage this prompt
+  zstyle ':prezto:module:prompt' managed 'yes'
+
   # Set git-info parameters.
   zstyle ':prezto:module:git:info' verbose 'yes'
   zstyle ':prezto:module:git:info:dirty' format "%%B%F{$secondary_color}]%f%%b %F{yellow}⚡%f"
@@ -119,3 +122,4 @@ function prompt_cloud_setup {
 }
 
 prompt_cloud_setup "$@"
+# vim: ft=zsh
diff --git a/modules/prompt/functions/prompt_damoekri_setup b/modules/prompt/functions/prompt_damoekri_setup
index 4fe132d6..1fbaedfb 100644
--- a/modules/prompt/functions/prompt_damoekri_setup
+++ b/modules/prompt/functions/prompt_damoekri_setup
@@ -40,6 +40,9 @@ function prompt_damoekri_setup {
   # Add hook for calling git-info and ruby-info before each command.
   add-zsh-hook precmd prompt_damoekri_precmd
 
+  # Tell prezto we can manage this prompt
+  zstyle ':prezto:module:prompt' managed 'yes'
+
   # Set editor-info parameters.
   zstyle ':prezto:module:editor:info:keymap:primary' format ' %F{green}»%f'
 
@@ -63,3 +66,4 @@ function prompt_damoekri_setup {
 }
 
 prompt_damoekri_setup "$@"
+# vim: ft=zsh
diff --git a/modules/prompt/functions/prompt_giddie_setup b/modules/prompt/functions/prompt_giddie_setup
index 3c194fb9..2b36ccc7 100644
--- a/modules/prompt/functions/prompt_giddie_setup
+++ b/modules/prompt/functions/prompt_giddie_setup
@@ -47,6 +47,9 @@ function prompt_giddie_setup {
   # Add hook to set up prompt parameters before each command.
   add-zsh-hook precmd prompt_giddie_precmd
 
+  # Tell prezto we can manage this prompt
+  zstyle ':prezto:module:prompt' managed 'yes'
+
   # Set editor-info parameters.
   zstyle ':prezto:module:editor:info:completing' format '%F{green}...%f'
   zstyle ':prezto:module:editor:info:keymap:alternate' format '%F{yellow}--- COMMAND ---%f'
@@ -74,3 +77,4 @@ function prompt_giddie_setup {
 }
 
 prompt_giddie_setup "$@"
+# vim: ft=zsh
diff --git a/modules/prompt/functions/prompt_kylewest_setup b/modules/prompt/functions/prompt_kylewest_setup
index 70b6a54a..d3b33a95 100644
--- a/modules/prompt/functions/prompt_kylewest_setup
+++ b/modules/prompt/functions/prompt_kylewest_setup
@@ -40,6 +40,9 @@ function prompt_kylewest_setup {
   # Add hook for calling git-info before each command.
   add-zsh-hook precmd prompt_kylewest_precmd
 
+  # Tell prezto we can manage this prompt
+  zstyle ':prezto:module:prompt' managed 'yes'
+
   # Set editor-info parameters.
   zstyle ':prezto:module:editor:info:completing' format '%B%F{red}...%f%b'
   zstyle ':prezto:module:editor:info:keymap:primary' format "%B%F{green}❯%f%b"
@@ -63,3 +66,4 @@ function prompt_kylewest_setup {
 }
 
 prompt_kylewest_setup "$@"
+# vim: ft=zsh
diff --git a/modules/prompt/functions/prompt_minimal_setup b/modules/prompt/functions/prompt_minimal_setup
index 7456ffdb..e57aac57 100644
--- a/modules/prompt/functions/prompt_minimal_setup
+++ b/modules/prompt/functions/prompt_minimal_setup
@@ -32,6 +32,9 @@ function prompt_minimal_setup {
   # Add hook for calling vcs_info before each command.
   add-zsh-hook precmd prompt_minimal_precmd
 
+  # Tell prezto we can manage this prompt
+  zstyle ':prezto:module:prompt' managed 'yes'
+
   # Set vcs_info parameters.
   zstyle ':vcs_info:*' enable bzr git hg svn
   zstyle ':vcs_info:*' check-for-changes true
@@ -47,4 +50,14 @@ function prompt_minimal_setup {
   RPROMPT=''
 }
 
+function prompt_minimal_preview {
+  local +h PROMPT=''
+  local +h RPROMPT=''
+  local +h SPROMPT=''
+
+  editor-info 2> /dev/null
+  prompt_preview_theme 'minimal'
+}
+
 prompt_minimal_setup "$@"
+# vim: ft=zsh
diff --git a/modules/prompt/functions/prompt_nicoulaj_setup b/modules/prompt/functions/prompt_nicoulaj_setup
index 447ba1f4..4b40bac8 100644
--- a/modules/prompt/functions/prompt_nicoulaj_setup
+++ b/modules/prompt/functions/prompt_nicoulaj_setup
@@ -35,6 +35,9 @@ function prompt_nicoulaj_setup {
   # Add hook for calling vcs_info before each command.
   add-zsh-hook precmd prompt_nicoulaj_precmd
 
+  # Tell prezto we can manage this prompt
+  zstyle ':prezto:module:prompt' managed 'yes'
+
   # Customizable parameters.
   local max_path_chars=30
   local user_char='❯'
@@ -58,3 +61,4 @@ function prompt_nicoulaj_setup {
 }
 
 prompt_nicoulaj_setup "$@"
+# vim: ft=zsh
diff --git a/modules/prompt/functions/prompt_paradox_setup b/modules/prompt/functions/prompt_paradox_setup
index 4f19989d..9286967f 100644
--- a/modules/prompt/functions/prompt_paradox_setup
+++ b/modules/prompt/functions/prompt_paradox_setup
@@ -116,6 +116,9 @@ function prompt_paradox_setup {
   add-zsh-hook preexec prompt_paradox_preexec
   add-zsh-hook precmd prompt_paradox_precmd
 
+  # Tell prezto we can manage this prompt
+  zstyle ':prezto:module:prompt' managed 'yes'
+
   # Set editor-info parameters.
   zstyle ':prezto:module:editor:info:completing' format '%B%F{red}...%f%b'
   zstyle ':prezto:module:editor:info:keymap:primary' format '%B%F{blue}❯%f%b'
@@ -154,3 +157,4 @@ ${(e)$(prompt_paradox_build_prompt)}
 }
 
 prompt_paradox_setup "$@"
+# vim: ft=zsh
diff --git a/modules/prompt/functions/prompt_peepcode_setup b/modules/prompt/functions/prompt_peepcode_setup
index 2081961c..3a108df4 100644
--- a/modules/prompt/functions/prompt_peepcode_setup
+++ b/modules/prompt/functions/prompt_peepcode_setup
@@ -34,6 +34,9 @@ function prompt_peepcode_setup {
   # Add a hook for calling info functions before each command.
   add-zsh-hook precmd prompt_peepcode_precmd
 
+  # Tell prezto we can manage this prompt
+  zstyle ':prezto:module:prompt' managed 'yes'
+
   # Set git-info parameters.
   zstyle ':prezto:module:git:info' verbose 'no'
   zstyle ':prezto:module:git:info:action' format ' +%s'
@@ -83,3 +86,4 @@ function prompt_peepcode_preview {
 }
 
 prompt_peepcode_setup "$@"
+# vim: ft=zsh
diff --git a/modules/prompt/functions/prompt_powerlevel10k_setup b/modules/prompt/functions/prompt_powerlevel10k_setup
new file mode 120000
index 00000000..8c66c696
--- /dev/null
+++ b/modules/prompt/functions/prompt_powerlevel10k_setup
@@ -0,0 +1 @@
+../external/powerlevel10k/powerlevel10k.zsh-theme
\ No newline at end of file
diff --git a/modules/prompt/functions/prompt_powerlevel9k_setup b/modules/prompt/functions/prompt_powerlevel9k_setup
deleted file mode 120000
index f692e0ae..00000000
--- a/modules/prompt/functions/prompt_powerlevel9k_setup
+++ /dev/null
@@ -1 +0,0 @@
-../external/powerlevel9k/powerlevel9k.zsh-theme
\ No newline at end of file
diff --git a/modules/prompt/functions/prompt_skwp_setup b/modules/prompt/functions/prompt_skwp_setup
index f69dcddf..b84011fe 100644
--- a/modules/prompt/functions/prompt_skwp_setup
+++ b/modules/prompt/functions/prompt_skwp_setup
@@ -36,6 +36,9 @@ function prompt_skwp_setup {
   # Add hook to set up prompt parameters before each command.
   add-zsh-hook precmd prompt_skwp_precmd
 
+  # Tell prezto we can manage this prompt
+  zstyle ':prezto:module:prompt' managed 'yes'
+
   # Use extended color pallete if available.
   if [[ $TERM = *256color* || $TERM = *rxvt* ]]; then
     _prompt_skwp_colors=(
@@ -73,3 +76,4 @@ function prompt_skwp_setup {
 }
 
 prompt_skwp_setup "$@"
+# vim: ft=zsh
diff --git a/modules/prompt/functions/prompt_smiley_setup b/modules/prompt/functions/prompt_smiley_setup
index 3d41b3af..cd1725bd 100644
--- a/modules/prompt/functions/prompt_smiley_setup
+++ b/modules/prompt/functions/prompt_smiley_setup
@@ -41,6 +41,9 @@ function prompt_smiley_setup {
   # Add hook for calling git-info before each command.
   add-zsh-hook precmd prompt_smiley_precmd
 
+  # Tell prezto we can manage this prompt
+  zstyle ':prezto:module:prompt' managed 'yes'
+
   # Set editor-info parameters.
   zstyle ':prezto:module:editor:info:completing' format '%B%F{red}...%f%b'
 
@@ -63,3 +66,4 @@ function prompt_smiley_setup {
 }
 
 prompt_smiley_setup "$@"
+# vim: ft=zsh
diff --git a/modules/prompt/functions/prompt_sorin_setup b/modules/prompt/functions/prompt_sorin_setup
index 30e71a92..a7d341ee 100644
--- a/modules/prompt/functions/prompt_sorin_setup
+++ b/modules/prompt/functions/prompt_sorin_setup
@@ -54,6 +54,13 @@ function prompt_sorin_async_callback {
         zle && zle reset-prompt
       fi
       ;;
+    "[async]")
+      # Code is 1 for corrupted worker output and 2 for dead worker.
+      if [[ $2 -eq 2 ]]; then
+	  # Our worker died unexpectedly.
+          typeset -g prompt_prezto_async_init=0
+      fi
+      ;;
   esac
 }
 
@@ -110,8 +117,6 @@ function prompt_sorin_setup {
   setopt LOCAL_OPTIONS
   unsetopt XTRACE KSH_ARRAYS
   prompt_opts=(cr percent sp subst)
-  _prompt_sorin_precmd_async_pid=0
-  _prompt_sorin_precmd_async_data=$(mktemp "${TMPDIR:-/tmp}/sorin-prompt-async-XXXXXXXXXX")
 
   # Load required functions.
   autoload -Uz add-zsh-hook
@@ -120,6 +125,9 @@ function prompt_sorin_setup {
   # Add hook for calling git-info before each command.
   add-zsh-hook precmd prompt_sorin_precmd
 
+  # Tell prezto we can manage this prompt
+  zstyle ':prezto:module:prompt' managed 'yes'
+
   # Set editor-info parameters.
   zstyle ':prezto:module:editor:info:completing' format '%B%F{7}...%f%b'
   zstyle ':prezto:module:editor:info:keymap:primary' format ' %B%F{1}❯%F{3}❯%F{2}❯%f%b'
@@ -144,16 +152,17 @@ function prompt_sorin_setup {
   zstyle ':prezto:module:git:info:keys' format \
     'status' '%b %p %c:%s%A%B%S%a%d%m%r%U%u'
 
+  # Set python-info parameters.
+  zstyle ':prezto:module:python:info:virtualenv' format '%f%F{3}(%v)%F{7} '
+
   # Set up non-zero return value display
   local show_return="✘ "
   # Default is to show the return value
   if zstyle -T ':prezto:module:prompt' show-return-val; then
     show_return+='%? '
   fi
-  # Set python-info format
-  zstyle ':prezto:module:python:info:virtualenv' format '%f%F{3}(%v)%F{7} '
 
-  # Get the async worker set up
+  # Get the async worker set up.
   _sorin_cur_git_root=''
 
   _prompt_sorin_git=''
@@ -177,3 +186,4 @@ function prompt_sorin_preview {
 }
 
 prompt_sorin_setup "$@"
+# vim: ft=zsh
diff --git a/modules/prompt/functions/prompt_steeef_setup b/modules/prompt/functions/prompt_steeef_setup
index b241f9aa..d32bd343 100644
--- a/modules/prompt/functions/prompt_steeef_setup
+++ b/modules/prompt/functions/prompt_steeef_setup
@@ -41,6 +41,9 @@ function prompt_steeef_setup {
   # Add hook for calling vcs_info before each command.
   add-zsh-hook precmd prompt_steeef_precmd
 
+  # Tell prezto we can manage this prompt
+  zstyle ':prezto:module:prompt' managed 'yes'
+
   # Use extended color pallete if available.
   if [[ $TERM = *256color* || $TERM = *rxvt* ]]; then
     _prompt_steeef_colors=(
@@ -72,6 +75,9 @@ function prompt_steeef_setup {
   local unstaged_format="${_prompt_steeef_colors[2]}●%f"
   local staged_format="${_prompt_steeef_colors[5]}●%f"
 
+  # Set editor-info parameters.
+  zstyle ':prezto:module:editor:info:keymap:primary' format '$'
+
   # Set vcs_info parameters.
   zstyle ':vcs_info:*' enable bzr git hg svn
   zstyle ':vcs_info:*:prompt:*' check-for-changes true
@@ -87,8 +93,18 @@ function prompt_steeef_setup {
   # Define prompts.
   PROMPT="
 ${_prompt_steeef_colors[3]}%n%f at ${_prompt_steeef_colors[2]}%m%f in ${_prompt_steeef_colors[5]}%~%f "'${vcs_info_msg_0_}'"
-"'$python_info[virtualenv]'"$ "
+"'$python_info[virtualenv]${editor_info[keymap]} '
   RPROMPT=''
 }
 
+function prompt_steeef_preview {
+  local +h PROMPT=''
+  local +h RPROMPT=''
+  local +h SPROMPT=''
+
+  editor-info 2> /dev/null
+  prompt_preview_theme 'steeef'
+}
+
 prompt_steeef_setup "$@"
+# vim: ft=zsh
diff --git a/modules/prompt/init.zsh b/modules/prompt/init.zsh
index 0ec007c4..37bff328 100644
--- a/modules/prompt/init.zsh
+++ b/modules/prompt/init.zsh
@@ -10,7 +10,7 @@ autoload -Uz promptinit && promptinit
 
 # Load the prompt theme.
 zstyle -a ':prezto:module:prompt' theme 'prompt_argv'
-if [[ "$TERM" == (dumb|linux|*bsd*) ]] || (( $#prompt_argv < 1 )); then
+if [[ $TERM == (dumb|linux|*bsd*) ]] || (( $#prompt_argv < 1 )); then
   prompt 'off'
 else
   prompt "$prompt_argv[@]"
diff --git a/modules/python/README.md b/modules/python/README.md
index e7b72c48..b7a32303 100644
--- a/modules/python/README.md
+++ b/modules/python/README.md
@@ -1,18 +1,20 @@
-Python
-======
+# Python
 
 Enables local Python and local Python package installation.
 
-Settings
---------
+## Settings
 
-This module supports virtual environments from conda and virtualenvwrapper. By default, only virtualenvwrapper is enabled. To disable virtualenvwrapper, add the following to *zpreztorc*.
+This module supports virtual environments from conda and
+[_virtualenvwrapper_][2]. By default, only _virtualenvwrapper_ is enabled. To
+disable _virtualenvwrapper_, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
 ```sh
-zstyle ':prezto:module:python' skip-virtualenvwrapper-init 'on'
+zstyle ':prezto:module:python:virtualenv' initialize 'no'
 ```
 
-Conda support is enabled by adding the following to *zpreztorc*.
+Conda support can be enabled by adding the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
 ```sh
 zstyle ':prezto:module:python' conda-init 'on'
@@ -20,21 +22,24 @@ zstyle ':prezto:module:python' conda-init 'on'
 
 Caution: using conda and virtualenvwrapper at the same time may cause conflicts.
 
-Local Python Installation
--------------------------
+## Local Python Installation
 
-[pyenv][4] builds and installs multiple Python versions locally in the home
+[_pyenv_][4] builds and installs multiple Python versions locally in the home
 directory.
 
-This module prepends the pyenv directory to the path variable to enable the
+This module prepends the _pyenv_ directory to the path variable to enable the
 execution of `pyenv`.
 
 ### Usage
 
-Install Python versions with `pyenv install` into `~/.pyenv/versions`.
+Install Python versions with `pyenv install` into _`~/.pyenv/versions`_.
 
-Local Package Installation
---------------------------
+This will be loaded automatically if pyenv is installed to `$PYENV_ROOT`,
+_`~/.pyenv`_, or if the `pyenv` command is on the path. By default, `PYENV_ROOT`
+is set to _`$HOME/.pyenv`_. You can set it to an alternate location and export
+it in [_`${ZDOTDIR:-$HOME}/.zshenv`_][6].
+
+## Local Package Installation
 
 Since version 2.6, Python supports per user package installation, as defined in
 [PEP 370][1].
@@ -47,26 +52,26 @@ documentation.
 
 Install packages into the per user site directory with `pip install --user`.
 
-virtualenvwrapper
------------------
+## virtualenvwrapper
 
-[`virtualenvwrapper`][2] is a frontend to the popular [`virtualenv`][3] utility.
+[_virtualenvwrapper_][2] is a frontend to the popular [_virtualenv_][3] utility.
 
-`virtualenv` creates isolated Python environments and `virtualenvwrapper` provides
-convenient shell functions to create, switch, and manage them.
+`virtualenv` creates isolated Python environments and `virtualenvwrapper`
+provides convenient shell functions to create, switch, and manage them.
 
 ### Usage
 
 Install `virtualenvwrapper`.
 
-Virtual environments are stored in `~/.virtualenvs`.
+Virtual environments are stored in _`~/.virtualenvs`_.
 
-There are configuration variables that have to be set to enable certain features.
-If you wish to use these features, export the variables in [`zshenv`][6].
+There are configuration variables that have to be set to enable certain
+features. If you wish to use these features, export the variables in
+[_`${ZDOTDIR:-$HOME}/.zshenv`_][6].
 
 The variable `$PROJECT_HOME` tells `virtualenvwrapper` where to place project
 working directories. It must be set and the directory created before `mkproject`
-is used. Replace *Developer* with your projects directory.
+is used. Replace _Developer_ with your projects directory.
 
 ```sh
 export PROJECT_HOME="$HOME/Developer"
@@ -114,46 +119,51 @@ zstyle ':prezto:module:python:virtualenv' auto-switch 'yes'
 zstyle ':prezto:module:python:virtualenv' initialize 'no'
 ```
 
-Aliases
--------
+## Aliases
 
-  - `py` is short for `python`.
-  - `py2` is short for `python2`.
-  - `py3` is short for `python3`.
+Aliases are enabled by default. To disable them, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
-Functions
----------
+```sh
+zstyle ':prezto:module:python:alias' skip 'yes'
+```
 
-  - `python-info` exposes information about the Python environment via the
-    `$python_info` associative array.
+- `py` is short for `python`.
+- `py2` is short for `python2`.
+- `py3` is short for `python3`.
 
-Theming
--------
+## Functions
 
-To display the name of the current virtual enviroment in a prompt, define the
+- `python-info` exposes information about the Python environment via the
+  `$python_info` associative array.
+
+## Theming
+
+To display the name of the current virtual environment in a prompt, define the
 following style in the `prompt_name_setup` function.
 
-    # %v - virtualenv name.
-    zstyle ':prezto:module:python:info:virtualenv' format 'virtualenv:%v'
+```sh
+# %v - virtualenv name.
+zstyle ':prezto:module:python:info:virtualenv' format 'virtualenv:%v'
+```
 
 Then add `$python_info[virtualenv]` to `$PROMPT` or `$RPROMPT` and call
 `python-info` in the `prompt_name_preexec` hook function.
 
 Similarly, you can use `:prezto:module:python:info:version:format` with `%v` for
 the version and add `$python_info[version]` to your prompt for the current
-python version/
+python version.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][5].*
+_The authors of this module should be contacted via the [issue tracker][5]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
-  - [Sebastian Wiesner](https://github.com/lunaryorn)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sebastian Wiesner](https://github.com/lunaryorn)
 
-[1]: http://www.python.org/dev/peps/pep-0370/
-[2]: http://www.doughellmann.com/projects/virtualenvwrapper/
-[3]: http://pypi.python.org/pypi/virtualenv
+[1]: https://www.python.org/dev/peps/pep-0370/
+[2]: https://www.doughellmann.com/projects/virtualenvwrapper/
+[3]: https://pypi.org/project/virtualenv/
 [4]: https://github.com/yyuu/pyenv
 [5]: https://github.com/sorin-ionescu/prezto/issues
-[6]: https://github.com/sorin-ionescu/prezto/blob/master/runcoms/zshenv
+[6]: ../../runcoms#zshenv
diff --git a/modules/python/init.zsh b/modules/python/init.zsh
index 45e9b8dd..c303cad1 100644
--- a/modules/python/init.zsh
+++ b/modules/python/init.zsh
@@ -5,72 +5,80 @@
 #   Sorin Ionescu <sorin.ionescu@gmail.com>
 #   Sebastian Wiesner <lunaryorn@googlemail.com>
 #   Patrick Bos <egpbos@gmail.com>
+#   Indrajit Raychaudhuri <irc@indrajit.com>
 #
 
-# Load manually installed pyenv into the shell session.
-if [[ -s "$HOME/.pyenv/bin/pyenv" ]]; then
-  path=("$HOME/.pyenv/bin" $path)
-  export PYENV_ROOT=$(pyenv root)
-  eval "$(pyenv init -)"
+#
+# Options
+#
 
-# Load package manager installed pyenv into the shell session.
-elif (( $+commands[pyenv] )); then
-  export PYENV_ROOT=$(pyenv root)
-  eval "$(pyenv init -)"
+setopt EXTENDED_GLOB
+
+# Load dependencies.
+pmodload 'helper'
+
+# Load manually installed or package manager installed pyenv into the shell
+# session.
+if [[ -s "${local_pyenv::=${PYENV_ROOT:-$HOME/.pyenv}/bin/pyenv}" ]] \
+      || (( $+commands[pyenv] )); then
+
+  # Ensure manually installed pyenv is added to path when present.
+  [[ -s $local_pyenv ]] && path=($local_pyenv:h $path)
+
+  # Load pyenv into the shell session.
+  eval "$(pyenv init - zsh)"
 
 # Prepend PEP 370 per user site packages directory, which defaults to
 # ~/Library/Python on macOS and ~/.local elsewhere, to PATH. The
 # path can be overridden using PYTHONUSERBASE.
 else
   if [[ -n "$PYTHONUSERBASE" ]]; then
-    path=($PYTHONUSERBASE/bin $path)
-  elif [[ "$OSTYPE" == darwin* ]]; then
+    path=($PYTHONUSERBASE/bin(N) $path)
+  elif is-darwin; then
     path=($HOME/Library/Python/*/bin(N) $path)
   else
     # This is subject to change.
-    path=($HOME/.local/bin $path)
+    path=($HOME/.local/bin(N) $path)
   fi
 fi
 
+unset local_pyenv
+
 # Return if requirements are not found.
-if (( ! $+commands[python] && ! $+commands[pyenv] )); then
+if (( ! $+commands[(i)python[0-9.]#] && ! $+functions[pyenv] && ! $+commands[conda] )); then
   return 1
 fi
 
 function _python-workon-cwd {
-  # Check if this is a Git repo
-  local GIT_REPO_ROOT=""
-  local GIT_TOPLEVEL="$(git rev-parse --show-toplevel 2> /dev/null)"
-  if [[ $? == 0 ]]; then
-    GIT_REPO_ROOT="$GIT_TOPLEVEL"
-  fi
-  # Get absolute path, resolving symlinks
-  local PROJECT_ROOT="${PWD:A}"
+  # Check if this is a Git repo.
+  local GIT_REPO_ROOT="$(git rev-parse --show-toplevel 2> /dev/null)"
+  # Get absolute path, resolving symlinks.
+  local PROJECT_ROOT="$PWD:A"
   while [[ "$PROJECT_ROOT" != "/" && ! -e "$PROJECT_ROOT/.venv" \
-            && ! -d "$PROJECT_ROOT/.git"  && "$PROJECT_ROOT" != "$GIT_REPO_ROOT" ]]; do
-    PROJECT_ROOT="${PROJECT_ROOT:h}"
+        && ! -d "$PROJECT_ROOT/.git"  && "$PROJECT_ROOT" != "$GIT_REPO_ROOT" ]]; do
+    PROJECT_ROOT="$PROJECT_ROOT:h"
   done
-  if [[ "$PROJECT_ROOT" == "/" ]]; then
+  if [[ $PROJECT_ROOT == "/" ]]; then
     PROJECT_ROOT="."
   fi
-  # Check for virtualenv name override
+  # Check for virtualenv name override.
   local ENV_NAME=""
   if [[ -f "$PROJECT_ROOT/.venv" ]]; then
-    ENV_NAME="$(cat "$PROJECT_ROOT/.venv")"
-  elif [[ -f "$PROJECT_ROOT/.venv/bin/activate" ]];then
+    ENV_NAME="$(<$PROJECT_ROOT/.venv)"
+  elif [[ -f "$PROJECT_ROOT/.venv/bin/activate" ]]; then
     ENV_NAME="$PROJECT_ROOT/.venv"
-  elif [[ "$PROJECT_ROOT" != "." ]]; then
-    ENV_NAME="${PROJECT_ROOT:t}"
+  elif [[ $PROJECT_ROOT != "." ]]; then
+    ENV_NAME="$PROJECT_ROOT:t"
   fi
   if [[ -n $CD_VIRTUAL_ENV && "$ENV_NAME" != "$CD_VIRTUAL_ENV" ]]; then
-    # We've just left the repo, deactivate the environment
-    # Note: this only happens if the virtualenv was activated automatically
+    # We've just left the repo, deactivate the environment.
+    # Note: this only happens if the virtualenv was activated automatically.
     deactivate && unset CD_VIRTUAL_ENV
   fi
-  if [[ "$ENV_NAME" != "" ]]; then
-    # Activate the environment only if it is not already active
+  if [[ $ENV_NAME != "" ]]; then
+    # Activate the environment only if it is not already active.
     if [[ "$VIRTUAL_ENV" != "$WORKON_HOME/$ENV_NAME" ]]; then
-      if [[ -e "$WORKON_HOME/$ENV_NAME/bin/activate" ]]; then
+      if [[ -n "$WORKON_HOME" && -e "$WORKON_HOME/$ENV_NAME/bin/activate" ]]; then
         workon "$ENV_NAME" && export CD_VIRTUAL_ENV="$ENV_NAME"
       elif [[ -e "$ENV_NAME/bin/activate" ]]; then
         source $ENV_NAME/bin/activate && export CD_VIRTUAL_ENV="$ENV_NAME"
@@ -79,89 +87,69 @@ function _python-workon-cwd {
   fi
 }
 
-# Load auto workon cwd hook
-if zstyle -t ':prezto:module:python:virtualenv' auto-switch 'yes'; then
-  # Auto workon when changing directory
+# Load auto workon cwd hook.
+if zstyle -t ':prezto:module:python:virtualenv' auto-switch; then
+  # Auto workon when changing directory.
   autoload -Uz add-zsh-hook
   add-zsh-hook chpwd _python-workon-cwd
 fi
 
 # Load virtualenvwrapper into the shell session, if pre-requisites are met
 # and unless explicitly requested not to
-if (( $+VIRTUALENVWRAPPER_VIRTUALENV || $+commands[virtualenv] )) && \
-  zstyle -T ':prezto:module:python:virtualenv' initialize ; then
+if (( $+VIRTUALENVWRAPPER_VIRTUALENV || $+commands[virtualenv] )) \
+      && zstyle -T ':prezto:module:python:virtualenv' initialize ; then
   # Set the directory where virtual environments are stored.
   export WORKON_HOME="${WORKON_HOME:-$HOME/.virtualenvs}"
 
-  # Disable the virtualenv prompt.
-  export VIRTUAL_ENV_DISABLE_PROMPT=1
+  # Disable the virtualenv prompt. Note that we use the magic value used by the
+  # pure prompt because there's some additional logic in that prompt which tries
+  # to figure out if a user set this variable and disable the python portion of
+  # that prompt based on it which is the exact opposite of what we want to do.
+  export VIRTUAL_ENV_DISABLE_PROMPT=12
 
   # Create a sorted array of available virtualenv related 'pyenv' commands to
   # look for plugins of interest. Scanning shell '$path' isn't enough as they
   # can exist in 'pyenv' synthesized paths (e.g., '~/.pyenv/plugins') instead.
   local -a pyenv_plugins
+  local pyenv_virtualenvwrapper_plugin_found
   if (( $+commands[pyenv] )); then
-    pyenv_plugins=(${(@oM)${(f)"$(pyenv commands --no-sh 2>/dev/null)"}:#virtualenv*})
-  fi
+    pyenv_plugins=(${(@oM)${(f)"$(pyenv commands --no-sh 2> /dev/null)"}:#virtualenv*})
 
-  if (( $pyenv_plugins[(i)virtualenv-init] <= $#pyenv_plugins )); then
-    # Enable 'virtualenv' with 'pyenv'.
-    eval "$(pyenv virtualenv-init -)"
+    # Optionally activate 'virtualenv-init' plugin when available.
+    if (( $pyenv_plugins[(i)virtualenv-init] <= $#pyenv_plugins )); then
+      eval "$(pyenv virtualenv-init - zsh)"
+    fi
 
     # Optionally activate 'virtualenvwrapper' plugin when available.
     if (( $pyenv_plugins[(i)virtualenvwrapper(_lazy|)] <= $#pyenv_plugins )); then
       pyenv "$pyenv_plugins[(R)virtualenvwrapper(_lazy|)]"
-    fi
-  else
-    # Fallback to 'virtualenvwrapper' without 'pyenv' wrapper if available
-    # in '$path' or in an alternative location on a Debian based system.
-    #
-    # If homebrew is installed and the python location wasn't overridden via
-    # environment variable we fall back to python3 then python2 in that order.
-    # This is needed to fix an issue with virtualenvwrapper as homebrew no
-    # longer shadows the system python.
-    if [[ -z "$VIRTUALENVWRAPPER_PYTHON" ]] && (( $+commands[brew] )); then
-      if (( $+commands[python3] )); then
-        export VIRTUALENVWRAPPER_PYTHON=$commands[python3]
-      elif (( $+commands[python2] )); then
-        export VIRTUALENVWRAPPER_PYTHON=$commands[python2]
-      fi
+      pyenv_virtualenvwrapper_plugin_found="true"
     fi
 
-    virtenv_sources=(
+    unset pyenv_plugins
+  fi
+
+  if [[ $pyenv_virtualenvwrapper_plugin_found != "true" ]]; then
+    # Fallback to standard 'virtualenvwrapper' if 'python' is available in '$path'.
+    if (( ! $+VIRTUALENVWRAPPER_PYTHON )) && (( $+commands[(i)python[0-9.]#] )); then
+      VIRTUALENVWRAPPER_PYTHON=$commands[(i)python[0-9.]#]
+    fi
+
+    virtualenvwrapper_sources=(
       ${(@Ov)commands[(I)virtualenvwrapper(_lazy|).sh]}
       /usr/share/virtualenvwrapper/virtualenvwrapper(_lazy|).sh(OnN)
     )
-    if (( $#virtenv_sources )); then
-      source "${virtenv_sources[1]}"
+    if (( $#virtualenvwrapper_sources )); then
+      source "$virtualenvwrapper_sources[1]"
     fi
 
-    unset virtenv_sources
+    unset virtualenvwrapper_sources
   fi
 
-  unset pyenv_plugins
+  unset pyenv_virtualenvwrapper_plugin_found
 fi
 
-# Load PIP completion.
-if (( $#commands[(i)pip(|[23])] )); then
-  cache_file="${TMPDIR:-/tmp}/prezto-python-cache.$UID.zsh"
-
-  # Detect and use one available from among 'pip', 'pip2', 'pip3' variants
-  pip_command="$commands[(i)pip(|[23])]"
-
-  if [[ "$pip_command" -nt "$cache_file" \
-        || "${ZDOTDIR:-$HOME}/.zpreztorc" -nt "$cache_file" \
-        || ! -s "$cache_file" ]]; then
-    # pip is slow; cache its output. And also support 'pip2', 'pip3' variants
-    $pip_command completion --zsh \
-      | sed -e "s|compctl -K [-_[:alnum:]]* pip|& pip2 pip3|" >! "$cache_file" 2> /dev/null
-  fi
-
-  source "$cache_file"
-  unset cache_file pip_command
-fi
-
-# Load conda into the shell session, if requested
+# Load conda into the shell session, if requested.
 zstyle -T ':prezto:module:python' conda-init
 if (( $? && $+commands[conda] )); then
   if (( $(conda ..changeps1) )); then
@@ -178,6 +166,8 @@ fi
 # Aliases
 #
 
-alias py='python'
-alias py2='python2'
-alias py3='python3'
+if ! zstyle -t ':prezto:module:python:alias' skip; then
+  alias py='python'
+  alias py2='python2'
+  alias py3='python3'
+fi
diff --git a/modules/rails/README.md b/modules/rails/README.md
index 19bea1d8..5e230e0e 100644
--- a/modules/rails/README.md
+++ b/modules/rails/README.md
@@ -1,34 +1,38 @@
-Ruby on Rails
-=============
+# Ruby on Rails
 
 Defines [Ruby on Rails][1] aliases.
 
-Aliases
--------
+## Aliases
 
-  - `ror` is short for `rails`.
-  - `rorc` starts the Rails console.
-  - `rordc` starts the Rails console connected to the database.
-  - `rordm` migrates the database.
-  - `rordM` migrates the database and recreates the test database.
-  - `rordr` rolls the database schema back to the previous version.
-  - `rorg` generates new code.
-  - `rorl` displays the log.
-  - `rorlc` truncates logs to zero bytes.
-  - `rorp` installs a plugin.
-  - `rorr` runs code in the application environment.
-  - `rors` starts the Rails server.
-  - `rorsd` starts the Rails server with the debugger.
-  - `rorx` destroys newly generated code.
+Aliases are enabled by default. To disable them, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
-Authors
--------
+```sh
+zstyle ':prezto:module:rails:alias' skip 'yes'
+```
 
-*The authors of this module should be contacted via the [issue tracker][2].*
+- `ror` is short for `rails`.
+- `rorc` starts the Rails console.
+- `rordc` starts the Rails console connected to the database.
+- `rordm` migrates the database.
+- `rordM` migrates the database and recreates the test database.
+- `rordr` rolls the database schema back to the previous version.
+- `rorg` generates new code.
+- `rorl` displays the log.
+- `rorlc` truncates logs to zero bytes.
+- `rorp` installs a plugin.
+- `rorr` runs code in the application environment.
+- `rors` starts the Rails server.
+- `rorsd` starts the Rails server with the debugger.
+- `rorx` destroys newly generated code.
 
-  - [Robby Russell](https://github.com/robbyrussell)
-  - [Jake Bell](https://github.com/theunraveler)
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+## Authors
 
-[1]: http://rubyonrails.org
+_The authors of this module should be contacted via the [issue tracker][2]._
+
+- [Robby Russell](https://github.com/robbyrussell)
+- [Jake Bell](https://github.com/theunraveler)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
+
+[1]: https://rubyonrails.org
 [2]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/rails/init.zsh b/modules/rails/init.zsh
index 44b53e90..ed86372b 100644
--- a/modules/rails/init.zsh
+++ b/modules/rails/init.zsh
@@ -19,17 +19,19 @@ fi
 # Aliases
 #
 
-alias ror='bundle exec rails'
-alias rorc='bundle exec rails console'
-alias rordc='bundle exec rails dbconsole'
-alias rordm='bundle exec rake db:migrate'
-alias rordM='bundle exec rake db:migrate db:test:clone'
-alias rordr='bundle exec rake db:rollback'
-alias rorg='bundle exec rails generate'
-alias rorl='tail -f "$(ruby-app-root)/log/development.log"'
-alias rorlc='bundle exec rake log:clear'
-alias rorp='bundle exec rails plugin'
-alias rorr='bundle exec rails runner'
-alias rors='bundle exec rails server'
-alias rorsd='bundle exec rails server --debugger'
-alias rorx='bundle exec rails destroy'
+if ! zstyle -t ':prezto:module:rails:alias' skip; then
+  alias ror='bundle exec rails'
+  alias rorc='bundle exec rails console'
+  alias rordc='bundle exec rails dbconsole'
+  alias rordm='bundle exec rake db:migrate'
+  alias rordM='bundle exec rake db:migrate db:test:clone'
+  alias rordr='bundle exec rake db:rollback'
+  alias rorg='bundle exec rails generate'
+  alias rorl='tail -f "$(ruby-app-root)/log/development.log"'
+  alias rorlc='bundle exec rake log:clear'
+  alias rorp='bundle exec rails plugin'
+  alias rorr='bundle exec rails runner'
+  alias rors='bundle exec rails server'
+  alias rorsd='bundle exec rails server --debugger'
+  alias rorx='bundle exec rails destroy'
+fi
diff --git a/modules/rsync/README.md b/modules/rsync/README.md
index 77d78ea5..ca0627f8 100644
--- a/modules/rsync/README.md
+++ b/modules/rsync/README.md
@@ -1,27 +1,26 @@
-Rsync
-=====
+# Rsync
 
 Defines [rsync][1] aliases.
 
-macOS users are encouraged to use [Bombich's rsync][2], which has HFS+
-enhancements.
+macOS users are encouraged to use _rsync_ from [Homebrew][2] or [MacPorts][3],
+which has additional enhancements including patches from [Bombich][4].
 
-Aliases
--------
+## Aliases
 
-  - `rsync-copy` copies files and directories from *source* to *destination*.
-  - `rsync-move` moves files and directories from *source* to *destination*.
-  - `rsync-update` updates files and directories on *destination*.
-  - `rsync-synchronize` synchronizes files and directories between *source* and
-    *destination*.
+- `rsync-copy` copies files and directories from _source_ to _destination_.
+- `rsync-move` moves files and directories from _source_ to _destination_.
+- `rsync-update` updates files and directories on _destination_.
+- `rsync-synchronize` synchronizes files and directories between _source_ and
+  _destination_.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][3].*
+_The authors of this module should be contacted via the [issue tracker][5]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
-[1]: http://rsync.samba.org
-[2]: https://bombich.com/kb/ccc5/credits#rsync
-[3]: https://github.com/sorin-ionescu/prezto/issues
+[1]: https://rsync.samba.org
+[2]: https://github.com/Homebrew/homebrew-core
+[3]: https://ports.macports.org/port/rsync
+[4]: https://bombich.com/kb/ccc5/credits#rsync
+[5]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/rsync/init.zsh b/modules/rsync/init.zsh
index a802222f..47eabfe8 100644
--- a/modules/rsync/init.zsh
+++ b/modules/rsync/init.zsh
@@ -10,20 +10,29 @@ if (( ! $+commands[rsync] )); then
   return 1
 fi
 
+# Load dependencies.
+pmodload 'helper'
+
 #
 # Aliases
 #
 
-_rsync_cmd='rsync --verbose --progress --human-readable --compress --archive --hard-links --one-file-system'
+_rsync_cmd='rsync --verbose --progress --human-readable --compress --archive \
+  --hard-links --one-file-system'
 
-if grep -q 'xattrs' <(rsync --help 2>&1); then
-  _rsync_cmd="${_rsync_cmd} --acls --xattrs"
-fi
+autoload -Uz is-at-least
+if is-at-least 3.1 ${"$(rsync --version 2>&1)"[(w)3]}; then
 
-# macOS and HFS+ Enhancements
-# http://help.bombich.com/kb/overview/credits#opensource
-if [[ "$OSTYPE" == darwin* ]] && grep -q 'file-flags' <(rsync --help 2>&1); then
-  _rsync_cmd="${_rsync_cmd} --crtimes --fileflags --protect-decmpfs --force-change"
+  # ACL and extended attributes support
+  if grep -q 'xattrs' <(rsync --help 2>&1); then
+    _rsync_cmd="${_rsync_cmd} --acls --xattrs"
+  fi
+
+  # macOS Enhancements
+  # https://bombich.com/kb/ccc5/credits
+  if is-darwin && grep -q 'file-flags' <(rsync --help 2>&1); then
+    _rsync_cmd="${_rsync_cmd} --crtimes --fileflags --force-change"
+  fi
 fi
 
 alias rsync-copy="${_rsync_cmd}"
diff --git a/modules/ruby/README.md b/modules/ruby/README.md
index 12848d86..fa3d1064 100644
--- a/modules/ruby/README.md
+++ b/modules/ruby/README.md
@@ -1,21 +1,29 @@
-Ruby
-====
+# Ruby
 
 Configures [Ruby][1] local gem installation, loads version managers, and defines
 aliases.
 
-Local Gem Installation
-----------------------
+## Local Gem Installation
 
 When a Ruby version manager is not detected, local gems are installed in
-`~/.gems`; otherwise, they are installed according to the manager.
+_`~/.gem`_; otherwise, they are installed according to the manager.
 
-RVM
----
+## rbenv
 
-An alternative to the above is to use [The Ruby Version Manager (RVM)][2], which
-allows for managing multiple, isolated Ruby installations and gem sets in the
-home directory.
+An alternative RVM is to use [_rbenv_][2], which allows for switching between
+multiple, isolated Ruby installations in the home directory.
+
+While it is not as feature rich as RVM, it is not loaded into the shell and is
+not known to cause conflicts with shell scripts.
+
+This will be loaded automatically if _rbenv_ is installed to `$RBENV_ROOT`,
+_`~/.rbenv`_, or if the `rbenv` command is on the path.
+
+## rvm
+
+An alternative to the above is to use [The Ruby Version Manager (_rvm_)][3],
+which allows for managing multiple, isolated Ruby installations and gem sets in
+the home directory.
 
 Since RVM is loaded into the shell and is known to override shell commands, it
 may conflict with shell scripts.
@@ -23,90 +31,83 @@ may conflict with shell scripts.
 Load this module as late as possible when using RVM since RVM will complain if
 it is not first in `$PATH`.
 
-rbenv
------
+## chruby
 
-An alternative RVM is to use [rbenv][3], which allows for switching between
-multiple, isolated Ruby installations in the home directory.
-
-While it is not as feature rich as RVM, it is not loaded into the shell and is
-not known to cause conflicts with shell scripts.
-
-chruby
-------
-
-Yet another alternative is [chruby][4], which is simpler than both RVM and
-rbenv.
+Yet another alternative is [_chruby_][4], which is simpler than both _rvm_ and
+_rbenv_.
 
 ### Settings
 
 #### Auto-Switch
 
 To enable auto switching the Ruby version on directory change based on the
-`.ruby-version` file, add the following line to [`zpreztorc`][5]:
+`.ruby-version` file, add the following line to _`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:ruby:chruby' auto-switch 'yes'
 ```
 
-Bundler
--------
+## Bundler
 
 Manage gems that are not meant to be used as commands, such as application
-dependencies, with [Bundler][6].
+dependencies, with [Bundler][5].
 
-Aliases
--------
+## Aliases
+
+Aliases are enabled by default. To disable them, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
+
+```sh
+zstyle ':prezto:module:ruby:alias' skip 'yes'
+```
 
 ### General
 
-  - `rb` is short for `ruby`.
+- `rb` is short for `ruby`.
 
 ### Bundler
 
-  - `rbb` manages ruby dependencies (`bundle`).
-  - `rbbc` cleans up unused gems in your bundler directory.
-  - `rbbe` executes a script in the context of the current bundle.
-  - `rbbi` installs the gems specified in the `Gemfile` in `vendor/bundle`.
-  - `rbbI` installs the following:
-    - gems specified in the `Gemfile` in `vendor/bundle`.
-    - packages the gems into `vendor/cache`.
-    - appends bundler directories to  `.gitignore`.
-  - `rbbl` lists all gems in the current bundle.
-  - `rbbo` opens an installed gem in the editor.
-  - `rbbp` packages gem files into `vendor/cache`.
-  - `rbbu` updates gems to their latest version.
+- `rbb` manages ruby dependencies (`bundle`).
+- `rbbc` cleans up unused gems in your bundler directory.
+- `rbbe` executes a script in the context of the current bundle.
+- `rbbi` installs the gems specified in the `Gemfile` in `vendor/bundle`.
+- `rbbI` installs the following:
+  - gems specified in the `Gemfile` in `vendor/bundle`.
+  - packages the gems into `vendor/cache`.
+  - appends bundler directories to `.gitignore`.
+- `rbbl` lists all gems in the current bundle.
+- `rbbo` opens an installed gem in the editor.
+- `rbbp` packages gem files into `vendor/cache`.
+- `rbbu` updates gems to their latest version.
 
-Functions
----------
+## Functions
 
-  - `ruby-app-root` displays the path to the Ruby application root directory.
-  - `ruby-info` exposes information about the Ruby environment via the
-    `$ruby_info` associative array.
+- `ruby-app-root` displays the path to the Ruby application root directory.
+- `ruby-info` exposes information about the Ruby environment via the
+  `$ruby_info` associative array.
 
-Theming
--------
+## Theming
 
 To display the name of the current Ruby version in a prompt, define the
 following style in the `prompt_name_setup` function.
 
-    # %v - ruby version.
-    zstyle ':prezto:module:ruby:info:version' format 'version:%v'
+```sh
+# %v - ruby version.
+zstyle ':prezto:module:ruby:info:version' format 'version:%v'
+```
 
 Then add `$ruby_info[version]` to `$PROMPT` or `$RPROMPT` and call
 `ruby-info` in the `prompt_name_preexec` hook function.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][7].*
+_The authors of this module should be contacted via the [issue tracker][6]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
-[1]: http://www.ruby-lang.org
-[2]: https://rvm.io
-[3]: https://github.com/sstephenson/rbenv
+[1]: https://www.ruby-lang.org
+[2]: https://github.com/rbenv/rbenv
+[3]: https://rvm.io
 [4]: https://github.com/postmodern/chruby
-[5]: https://github.com/sorin-ionescu/prezto/blob/master/runcoms/zpreztorc
-[6]: http://gembundler.com
-[7]: https://github.com/sorin-ionescu/prezto/issues
+[5]: https://gembundler.com
+[6]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/ruby/init.zsh b/modules/ruby/init.zsh
index 4ede3667..86ab43ce 100644
--- a/modules/ruby/init.zsh
+++ b/modules/ruby/init.zsh
@@ -1,27 +1,32 @@
 #
-# Configures Ruby local gem installation, loads version managers, and defines
+# Configures Ruby local installation, loads version managers, and defines
 # aliases.
 #
-# Authors: Sorin Ionescu <sorin.ionescu@gmail.com>
+# Authors:
+#   Sorin Ionescu <sorin.ionescu@gmail.com>
+#   Indrajit Raychaudhuri <irc@indrajit.com>
 #
 
-# Load RVM into the shell session.
-if [[ -s "$HOME/.rvm/scripts/rvm" ]]; then
+# Possible lookup locations for manually installed rbenv and rvm.
+local_rbenv_paths=({$RBENV_ROOT,{$XDG_CONFIG_HOME/,$HOME/.}rbenv}/bin/rbenv(N))
+local_rvm_paths=({$RVM_DIR,{$XDG_CONFIG_HOME/,$HOME/.}rvm}/scripts/rvm(N))
+
+# Load manually installed or package manager installed rbenv into the shell
+# session.
+if (( $#local_rbenv_paths || $+commands[rbenv] )); then
+
+  # Ensure manually installed rbenv is added to path when present.
+  [[ -s $local_rbenv_paths[1] ]] && path=($local_rbenv_paths[1]:h $path)
+
+  eval "$(rbenv init - zsh)"
+
+# Load manually installed rvm into the shell session.
+elif (( $#local_rvm_paths )); then
   # Unset AUTO_NAME_DIRS since auto adding variable-stored paths to ~ list
-  # conflicts with RVM.
+  # conflicts with rvm.
   unsetopt AUTO_NAME_DIRS
 
-  # Source RVM.
-  source "$HOME/.rvm/scripts/rvm"
-
-# Load manually installed rbenv into the shell session.
-elif [[ -s "$HOME/.rbenv/bin/rbenv" ]]; then
-  path=("$HOME/.rbenv/bin" $path)
-  eval "$(rbenv init - --no-rehash zsh)"
-
-# Load package manager installed rbenv into the shell session.
-elif (( $+commands[rbenv] )); then
-  eval "$(rbenv init - --no-rehash zsh)"
+  source "$local_rvm_paths[1]"
 
 # Load package manager installed chruby into the shell session.
 elif (( $+commands[chruby-exec] )); then
@@ -34,7 +39,7 @@ elif (( $+commands[chruby-exec] )); then
       source "${commands[chruby-exec]:h:h}/share/chruby/auto.sh"
     fi
 
-    # If a default Ruby is set, switch to it.
+    # If a default ruby is set, switch to it.
     chruby_auto
   fi
 
@@ -43,8 +48,10 @@ else
   path=($HOME/.gem/ruby/*/bin(N) $path)
 fi
 
+unset local_rbenv
+
 # Return if requirements are not found.
-if (( ! $+commands[ruby] && ! ( $+commands[rvm] || $+commands[rbenv] ) )); then
+if (( ! $+commands[ruby] && ! $#functions[(i)r(benv|vm)] )); then
   return 1
 fi
 
@@ -52,23 +59,25 @@ fi
 # Aliases
 #
 
-# General
-alias rb='ruby'
+if ! zstyle -t ':prezto:module:ruby:alias' skip; then
+  # General
+  alias rb='ruby'
 
-# Bundler
-if (( $+commands[bundle] )); then
-  alias rbb='bundle'
-  alias rbbc='bundle clean'
-  alias rbbe='bundle exec'
-  alias rbbi='bundle install --path vendor/bundle'
-  alias rbbl='bundle list'
-  alias rbbo='bundle open'
-  alias rbbp='bundle package'
-  alias rbbu='bundle update'
-  alias rbbI='rbbi \
-    && bundle package \
-    && print .bundle       >>! .gitignore \
-    && print vendor/assets >>! .gitignore \
-    && print vendor/bundle >>! .gitignore \
-    && print vendor/cache  >>! .gitignore'
+  # Bundler
+  if (( $+commands[bundle] )); then
+    alias rbb='bundle'
+    alias rbbc='bundle clean'
+    alias rbbe='bundle exec'
+    alias rbbi='bundle install --path vendor/bundle'
+    alias rbbl='bundle list'
+    alias rbbo='bundle open'
+    alias rbbp='bundle package'
+    alias rbbu='bundle update'
+    alias rbbI='rbbi \
+      && bundle package \
+      && print .bundle       >>! .gitignore \
+      && print vendor/assets >>! .gitignore \
+      && print vendor/bundle >>! .gitignore \
+      && print vendor/cache  >>! .gitignore'
+  fi
 fi
diff --git a/modules/screen/README.md b/modules/screen/README.md
index 0a9ff07c..b5549510 100644
--- a/modules/screen/README.md
+++ b/modules/screen/README.md
@@ -1,44 +1,47 @@
-GNU Screen
-==========
+# GNU Screen
 
 Defines [GNU Screen][1] aliases and provides for auto launching it at start-up.
 
-Settings
---------
+## Settings
 
 ### Auto-Start
 
 Starts a GNU Screen session automatically when Zsh is launched.
 
-To enable this feature when launching Zsh in a local terminal, add the
-following line to *zpreztorc*:
+To enable this feature when launching Zsh in a local terminal, add the following
+line to _`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:screen:auto-start' local 'yes'
 ```
 
-To enable this feature when launching Zsh in a SSH connection, add the
-following line to *zpreztorc*:
+To enable this feature when launching Zsh in a SSH connection, add the following
+line to _`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:screen:auto-start' remote 'yes'
 ```
 
-Aliases
--------
+## Aliases
 
-  - `scr` is short for `screen`.
-  - `scrl` lists sessions/socket directory.
-  - `scrn` starts a new session.
-  - `scrr` attaches to a session if one exists or start a new one.
+Aliases are enabled by default. To disable them, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
-Authors
--------
+```sh
+zstyle ':prezto:module:screen:alias' skip 'yes'
+```
 
-*The authors of this module should be contacted via the [issue tracker][2].*
+- `scr` is short for `screen`.
+- `scrl` lists sessions/socket directory.
+- `scrn` starts a new session.
+- `scrr` attaches to a session if one exists or start a new one.
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
-  - [Georges Discry](https://github.com/gdiscry)
+## Authors
 
-[1]: http://www.gnu.org/software/screen/
+_The authors of this module should be contacted via the [issue tracker][2]._
+
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Georges Discry](https://github.com/gdiscry)
+
+[1]: https://www.gnu.org/software/screen/
 [2]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/screen/init.zsh b/modules/screen/init.zsh
index 0dee1c96..1a3908d8 100644
--- a/modules/screen/init.zsh
+++ b/modules/screen/init.zsh
@@ -22,7 +22,7 @@ if [[ -z "$STY" && -z "$EMACS" && -z "$VIM" ]] && ( \
   session="$(
     screen -list 2> /dev/null \
       | sed '1d;$d' \
-      | awk '{print $1}' \
+      | awk '!/Dead/ {print $1}' \
       | head -1)"
 
   if [[ -n "$session" ]]; then
@@ -36,7 +36,9 @@ fi
 # Aliases
 #
 
-alias scr='screen'
-alias scrl='screen -list'
-alias scrn='screen -U -S'
-alias scrr='screen -a -A -U -D -R'
+if ! zstyle -t ':prezto:module:screen:alias' skip; then
+  alias scr='screen'
+  alias scrl='screen -list'
+  alias scrn='screen -U -S'
+  alias scrr='screen -a -A -U -D -R'
+fi
diff --git a/modules/spectrum/README.md b/modules/spectrum/README.md
index 66abcb26..de393a75 100644
--- a/modules/spectrum/README.md
+++ b/modules/spectrum/README.md
@@ -1,16 +1,14 @@
-Spectrum
-========
+# Spectrum
 
 Provides for easier use of 256 colors and effects.
 
 To learn more about text formatting, read [A Guide to 256 Color Codes][1].
 
-Variables
----------
+## Variables
 
-  - `BG` provides background colors.
-  - `FG` provides foreground colors.
-  - `FX` provides effects.
+- `BG` provides background colors.
+- `FG` provides foreground colors.
+- `FX` provides effects.
 
 ### Background and Foreground
 
@@ -72,20 +70,19 @@ Though there are many effects, most terminals support at least bold formatting.
 | font-fifth                | no-font-fifth                |
 | font-sixth                | no-font-sixth                |
 | font-seventh              | no-font-seventh              |
-| font-eigth                | no-font-eigth                |
+| font-eighth               | no-font-eighth               |
 | font-ninth                | no-font-ninth                |
 
 ### Plain Text
 
 Use `$BG[none]`, `$FG[none]`, or `$FX[none]` to turn off formatting.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][2].*
+_The authors of this module should be contacted via the [issue tracker][2]._
 
-  - [P.C. Shyamshankar](https://github.com/sykora)
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [P.C. Shyamshankar](https://github.com/sykora)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
 [1]: http://lucentbeing.com/writing/archives/a-guide-to-256-color-codes/
 [2]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/spectrum/init.zsh b/modules/spectrum/init.zsh
index 61e2262f..78beaed4 100644
--- a/modules/spectrum/init.zsh
+++ b/modules/spectrum/init.zsh
@@ -49,7 +49,7 @@ FX=(
   font-fifth                "\e[15m"    no-font-fifth                "\e[10m"
   font-sixth                "\e[16m"    no-font-sixth                "\e[10m"
   font-seventh              "\e[17m"    no-font-seventh              "\e[10m"
-  font-eigth                "\e[18m"    no-font-eigth                "\e[10m"
+  font-eighth               "\e[18m"    no-font-eighth               "\e[10m"
   font-ninth                "\e[19m"    no-font-ninth                "\e[10m"
 )
 
diff --git a/modules/ssh/README.md b/modules/ssh/README.md
index a1727b9a..5b814092 100644
--- a/modules/ssh/README.md
+++ b/modules/ssh/README.md
@@ -1,26 +1,24 @@
-SSH
-===
+# SSH
 
-Provides for an easier use of [SSH][1] by setting up [ssh-agent][2].
+Provides for an easier use of [SSH][1] by setting up [_ssh-agent_][2].
 
-Settings
---------
+## Settings
 
 ### Identities
 
-To load multiple identities, add the following line to *zpreztorc*:
+To load multiple identities, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:ssh:load' identities 'id_rsa' 'id_dsa' 'id_github'
 ```
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][3].*
+_The authors of this module should be contacted via the [issue tracker][3]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+[Sorin Ionescu](https://github.com/sorin-ionescu)
 
-[1]: http://www.openssh.com
-[2]: http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-agent&sektion=1
+[1]: https://www.openssh.com
+[2]: https://www.openbsd.org/cgi-bin/man.cgi?query=ssh-agent&sektion=1
 [3]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/ssh/init.zsh b/modules/ssh/init.zsh
index 08edce57..6bf237c5 100644
--- a/modules/ssh/init.zsh
+++ b/modules/ssh/init.zsh
@@ -14,10 +14,10 @@ fi
 _ssh_dir="$HOME/.ssh"
 
 # Set the path to the environment file if not set by another module.
-_ssh_agent_env="${_ssh_agent_env:-${TMPDIR:-/tmp}/ssh-agent.env.$UID}"
+_ssh_agent_env="${_ssh_agent_env:-${XDG_CACHE_HOME:-$HOME/.cache}/prezto/ssh-agent.env}"
 
-# Set the path to the persistent authentication socket.
-_ssh_agent_sock="${TMPDIR:-/tmp}/ssh-agent.sock.$UID"
+# Set the path to the persistent authentication socket if not set by another module.
+_ssh_agent_sock="${_ssh_agent_sock:-${XDG_CACHE_HOME:-$HOME/.cache}/prezto/ssh-agent.sock}"
 
 # Start ssh-agent if not started.
 if [[ ! -S "$SSH_AUTH_SOCK" ]]; then
@@ -26,12 +26,14 @@ if [[ ! -S "$SSH_AUTH_SOCK" ]]; then
 
   # Start ssh-agent if not started.
   if ! ps -U "$LOGNAME" -o pid,ucomm | grep -q -- "${SSH_AGENT_PID:--1} ssh-agent"; then
+    mkdir -p "$_ssh_agent_env:h"
     eval "$(ssh-agent | sed '/^echo /d' | tee "$_ssh_agent_env")"
   fi
 fi
 
 # Create a persistent SSH authentication socket.
 if [[ -S "$SSH_AUTH_SOCK" && "$SSH_AUTH_SOCK" != "$_ssh_agent_sock" ]]; then
+  mkdir -p "$_ssh_agent_sock:h"
   ln -sf "$SSH_AUTH_SOCK" "$_ssh_agent_sock"
   export SSH_AUTH_SOCK="$_ssh_agent_sock"
 fi
@@ -50,9 +52,9 @@ if ssh-add -l 2>&1 | grep -q 'The agent has no identities'; then
   # program specified by SSH_ASKPASS and open an X11 window to read the
   # passphrase.
   if [[ -n "$DISPLAY" && -x "$SSH_ASKPASS" ]]; then
-    ssh-add ${_ssh_identities:+$_ssh_dir/${^_ssh_identities[@]}} < /dev/null 2> /dev/null
+    ssh-add ${_ssh_identities:+$_ssh_dir/${^~_ssh_identities[@]}} < /dev/null 2> /dev/null
   else
-    ssh-add ${_ssh_identities:+$_ssh_dir/${^_ssh_identities[@]}} 2> /dev/null
+    ssh-add ${_ssh_identities:+$_ssh_dir/${^~_ssh_identities[@]}} 2> /dev/null
   fi
 fi
 
diff --git a/modules/syntax-highlighting/README.md b/modules/syntax-highlighting/README.md
index 5dad5bba..3debb677 100644
--- a/modules/syntax-highlighting/README.md
+++ b/modules/syntax-highlighting/README.md
@@ -1,26 +1,33 @@
-Syntax Highlighting
-===================
+# Syntax Highlighting
 
 Integrates [zsh-syntax-highlighting][1] into Prezto.
 
-This module should be loaded *second to last*, where last is the *prompt*
-module, unless used in conjuncture with the *history-substring-search* module
-where it must be loaded **before** it.
+This module must be loaded _before_ the _`prompt`_ module.
 
-Contributors
-------------
+If this module is used in conjunction with the [_`history-substring-search`_][2]
+module, this module must be loaded _before_ the _`history-substring-search`_
+module.
+
+Additionally, if this module is used in conjunction with the
+[_`autosuggestions`_][3] module, this module must be loaded _before_ the
+_`autosuggestions`_ module as well.
+
+To elaborate, the relative order of loading the modules would be
+_`syntax-highlighting`_, _`history-substring-search`_, _`autosuggestions`_ and
+_`prompt`_.
+
+## Contributors
 
 New features and bug fixes should be submitted to the
 [zsh-syntax-highlighting][1] project according to its rules and regulations.
 This module will be synchronized against it.
 
-Settings
---------
+## Settings
 
 ### Highlighting
 
 To enable highlighting for this module only, add the following line to
-*zpreztorc*:
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:syntax-highlighting' color 'yes'
@@ -28,10 +35,11 @@ zstyle ':prezto:module:syntax-highlighting' color 'yes'
 
 ### Highlighters
 
-Syntax highlighting is accomplished by pluggable [highlighters][2]. This module
-only enables the *main* highlighter by default.
+Syntax highlighting is accomplished by pluggable [highlighters][4]. This module
+only enables the _main_ highlighter by default.
 
-To enable all highlighters, add the following to *zpreztorc*:
+To enable all highlighters, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
 ```sh
 zstyle ':prezto:module:syntax-highlighting' highlighters \
@@ -48,7 +56,7 @@ zstyle ':prezto:module:syntax-highlighting' highlighters \
 Each syntax highlighter defines styles used to highlight tokens.
 
 To highlight, for example, builtins, commands, and functions in blue instead of
-green, add the following to *zpreztorc*:
+green, add the following to _`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:syntax-highlighting' styles \
@@ -57,13 +65,14 @@ zstyle ':prezto:module:syntax-highlighting' styles \
   'function' 'bg=blue'
 ```
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][3].*
+_The authors of this module should be contacted via the [issue tracker][5]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
 [1]: https://github.com/zsh-users/zsh-syntax-highlighting
-[2]: https://github.com/zsh-users/zsh-syntax-highlighting/tree/master/highlighters
-[3]: https://github.com/sorin-ionescu/prezto/issues
+[2]: ../history-substring-search#readme
+[3]: ../autosuggestions#readme
+[4]: https://github.com/zsh-users/zsh-syntax-highlighting/tree/master/highlighters
+[5]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/syntax-highlighting/external b/modules/syntax-highlighting/external
index 434af7b1..143b25eb 160000
--- a/modules/syntax-highlighting/external
+++ b/modules/syntax-highlighting/external
@@ -1 +1 @@
-Subproject commit 434af7b11dd33641231f1b48b8432e68eb472e46
+Subproject commit 143b25eb98aa3227af63bd7f04413e1b3e7888ec
diff --git a/modules/terminal/README.md b/modules/terminal/README.md
index 41a08855..be4e3a16 100644
--- a/modules/terminal/README.md
+++ b/modules/terminal/README.md
@@ -1,23 +1,21 @@
-Terminal
-========
+# Terminal
 
 Sets terminal window and tab titles.
 
-Settings
---------
+## Settings
 
 ### Auto-Title
 
 To auto set the terminal window and tab titles with the current command or
-directory, add the following to *zpreztorc*:
+directory, add the following to _`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:terminal' auto-title 'yes'
 ```
 
-Auto titling is disabled inside terminal multiplexers (except inside dvtm)
-since it interferes with window names defined in configuration files and
-profile managers. This can be overridden by setting it to `always`.
+Auto titling is disabled inside terminal multiplexers (except inside dvtm) since
+it interferes with window names defined in configuration files and profile
+managers. This can be overridden by setting it to `always`.
 
 ```sh
 zstyle ':prezto:module:terminal' auto-title 'always'
@@ -25,7 +23,8 @@ zstyle ':prezto:module:terminal' auto-title 'always'
 
 ### Title formats
 
-To format terminal window and tab titles, add the following to *zpreztorc*:
+To format terminal window and tab titles, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
 ```sh
 zstyle ':prezto:module:terminal:window-title' format '%n@%m: %s'
@@ -38,20 +37,18 @@ executing program name.
 
 For a list of sequences, see [Expansion of Prompt Sequences][1].
 
-Functions
----------
+## Functions
 
 - `set-tab-title` sets the terminal tab title.
 - `set-window-title` sets the terminal window title.
 - `set-multiplexer-title` sets the terminal multiplexer title.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][2].*
+_The authors of this module should be contacted via the [issue tracker][2]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
-  - [Olaf Conradi](https://github.com/oohlaf)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Olaf Conradi](https://github.com/oohlaf)
 
-[1]: http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Expansion-of-Prompt-Sequences
+[1]: https://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Expansion-of-Prompt-Sequences
 [2]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/tmux/README.md b/modules/tmux/README.md
index 0738d7cf..f6d375b0 100644
--- a/modules/tmux/README.md
+++ b/modules/tmux/README.md
@@ -1,24 +1,22 @@
-Tmux
-====
+# Tmux
 
-Defines [tmux][1] aliases and provides for auto launching it at start-up.
+Defines [_tmux_][1] aliases and provides for auto launching it at start-up.
 
-Settings
---------
+## Settings
 
 ### Auto-Start
 
 Starts a tmux session automatically when Zsh is launched.
 
-To enable this feature when launching Zsh in a local terminal, add the
-following line to *zpreztorc*:
+To enable this feature when launching Zsh in a local terminal, add the following
+line to _`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:tmux:auto-start' local 'yes'
 ```
 
-To enable this feature when launching Zsh in a SSH connection, add the
-following line to *zpreztorc*:
+To enable this feature when launching Zsh in a SSH connection, add the following
+line to _`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:tmux:auto-start' remote 'yes'
@@ -36,7 +34,7 @@ zstyle ':prezto:module:tmux:session' name '<YOUR DEFAULT SESSION NAME>'
 With `auto-start` enabled, you may want to control how multiple sessions are
 managed. The `destroy-unattached` option of tmux controls if the unattached
 sessions must be kept alive, making sessions available for later use, configured
-in *tmux.conf*:
+in _tmux.conf_:
 
 ```conf
 set-option -g destroy-unattached [on | off]
@@ -45,7 +43,7 @@ set-option -g destroy-unattached [on | off]
 #### iTerm2 Integration
 
 [iTerm2][6] offers significant integration with tmux. This can be enabled by
-adding the following line to *zpreztorc*:
+adding the following line to _`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:tmux:iterm' integrate 'yes'
@@ -53,19 +51,24 @@ zstyle ':prezto:module:tmux:iterm' integrate 'yes'
 
 Read [iTerm2 and tmux Integration][7] for more information.
 
-Aliases
--------
+## Aliases
 
-  - `tmuxa` attaches or switches to a tmux session.
-  - `tmuxl` lists sessions managed by the tmux server.
+Aliases are enabled by default. To disable them, add the following to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_.
 
-Caveats
--------
+```sh
+zstyle ':prezto:module:tmux:alias' skip 'yes'
+```
+
+- `tmuxa` attaches or switches to a tmux session.
+- `tmuxl` lists sessions managed by the tmux server.
+
+## Caveats
 
 On macOS, launching tmux can cause the error **launch_msg(...): Socket is not
 connected** to be displayed, which can be fixed by installing
 [reattach-to-user-namespace][3], available in [Homebrew][4], and adding the
-following to *tmux.conf*:
+following to _tmux.conf_:
 
 ```conf
 set-option -g default-command "reattach-to-user-namespace -l $SHELL -l"
@@ -74,20 +77,19 @@ set-option -g default-command "reattach-to-user-namespace -l $SHELL -l"
 Furthermore, tmux is known to cause **kernel panics** on macOS. A discussion
 about this and Prezto has already been [opened][2].
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][5].*
+_The authors of this module should be contacted via the [issue tracker][5]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
-  - [Colin Hebert](https://github.com/ColinHebert)
-  - [Georges Discry](https://github.com/gdiscry)
-  - [Xavier Cambar](https://github.com/xcambar)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Colin Hebert](https://github.com/ColinHebert)
+- [Georges Discry](https://github.com/gdiscry)
+- [Xavier Cambar](https://github.com/xcambar)
 
-[1]: http://tmux.sourceforge.net
+[1]: https://tmux.github.io/
 [2]: https://github.com/sorin-ionescu/prezto/issues/62
 [3]: https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard
 [4]: https://github.com/mxcl/homebrew
 [5]: https://github.com/sorin-ionescu/prezto/issues
-[6]: http://iterm2.com
+[6]: https://iterm2.com
 [7]: https://gitlab.com/gnachman/iterm2/wikis/TmuxIntegration
diff --git a/modules/tmux/init.zsh b/modules/tmux/init.zsh
index fb56d076..17006c82 100644
--- a/modules/tmux/init.zsh
+++ b/modules/tmux/init.zsh
@@ -23,7 +23,7 @@ if ([[ "$TERM_PROGRAM" = 'iTerm.app' ]] && \
   _tmux_iterm_integration='-CC'
 fi
 
-if [[ -z "$TMUX" && -z "$EMACS" && -z "$VIM" && -z "$INSIDE_EMACS" && -z "$VSCODE_PID" ]] && ( \
+if [[ -z "$TMUX" && -z "$EMACS" && -z "$VIM" && -z "$INSIDE_EMACS" && "$TERM_PROGRAM" != "vscode" && "$TERMINAL_EMULATOR" != "JetBrains-JediTerm" ]] && ( \
   ( [[ -n "$SSH_TTY" ]] && zstyle -t ':prezto:module:tmux:auto-start' remote ) ||
   ( [[ -z "$SSH_TTY" ]] && zstyle -t ':prezto:module:tmux:auto-start' local ) \
 ); then
@@ -45,5 +45,7 @@ fi
 # Aliases
 #
 
-alias tmuxa="tmux $_tmux_iterm_integration new-session -A"
-alias tmuxl='tmux list-sessions'
+if ! zstyle -t ':prezto:module:tmux:alias' skip; then
+  alias tmuxa="tmux $_tmux_iterm_integration new-session -A"
+  alias tmuxl='tmux list-sessions'
+fi
diff --git a/modules/utility/README.md b/modules/utility/README.md
index 84e81f5c..78a75556 100644
--- a/modules/utility/README.md
+++ b/modules/utility/README.md
@@ -1,178 +1,224 @@
-Utility
-=======
+# Utility
 
 Defines general aliases and functions.
 
-Settings
---------
+This module must be loaded _before_ the [_`completion`_][1] module so that the
+provided completion definitions are loaded automatically by _`completion`_
+module.
+
+**Note:** Some of the utilities configured in this module might be provided via
+GNU utilities with incompatible arguments on non-GNU systems. In such cases,
+using [_`gnu-utility`_][2] module is recommended and it must be loaded
+_before_ this module.
+
+To elaborate, the relative order of loading the modules would be
+_`gnu-utility`_, _`utility`_ and _`completion`_.
+
+## Settings
 
 ### Highlighting
 
-If you have enabled color globally in *zpreztorc*, you may disable it for certain
-commands.
+If you have enabled color globally in _`${ZDOTDIR:-$HOME}/.zpreztorc`_, you may
+disable it selectively for certain commands.
 
-To disable `ls` color, add the following line to *zpreztorc*; when coloring is
-disabled, type indicators (\*, /, =>, @, =, |, %) will be appended to entries.
+To disable `ls` color, add the following to _`${ZDOTDIR:-$HOME}/.zpreztorc`_.
+When coloring is disabled, type indicators (`\*`, `/`, `=>`, `@`, `=`, `|`, `%`)
+will be appended to entries.
 
 ```sh
 zstyle ':prezto:module:utility:ls' color 'no'
 ```
 
-To disable `diff` highlighting, add the following line to *zpreztorc*:
+To disable GNU coreutils `ls` to list directories grouped first, add the
+following line to _`${ZDOTDIR:-$HOME}/.zpreztorc`_:
+
+```sh
+zstyle ':prezto:module:utility:ls' dirs-first 'no'
+```
+
+To disable `grep` highlighting, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
+
+```sh
+zstyle ':prezto:module:utility:grep' color 'no'
+```
+
+To disable `diff` highlighting, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:utility:diff' color 'no'
 ```
 
-To disable `wdiff` highlighting, add the following line to *zpreztorc*:
+To disable `wdiff` highlighting, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:utility:wdiff' color 'no'
 ```
 
-To disable `make` highlighting, add the following line to *zpreztorc*:
+To disable `make` highlighting, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
 ```sh
 zstyle ':prezto:module:utility:make' color 'no'
 ```
 
-Aliases
--------
+### Download Helper
+
+To configure the download helper to be used with alias `get`, add the following
+to _`${ZDOTDIR:-$HOME}/.zpreztorc`_, and replace `'<helper>'` with `'curl'`,
+`'wget'` or `'aria2c'`.
+
+```sh
+zstyle -s ':prezto:module:utility:download' helper '<helper>'
+```
+
+## Aliases
 
 ### Disabled Spelling Correction
 
-  - `ack`
-  - `cd`
-  - `cp`
-  - `ebuild`
-  - `gcc`
-  - `gist`
-  - `grep`
-  - `heroku`
-  - `ln`
-  - `man`
-  - `mkdir`
-  - `mv`
-  - `mysql`
-  - `rm`
+- `ack`
+- `cd`
+- `cp`
+- `ebuild`
+- `gcc`
+- `gist`
+- `grep`
+- `heroku`
+- `ln`
+- `man`
+- `mkdir`
+- `mv`
+- `mysql`
+- `rm`
+
+To disable all spelling corrections, add the following line to
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
+
+```sh
+zstyle ':prezto:module:utility' correct 'no'
+```
 
 ### Disabled File Globbing
 
-  - `bower`
-  - `fc`
-  - `find`
-  - `ftp`
-  - `history`
-  - `locate`
-  - `rake`
-  - `rsync` (selectively enabled for local files)
-  - `scp` (selectively enabled for local files)
-  - `sftp`
+- `bower`
+- `fc`
+- `find`
+- `ftp`
+- `history`
+- `locate`
+- `rake`
+- `rsync` (selectively enabled for local files)
+- `scp` (selectively enabled for local files)
+- `sftp`
 
 ### General
 
-  - `_` executes a command as another user (`sudo`).
-  - `b` opens the default web browser.
-  - `diffu` shorthand for `diff --unified`
-  - `e` opens the default editor.
-  - `mkdir` creates directories, including intermediary directories.
-  - `p` opens the default pager.
-  - `po` removes a directory from the stack and changes to it (`popd`).
-  - `pu` changes the directory and pushes the old directory onto the stack
-    (`pushd`).
-  - `sa` search aliases for a word.
-  - `type` displays all the attribute values of a shell parameter.
+- `_` executes a command as another user (`sudo`).
+- `b` opens the default web browser.
+- `diffu` shorthand for `diff --unified`.
+- `e` opens the default editor.
+- `mkdir` creates directories, including intermediary directories.
+- `p` opens the default pager.
+- `po` removes a directory from the stack and changes to it (`popd`).
+- `pu` changes the directory and pushes the old directory onto the stack
+  (`pushd`).
+- `sa` search aliases for a word.
+- `type` displays all the attribute values of a shell parameter.
 
 ### Files and Directories
 
-  - `ls` lists with directories grouped first (GNU only).
-  - `l`  lists in one column, hidden files.
-  - `ll` lists human readable sizes.
-  - `lr` lists human readable sizes, recursively.
-  - `la` lists human readable sizes, hidden files.
-  - `lm` lists human readable sizes, hidden files through pager.
-  - `lx` lists sorted by extension (GNU only).
-  - `lk` lists sorted by size, largest last.
-  - `lt` lists sorted by date, most recent last.
-  - `lc` lists sorted by date, most recent last, shows change time.
-  - `lu` lists sorted by date, most recent last, shows access time.
-  - `sl` lists directory contents (`ls`).
+- `ls` lists with directories grouped first (GNU only).
+- `l` lists in one column, hidden files.
+- `ll` lists human readable sizes.
+- `lr` lists human readable sizes, recursively.
+- `la` lists human readable sizes, hidden files.
+- `lm` lists human readable sizes, hidden files through pager.
+- `lx` lists sorted by extension (GNU only).
+- `lk` lists sorted by size, largest last.
+- `lt` lists sorted by date, most recent last.
+- `lc` lists sorted by date, most recent last, shows change time.
+- `lu` lists sorted by date, most recent last, shows access time.
 
 ### macOS Everywhere
 
-  - `o` opens files and directories (`open` or `xdg-open`).
-  - `get` downloads files (`curl` or `wget`).
-  - `pbcopy` copies to the pasteboard (`pbcopy`, `xclip` or `xsel`).
-  - `pbpaste` pastes from the pasteboard (`pbcopy`, `xclip` or `xsel`).
-  - `pbc` copies to the pasteboard (`pbcopy`).
-  - `pbp` pastes from the pasteboard (`pbpaste`).
+- `o` opens files and directories (`open` or `xdg-open`).
+- `get` downloads files (`curl`, `wget` or `aria2c`).
+- `pbcopy` copies to the pasteboard (`pbcopy`, `xclip` or `xsel`).
+- `pbpaste` pastes from the pasteboard (`pbcopy`, `xclip` or `xsel`).
+- `pbc` copies to the pasteboard (`pbcopy`).
+- `pbp` pastes from the pasteboard (`pbpaste`).
 
 ### Resource Usage
 
-  - `df` displays free disk space using human readable units (aliases to `pydf`, if installed).
-  - `du` displays disk usage using human readable units.
-  - `top` displays information about processes.
-  - `topc` displays information about processes sorted by CPU usage.
-  - `topm` displays information about processes sorted by RAM usage.
+- `df` displays free disk space using human readable units (aliases to `pydf`,
+  if installed).
+- `du` displays disk usage using human readable units.
+- `top` displays information about processes.
+- `topc` displays information about processes sorted by CPU usage.
+- `topm` displays information about processes sorted by RAM usage.
 
 ### Safe ops
 
 By default, `cp`,`ln`, `mv` and `rm` are aliased to their interactive variants.
 If this is not desired, it can be disabled by adding the following line to
-*zpreztorc*:
+_`${ZDOTDIR:-$HOME}/.zpreztorc`_:
 
-    zstyle ':prezto:module:utility' safe-ops 'no'.
+```sh
+zstyle ':prezto:module:utility' safe-ops 'no'.
+```
 
 In addition, the following aliases have been added:
 
-  - `cpi` copies files and directories interactively.
-  - `lni` links files and directories interactively.
-  - `mvi` moves files and directories interactively.
-  - `rmi` removes files and directories interactively.
+- `cpi` copies files and directories interactively.
+- `lni` links files and directories interactively.
+- `mvi` moves files and directories interactively.
+- `rmi` removes files and directories interactively.
 
 ### Miscellaneous
 
-  - `http-serve` serves a directory via HTTP.
+- `http-serve` serves a directory via HTTP.
 
-Functions
----------
+## Functions
 
 ### General
 
-  - `slit` prints columns *1, 2, 3 ... n*.
+- `slit` prints columns _1, 2, 3 ... n_.
 
 ### Files and Directories
 
-  - `cdls` changes to a directory and lists its contents.
-  - `dut` displays the grand total disk usage using human readable units.
-  - `find-exec` finds files and executes a command on them.
-  - `mkdcd` makes a directory and changes to it.
-  - `popdls` pops an entry off the directory stack and lists its contents.
-  - `pushdls` pushes an entry onto the directory stack and lists its contents.
-  - `noremoteglob` enable local path globbing but disable remote path globbing.
+- `cdls` changes to a directory and lists its contents.
+- `dut` displays the grand total disk usage using human readable units.
+- `find-exec` finds files and executes a command on them.
+- `mkdcd` makes a directory and changes to it.
+- `popdls` pops an entry off the directory stack and lists its contents.
+- `pushdls` pushes an entry onto the directory stack and lists its contents.
+- `noremoteglob` enable local path globbing but disable remote path globbing.
 
 ### Developer
 
-  - `diff` highlights diff output (requires `colordiff`).
-  - `make` highlights make output (requires `colormake`).
-  - `wdiff` highlights wdiff output (requires `wdiff `or `Git`).
+- `diff` highlights diff output (requires `colordiff`).
+- `make` highlights make output (requires `colormake`).
+- `wdiff` highlights wdiff output (requires `wdiff` or `git`).
 
 ### Resource usage
 
-  - `psu` displays user owned processes status.
+- `psu` displays user owned processes status.
 
 ### Search and Replace
 
-  - `prep` provides a grep-like pattern search.
-  - `psub` provides a sed-like pattern substitution.
+- `prep` provides a grep-like pattern search.
+- `psub` provides a sed-like pattern substitution.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][1].*
+_The authors of this module should be contacted via the [issue tracker][3]._
 
-  - [Robby Russell](https://github.com/robbyrussell)
-  - [Suraj N. Kurapati](https://github.com/sunaku)
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Robby Russell](https://github.com/robbyrussell)
+- [Suraj N. Kurapati](https://github.com/sunaku)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
-[1]: https://github.com/sorin-ionescu/prezto/issues
+[1]: ../completion#readme
+[2]: ../gnu-utility#readme
+[3]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/utility/functions/diff b/modules/utility/functions/diff
index d614b28b..2e812f2f 100644
--- a/modules/utility/functions/diff
+++ b/modules/utility/functions/diff
@@ -5,13 +5,13 @@
 #   Sorin Ionescu <sorin.ionescu@gmail.com>
 #
 
-function diff {
-  if zstyle -t ':prezto:module:utility:diff' color \
-    && (( $+commands[colordiff] )); then
-      command colordiff "$@"
-  else
-    command diff "$@"
-  fi
-}
+# function diff {
 
-diff "$@"
+if zstyle -t ':prezto:module:utility:diff' color \
+      && (( $+commands[colordiff] )); then
+  command diff "$@" | colordiff
+else
+  command diff "$@"
+fi
+
+# }
diff --git a/modules/utility/functions/dut b/modules/utility/functions/dut
index 65922805..14741978 100644
--- a/modules/utility/functions/dut
+++ b/modules/utility/functions/dut
@@ -6,22 +6,22 @@
 #   Sorin Ionescu <sorin.ionescu@gmail.com>
 #
 
-function dut {
-  (( $# == 0 )) && set -- *
+# function dut {
 
-  if grep -q -i 'GNU' < <(du --version 2>&1); then
-    du -khsc "$@" | sort -h -r
-  else
-    local line size name
-    local -a record
+(( $# == 0 )) && set -- *
 
-    while IFS=$'\n' read line; do
-      record=(${(z)line})
-      size="$(($record[1] / 1024.0))"
-      name="$record[2,-1]"
-      printf "%9.1LfM    %s\n" "$size" "$name"
-    done < <(du -kcs "$@") | sort -n -r
-  fi
-}
+if [[ ${(@M)${(f)"$(du --version 2>&1)"}:#*GNU *} ]]; then
+  du -khsc "$@" | sort -h -r
+else
+  local line size name
+  local -a record
 
-dut "$@"
+  while IFS=$'\n' read line; do
+    record=(${(z)line})
+    size="$(($record[1] / 1024.0))"
+    name="$record[2,-1]"
+    printf "%9.1LfM    %s\n" "$size" "$name"
+  done < <(du -kcs "$@") | sort -n -r
+fi
+
+# }
diff --git a/modules/utility/functions/make b/modules/utility/functions/make
index 5ebab057..7cda8a62 100644
--- a/modules/utility/functions/make
+++ b/modules/utility/functions/make
@@ -5,16 +5,13 @@
 #   Sorin Ionescu <sorin.ionescu@gmail.com>
 #
 
-function make {
-  if zstyle -t ':prezto:module:utility:make' color; then
-    if (( $+commands[colormake] )); then
-      colormake "$@"
-    else
-      command make "$@"
-    fi
-  else
-    command make "$@"
-  fi
-}
+# function make {
 
-make "$@"
+if zstyle -t ':prezto:module:utility:make' color \
+      && (( $+commands[colormake] )); then
+  command colormake "$@"
+else
+  command make "$@"
+fi
+
+# }
diff --git a/modules/utility/functions/wdiff b/modules/utility/functions/wdiff
index ebfad0b8..f1de6598 100644
--- a/modules/utility/functions/wdiff
+++ b/modules/utility/functions/wdiff
@@ -3,27 +3,30 @@
 #
 # Authors:
 #   Sorin Ionescu <sorin.ionescu@gmail.com>
+#   Indrajit Raychaudhuri <irc@indrajit.com>
 #
 
-function wdiff {
-  if zstyle -t ':prezto:module:utility:wdiff' color; then
-    if (( $+commands[wdiff] )); then
-      command wdiff \
-        --avoid-wraps \
-        --start-delete="$(print -n $FG[red])" \
-        --end-delete="$(print -n $FG[none])" \
-        --start-insert="$(print -n $FG[green])" \
-        --end-insert="$(print -n $FG[none])" \
-        "$@" \
+# function wdiff {
+
+if zstyle -t ':prezto:module:utility:wdiff' color; then
+  if (( $+commands[wdiff] )); then
+    command wdiff \
+          --avoid-wraps \
+          --start-delete="$(print -n $FG[red])" \
+          --end-delete="$(print -n $FG[none])" \
+          --start-insert="$(print -n $FG[green])" \
+          --end-insert="$(print -n $FG[none])" \
+          "$@" \
       | sed 's/^\(@@\( [+-][[:digit:]]*,[[:digit:]]*\)\{2\} @@\)$/;5;6m\10m/g'
-    elif (( $+commands[git] )); then
-      command git --no-pager diff --color=auto --no-ext-diff --no-index --color-words "$@"
-    else
-      command wdiff "$@"
-    fi
+  elif (( $+commands[git] )); then
+    command git --no-pager diff --no-ext-diff --no-index --color=auto --color-words "$@"
   else
     command wdiff "$@"
   fi
-}
+elif (( ! $+commands[wdiff] && $+commands[git] )); then
+    command git --no-pager diff --no-ext-diff --no-index --color=never "$@"
+else
+  command wdiff "$@"
+fi
 
-wdiff "$@"
+# }
diff --git a/modules/utility/init.zsh b/modules/utility/init.zsh
index 942090d7..5b4bf80e 100644
--- a/modules/utility/init.zsh
+++ b/modules/utility/init.zsh
@@ -11,7 +11,12 @@
 pmodload 'helper' 'spectrum'
 
 # Correct commands.
-setopt CORRECT
+if zstyle -T ':prezto:module:utility' correct; then
+  setopt CORRECT
+fi
+
+# Load 'run-help' function.
+autoload -Uz run-help-{ip,openssl,sudo}
 
 #
 # Aliases
@@ -59,29 +64,33 @@ alias sa='alias | grep -i'
 alias type='type -a'
 
 # Safe ops. Ask the user before doing anything destructive.
-alias rmi="${aliases[rm]:-rm} -i"
-alias mvi="${aliases[mv]:-mv} -i"
 alias cpi="${aliases[cp]:-cp} -i"
 alias lni="${aliases[ln]:-ln} -i"
+alias mvi="${aliases[mv]:-mv} -i"
+alias rmi="${aliases[rm]:-rm} -i"
 if zstyle -T ':prezto:module:utility' safe-ops; then
-  alias rm='rmi'
-  alias mv='mvi'
-  alias cp='cpi'
-  alias ln='lni'
+  alias cp="${aliases[cp]:-cp} -i"
+  alias ln="${aliases[ln]:-ln} -i"
+  alias mv="${aliases[mv]:-mv} -i"
+  alias rm="${aliases[rm]:-rm} -i"
 fi
 
 # ls
-if is-callable 'dircolors'; then
+if [[ ${(@M)${(f)"$(ls --version 2>&1)"}:#*(GNU|lsd) *} ]]; then
   # GNU Core Utilities
-  alias ls='ls --group-directories-first'
+
+  if zstyle -T ':prezto:module:utility:ls' dirs-first; then
+    alias ls="${aliases[ls]:-ls} --group-directories-first"
+  fi
 
   if zstyle -t ':prezto:module:utility:ls' color; then
-    # Call dircolors to define colors if they're missing
-    if [[ -z "$LS_COLORS" ]]; then
-      if [[ -s "$HOME/.dir_colors" ]]; then
-        eval "$(dircolors --sh "$HOME/.dir_colors")"
+    # Define colors for GNU ls if they're not already defined
+    if (( ! $+LS_COLORS )); then
+      # Try dircolors when available
+      if is-callable 'dircolors'; then
+        eval "$(dircolors --sh $HOME/.dir_colors(N))"
       else
-        eval "$(dircolors --sh)"
+        export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=36;01:cd=33;01:su=31;40;07:sg=36;40;07:tw=32;40;07:ow=33;40;07:'
       fi
     fi
 
@@ -91,17 +100,13 @@ if is-callable 'dircolors'; then
   fi
 else
   # BSD Core Utilities
+
   if zstyle -t ':prezto:module:utility:ls' color; then
     # Define colors for BSD ls if they're not already defined
-    if [[ -z "$LSCOLORS" ]]; then
+    if (( ! $+LSCOLORS )); then
       export LSCOLORS='exfxcxdxbxGxDxabagacad'
     fi
 
-    # Define colors for the completion system if they're not already defined
-    if [[ -z "$LS_COLORS" ]]; then
-      export LS_COLORS='di=34:ln=35:so=32:pi=33:ex=31:bd=36;01:cd=33;01:su=31;40;07:sg=36;40;07:tw=32;40;07:ow=33;40;07:'
-    fi
-
     alias ls="${aliases[ls]:-ls} -G"
   else
     alias ls="${aliases[ls]:-ls} -F"
@@ -113,28 +118,34 @@ alias ll='ls -lh'        # Lists human readable sizes.
 alias lr='ll -R'         # Lists human readable sizes, recursively.
 alias la='ll -A'         # Lists human readable sizes, hidden files.
 alias lm='la | "$PAGER"' # Lists human readable sizes, hidden files through pager.
-alias lx='ll -XB'        # Lists sorted by extension (GNU only).
 alias lk='ll -Sr'        # Lists sorted by size, largest last.
 alias lt='ll -tr'        # Lists sorted by date, most recent last.
 alias lc='lt -c'         # Lists sorted by date, most recent last, shows change time.
 alias lu='lt -u'         # Lists sorted by date, most recent last, shows access time.
-alias sl='ls'            # I often screw this up.
+
+if [[ ${(@M)${(f)"$(ls --version 2>&1)"}:#*GNU *} ]]; then
+  alias lx='ll -XB'      # Lists sorted by extension (GNU only).
+fi
 
 # Grep
 if zstyle -t ':prezto:module:utility:grep' color; then
-  export GREP_COLOR='37;45'           # BSD.
-  export GREP_COLORS="mt=$GREP_COLOR" # GNU.
+  export GREP_COLOR=${GREP_COLOR:-'37;45'}            # BSD.
+  export GREP_COLORS=${GREP_COLORS:-"mt=$GREP_COLOR"} # GNU.
 
   alias grep="${aliases[grep]:-grep} --color=auto"
 fi
 
 # macOS Everywhere
-if [[ "$OSTYPE" == darwin* ]]; then
+if is-darwin; then
   alias o='open'
-elif [[ "$OSTYPE" == cygwin* ]]; then
+elif is-cygwin; then
   alias o='cygstart'
   alias pbcopy='tee > /dev/clipboard'
   alias pbpaste='cat /dev/clipboard'
+elif is-termux; then
+  alias o='termux-open'
+  alias pbcopy='termux-clipboard-set'
+  alias pbpaste='termux-clipboard-get'
 else
   alias o='xdg-open'
 
@@ -151,17 +162,27 @@ alias pbc='pbcopy'
 alias pbp='pbpaste'
 
 # File Download
-if (( $+commands[curl] )); then
-  alias get='curl --continue-at - --location --progress-bar --remote-name --remote-time'
-elif (( $+commands[wget] )); then
-  alias get='wget --continue --progress=bar --timestamping'
+zstyle -s ':prezto:module:utility:download' helper '_download_helper' || _download_helper='curl'
+
+typeset -A _download_helpers=(
+  aria2c  'aria2c --continue --remote-time --max-tries=0'
+  curl    'curl --continue-at - --location --progress-bar --remote-name --remote-time'
+  wget    'wget --continue --progress=bar --timestamping'
+)
+
+if (( $+commands[$_download_helper] && $+_download_helpers[$_download_helper] )); then
+  alias get="$_download_helpers[$_download_helper]"
+elif (( $+commands[curl] )); then
+  alias get="$_download_helpers[curl]"
 fi
 
+unset _download_helper{,s}
+
 # Resource Usage
 alias df='df -kh'
 alias du='du -kh'
 
-if [[ "$OSTYPE" == (darwin*|*bsd*) ]]; then
+if is-darwin || is-bsd; then
   alias topc='top -o cpu'
   alias topm='top -o vsize'
 else
@@ -172,10 +193,17 @@ fi
 # Miscellaneous
 
 # Serves a directory via HTTP.
-if (( $+commands[python3] )); then
-  alias http-serve='python3 -m http.server'
-else
-  alias http-serve='python -m SimpleHTTPServer'
+if (( $#commands[(i)python(|[23])] )); then
+  autoload -Uz is-at-least
+  if (( $+commands[python3] )); then
+    alias http-serve='python3 -m http.server'
+  elif (( $+commands[python2] )); then
+    alias http-serve='python2 -m SimpleHTTPServer'
+  elif is-at-least 3 ${"$(python --version 2>&1)"[(w)2]}; then
+    alias http-serve='python -m http.server'
+  else
+    alias http-serve='python -m SimpleHTTPServer'
+  fi
 fi
 
 #
diff --git a/modules/wakeonlan/README.md b/modules/wakeonlan/README.md
index dacfa52d..ca4095ae 100644
--- a/modules/wakeonlan/README.md
+++ b/modules/wakeonlan/README.md
@@ -1,18 +1,16 @@
-Wake-on-LAN
-===========
+# Wake-on-LAN
 
 This module provides a wrapper around the [wakeonlan][1] tool.
 
-Usage
------
+## Usage
 
-To use this wrapper, create the *~/.wakeonlan* directory, and place in it one
+To use this wrapper, create the _`~/.wakeonlan`_ directory, and place in it one
 file for each device you would like to be able to wake. Give the file a name
 that describes the device, such as its hostname.
 
 Each file should contain a line with the MAC address of the target device and
 the network broadcast address. For instance, there might be a file
-*~/.wakeonlan/leto* with the following contents:
+_`~/.wakeonlan/leto`_ with the following contents:
 
 ```conf
 00:11:22:33:44:55:66 192.168.0.255
@@ -20,21 +18,20 @@ the network broadcast address. For instance, there might be a file
 
 To wake that device, use the following command:
 
-```sh
-$ wake leto
+```console
+wake leto
 ```
 
 For more information on the configuration file format, read the
 [wakeonlan man page][2].
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via [issue tracker][3].*
+_The authors of this module should be contacted via [issue tracker][3]._
 
-  - [Paul Dann](https://github.com/giddie)
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Paul Dann](https://github.com/giddie)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
 [1]: http://gsd.di.uminho.pt/jpo/software/wakeonlan/
-[2]: http://man.cx/wakeonlan
+[2]: https://man.cx/wakeonlan
 [3]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/modules/yum/README.md b/modules/yum/README.md
index fa944da8..850b1c1e 100644
--- a/modules/yum/README.md
+++ b/modules/yum/README.md
@@ -1,28 +1,25 @@
-Yum
-===
+# Yum
 
-Defines [yum][1] aliases.
+Defines [_yum_][1] aliases.
 
-Aliases
--------
+## Aliases
 
-  - `yumc` removes package(s) and leaves.
-  - `yumi` installs package(s).
-  - `yumh` displays history.
-  - `yuml` lists packages.
-  - `yumL` lists installed packages.
-  - `yumq` displays package information.
-  - `yumr` removes package(s).
-  - `yums` searches for a package.
-  - `yumu` updates packages.
-  - `yumU` upgrades packages.
+- `yumc` removes package(s) and leaves.
+- `yumi` installs package(s).
+- `yumh` displays history.
+- `yuml` lists packages.
+- `yumL` lists installed packages.
+- `yumq` displays package information.
+- `yumr` removes package(s).
+- `yums` searches for a package.
+- `yumu` updates packages.
+- `yumU` upgrades packages.
 
-Authors
--------
+## Authors
 
-*The authors of this module should be contacted via the [issue tracker][2].*
+_The authors of this module should be contacted via the [issue tracker][2]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
 [1]: http://yum.baseurl.org
 [2]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/runcoms/README.md b/runcoms/README.md
index 9df890e5..39feb7d8 100644
--- a/runcoms/README.md
+++ b/runcoms/README.md
@@ -1,34 +1,32 @@
-Configuration Files
-===================
+# Configuration Files
 
 Zsh has several system-wide and user-local configuration files.
 
-Prezto has one user-local configuration file.
+Additionally, Prezto has one user-local configuration file.
 
 System-wide configuration files are installation-dependent but are installed
-in */etc* by default.
+in _`/etc`_ by default.
 
 User-local configuration files have the same name as their global counterparts
 but are prefixed with a dot (hidden). Zsh looks for these files in the path
-stored in the `$ZDOTDIR` environmental variable. However, if said variable is
+stored in the `$ZDOTDIR` environment variable. However, if said variable is
 not defined, Zsh will use the user's home directory.
 
-File Descriptions
------------------
+## File Descriptions
 
-The configuration files are read in the following order:
+The [configuration files][1] are read in the following order:
 
-  01. /etc/zshenv
-  02. ~/.zshenv
-  03. /etc/zprofile
-  04. ~/.zprofile
-  05. /etc/zshrc
-  06. ~/.zshrc
-  07. ~/.zpreztorc
-  08. /etc/zlogin
-  09. ~/.zlogin
-  10. ~/.zlogout
-  11. /etc/zlogout
+1.  _`/etc/zshenv`_
+2.  _`${ZDOTDIR:-$HOME}/.zshenv`_
+3.  _`/etc/zprofile`_
+4.  _`${ZDOTDIR:-$HOME}/.zprofile`_
+5.  _`/etc/zshrc`_
+6.  _`${ZDOTDIR:-$HOME}/.zshrc`_
+7.  _`${ZDOTDIR:-$HOME}/.zpreztorc`_
+8.  _`/etc/zlogin`_
+9.  _`${ZDOTDIR:-$HOME}/.zlogin`_
+10. _`${ZDOTDIR:-$HOME}/.zlogout`_
+11. _`/etc/zlogout`_
 
 ### zshenv
 
@@ -37,16 +35,16 @@ small as possible and should only define environment variables.
 
 ### zprofile
 
-This file is similar to zlogin, but it is sourced before zshrc. It was added
-for [KornShell][1] fans. See the description of zlogin below for what it may
+This file is similar to _zlogin_, but it is sourced before _zshrc_. It was added
+for [KornShell][2] fans. See the description of _zlogin_ below for what it may
 contain.
 
-zprofile and zlogin are not meant to be used concurrently but can be done so.
+_zprofile_ and _zlogin_ are not meant to be used together but can be done so.
 
 ### zshrc
 
-This file is sourced by interactive shells. It should define aliases,
-functions, shell options, and key bindings.
+This file is sourced by interactive shells. It should define aliases, functions,
+shell options, and key bindings.
 
 ### zpreztorc
 
@@ -54,9 +52,9 @@ This file configures Prezto.
 
 ### zlogin
 
-This file is sourced by login shells after zshrc, and thus, it should contain
+This file is sourced by login shells after _zshrc_. Thus, it should contain
 commands that need to execute at login. It is usually used for messages such as
-[fortune][2], [msgs][3], or for the creation of files.
+[_`fortune`_][3], [_`msgs`_][4], or for the creation of files.
 
 This is not the file to define aliases, functions, shell options, and key
 bindings. It should not change the shell environment.
@@ -64,16 +62,16 @@ bindings. It should not change the shell environment.
 ### zlogout
 
 This file is sourced by login shells during logout. It should be used for
-displaying messages and the deletion of files.
+displaying messages and for deletion of files.
 
-Authors
--------
+## Authors
 
-*The authors of these files should be contacted via the [issue tracker][4].*
+_The authors of these files should be contacted via the [issue tracker][5]._
 
-  - [Sorin Ionescu](https://github.com/sorin-ionescu)
+- [Sorin Ionescu](https://github.com/sorin-ionescu)
 
-[1]: http://www.kornshell.com
-[2]: http://en.wikipedia.org/wiki/Fortune_(Unix)
-[3]: http://www.manpagez.com/man/1/msgs
-[4]: https://github.com/sorin-ionescu/prezto/issues
+[1]: http://zsh.sourceforge.net/Intro/intro_3.html#SEC3
+[2]: https://www.kornshell.com
+[3]: https://en.wikipedia.org/wiki/Fortune_(Unix)
+[4]: https://www.manpagez.com/man/1/msgs
+[5]: https://github.com/sorin-ionescu/prezto/issues
diff --git a/runcoms/zlogin b/runcoms/zlogin
index 16fae45e..2f834353 100644
--- a/runcoms/zlogin
+++ b/runcoms/zlogin
@@ -8,14 +8,17 @@
 # Execute code that does not affect the current session in the background.
 {
   # Compile the completion dump to increase startup speed.
-  zcompdump="${ZDOTDIR:-$HOME}/.zcompdump"
+  zcompdump="${XDG_CACHE_HOME:-$HOME/.cache}/prezto/zcompdump"
   if [[ -s "$zcompdump" && (! -s "${zcompdump}.zwc" || "$zcompdump" -nt "${zcompdump}.zwc") ]]; then
-    zcompile "$zcompdump"
+    if command mkdir "${zcompdump}.zwc.lock" 2>/dev/null; then
+      zcompile "$zcompdump"
+      command rmdir  "${zcompdump}.zwc.lock" 2>/dev/null
+    fi
   fi
 } &!
 
 # Execute code only if STDERR is bound to a TTY.
-[[ -o INTERACTIVE && -t 2 ]] && {
+if [[ -o INTERACTIVE && -t 2 ]]; then
 
   # Print a random, hopefully interesting, adage.
   if (( $+commands[fortune] )); then
@@ -23,4 +26,4 @@
     print
   fi
 
-} >&2
+fi >&2
diff --git a/runcoms/zpreztorc b/runcoms/zpreztorc
index 7d738d6e..62f7ddc9 100644
--- a/runcoms/zpreztorc
+++ b/runcoms/zpreztorc
@@ -18,6 +18,9 @@ zstyle ':prezto:*:*' color 'yes'
 # Add additional directories to load prezto modules from
 # zstyle ':prezto:load' pmodule-dirs $HOME/.zprezto-contrib
 
+# Allow module overrides when pmodule-dirs causes module name collisions
+# zstyle ':prezto:load' pmodule-allow-overrides 'yes'
+
 # Set the Zsh modules to load (man zshmodules).
 # zstyle ':prezto:load' zmodule 'attr' 'stat'
 
@@ -52,7 +55,7 @@ zstyle ':prezto:load' pmodule \
 # Completions
 #
 
-# Set the entries to ignore in static */etc/hosts* for host completion.
+# Set the entries to ignore in static '/etc/hosts' for host completion.
 # zstyle ':prezto:module:completion:*:hosts' etc-host-ignores \
 #   '0.0.0.0' '127.0.0.1'
 
@@ -60,6 +63,9 @@ zstyle ':prezto:load' pmodule \
 # Editor
 #
 
+# Set the characters that are considered to be part of a word.
+# zstyle ':prezto:module:editor' wordchars '*?_-.[]~&;!#$%^(){}<>'
+
 # Set the key mapping style to 'emacs' or 'vi'.
 zstyle ':prezto:module:editor' key-bindings 'vi'
 
@@ -83,6 +89,19 @@ zstyle ':prezto:module:editor' key-bindings 'vi'
 # Set the command prefix on non-GNU systems.
 # zstyle ':prezto:module:gnu-utility' prefix 'g'
 
+#
+# History
+#
+
+# Set the file to save the history in when an interactive shell exits.
+# zstyle ':prezto:module:history' histfile "${ZDOTDIR:-$HOME}/.zsh_history"
+
+# Set the maximum  number  of  events  stored  in  the  internal history list.
+# zstyle ':prezto:module:history' histsize 10000
+
+# Set the maximum number of history events to save in the history file.
+# zstyle ':prezto:module:history' savehist 10000
+
 #
 # History Substring Search
 #
@@ -96,6 +115,18 @@ zstyle ':prezto:module:editor' key-bindings 'vi'
 # Set the search globbing flags.
 # zstyle ':prezto:module:history-substring-search' globbing-flags ''
 
+# Enable search case-sensitivity.
+# zstyle ':prezto:module:history-substring-search' case-sensitive 'yes'
+
+# Enable search for fuzzy matches.
+# zstyle ':prezto:module:history-substring-search' fuzzy 'yes'
+
+# Enable search uniqueness.
+# zstyle ':prezto:module:history-substring-search' unique 'yes'
+
+# Enable prefixed search.
+# zstyle ':prezto:module:history-substring-search' prefixed 'yes'
+
 #
 # macOS
 #
@@ -129,13 +160,6 @@ zstyle ':prezto:module:prompt' theme 'paradox'
 # return codes. This is not supported by all prompts.
 # zstyle ':prezto:module:prompt' show-return-val 'yes'
 
-#
-# Ruby
-#
-
-# Auto switch the Ruby version on directory change.
-# zstyle ':prezto:module:ruby:chruby' auto-switch 'yes'
-
 #
 # Python
 #
@@ -146,6 +170,13 @@ zstyle ':prezto:module:prompt' theme 'paradox'
 # Automatically initialize virtualenvwrapper if pre-requisites are met.
 # zstyle ':prezto:module:python:virtualenv' initialize 'yes'
 
+#
+# Ruby
+#
+
+# Auto switch the Ruby version on directory change.
+# zstyle ':prezto:module:ruby:chruby' auto-switch 'yes'
+
 #
 # Screen
 #
diff --git a/runcoms/zprofile b/runcoms/zprofile
index acd77425..d2acd311 100644
--- a/runcoms/zprofile
+++ b/runcoms/zprofile
@@ -9,7 +9,7 @@
 # Browser
 #
 
-if [[ "$OSTYPE" == darwin* ]]; then
+if [[ -z "$BROWSER" && "$OSTYPE" == darwin* ]]; then
   export BROWSER='open'
 fi
 
@@ -17,9 +17,15 @@ fi
 # Editors
 #
 
-export EDITOR='nano'
-export VISUAL='nano'
-export PAGER='less'
+if [[ -z "$EDITOR" ]]; then
+  export EDITOR='nano'
+fi
+if [[ -z "$VISUAL" ]]; then
+  export VISUAL='nano'
+fi
+if [[ -z "$PAGER" ]]; then
+  export PAGER='less'
+fi
 
 #
 # Language
@@ -43,7 +49,9 @@ typeset -gU cdpath fpath mailpath path
 
 # Set the list of directories that Zsh searches for programs.
 path=(
-  /usr/local/{bin,sbin}
+  $HOME/{,s}bin(N)
+  /opt/{homebrew,local}/{,s}bin(N)
+  /usr/local/{,s}bin(N)
   $path
 )
 
@@ -53,11 +61,13 @@ path=(
 
 # Set the default Less options.
 # Mouse-wheel scrolling has been disabled by -X (disable screen clearing).
-# Remove -X and -F (exit if the content fits on one screen) to enable it.
-export LESS='-F -g -i -M -R -S -w -X -z-4'
+# Remove -X to enable it.
+if [[ -z "$LESS" ]]; then
+  export LESS='-g -i -M -R -S -w -X -z-4'
+fi
 
 # Set the Less input preprocessor.
 # Try both `lesspipe` and `lesspipe.sh` as either might exist on a system.
-if (( $#commands[(i)lesspipe(|.sh)] )); then
+if [[ -z "$LESSOPEN" ]] && (( $#commands[(i)lesspipe(|.sh)] )); then
   export LESSOPEN="| /usr/bin/env $commands[(i)lesspipe(|.sh)] %s 2>&-"
 fi