Home

Awesome

<p align="center"> <img alt="Logo" src="images/logo.svg" height="180" /> <h1 align="center">ZPM - Zsh Plugin Manager</h1> <p align="center"> Fastest, configurable and extensible zsh plugin manager </p> <p align="center"> <a href="/LICENSE"> <img alt="Software License" src="https://img.shields.io/github/license/zpm-zsh/zpm?style=flat-square"> </a> <img alt="Travis" src="https://img.shields.io/github/languages/code-size/zpm-zsh/zpm?style=flat-square"> <img alt="Go Report Card" src="https://img.shields.io/github/last-commit/zpm-zsh/zpm?logo=github&style=flat-square"> </p> </p>

Zpm is a plugin manager for ZSH who combines the imperative and declarative approach. At first run, zpm will do complex logic and generate cache, after that will be used cache only, so it makes this framework to be very fast.

<p align="center"> <img src="images/demo.gif" width="100%"> </p>

Features

Table of Contents

Stats

<details> <summary>Test on Intel I7-8750H, SanDisk SD7SN6S, 16GB RAM</summary> <p>
zsh -i -c exit  0.00s user 0.00s system 102% cpu 0.006 total
zsh -i -c exit  0.01s user 0.00s system 101% cpu 0.006 total
zsh -i -c exit  0.00s user 0.01s system 99% cpu 0.006 total
zsh -i -c exit  0.01s user 0.00s system 102% cpu 0.007 total
zsh -i -c exit  0.00s user 0.00s system 100% cpu 0.007 total
zsh -i -c exit  0.01s user 0.00s system 100% cpu 0.007 total
zsh -i -c exit  0.00s user 0.00s system 101% cpu 0.007 total
zsh -i -c exit  0.00s user 0.00s system 100% cpu 0.006 total
zsh -i -c exit  0.00s user 0.00s system 101% cpu 0.007 total
zsh -i -c exit  0.00s user 0.00s system 100% cpu 0.008 total
</p> </details> <details> <summary>Test on Raspberry Pi Zero W, Raspbian 10, 1GHz Broadcom BCM2835 ARMv6, 512MB RAM</summary> <p>
zsh -i -c exit  0.14s user 0.05s system 85% cpu 0.219 total
zsh -i -c exit  0.14s user 0.05s system 43% cpu 0.436 total
zsh -i -c exit  0.14s user 0.05s system 58% cpu 0.325 total
zsh -i -c exit  0.12s user 0.07s system 90% cpu 0.206 total
zsh -i -c exit  0.15s user 0.05s system 84% cpu 0.231 total
zsh -i -c exit  0.15s user 0.04s system 46% cpu 0.407 total
zsh -i -c exit  0.13s user 0.06s system 62% cpu 0.306 total
zsh -i -c exit  0.11s user 0.08s system 83% cpu 0.227 total
zsh -i -c exit  0.14s user 0.05s system 47% cpu 0.403 total
zsh -i -c exit  0.11s user 0.08s system 62% cpu 0.307 total
</p> </details> <details> <summary>Test on MikroTik RouterBOARD 951Ui-2HnD, OpenWrt 19.07.7, 600MHz Atheros AR9344 MIPS, 128MB RAM</summary> <p>
zsh -i -c exit  0.09s user 0.03s system 83% cpu 0.144 total
zsh -i -c exit  0.10s user 0.02s system 29% cpu 0.412 total
zsh -i -c exit  0.10s user 0.02s system 69% cpu 0.173 total
zsh -i -c exit  0.10s user 0.03s system 73% cpu 0.165 total
zsh -i -c exit  0.10s user 0.02s system 81% cpu 0.150 total
zsh -i -c exit  0.10s user 0.02s system 71% cpu 0.170 total
zsh -i -c exit  0.10s user 0.02s system 85% cpu 0.141 total
zsh -i -c exit  0.10s user 0.02s system 42% cpu 0.283 total
zsh -i -c exit  0.11s user 0.02s system 68% cpu 0.176 total
zsh -i -c exit  0.10s user 0.02s system 75% cpu 0.161 total
</p> </details> <details> <summary>With this set of plugins. 51 total</summary> <p>
zpm-zsh/helpers
zpm-zsh/colors
zpm-zsh/tmux
zpm-zsh/vte
zpm-zsh/core-config
zpm-zsh/ignored-users
zpm-zsh/check-deps
zpm-zsh/minimal-theme
zpm-zsh/material-colors
zpm-zsh/pr-is-root
zpm-zsh/pr-user
zpm-zsh/pr-return
zpm-zsh/pr-exec-time
zpm-zsh/pretty-time-zsh
zpm-zsh/pr-git
zpm-zsh/pr-cwd
zpm-zsh/pr-php
zpm-zsh/pr-rust
zpm-zsh/pr-node
zpm-zsh/pr-2
zpm-zsh/pr-eol
zpm-zsh/pr-zcalc
zpm-zsh/pr-correct
zpm-zsh/ls
zpm-zsh/colorize
zpm-zsh/ssh
zpm-zsh/dot
zpm-zsh/undollar
zpm-zsh/dropbox
lukechilds/zsh-better-npm-completion
zpm-zsh/clipboard
zpm-zsh/mysql-colorize
zpm-zsh/zshmarks
voronkovich/gitignore.plugin.zsh
zpm-zsh/autoenv
mdumitru/fancy-ctrl-z
zsh-users/zsh-history-substring-search
zdharma/fast-syntax-highlighting
zsh-users/zsh-autosuggestions
psprint/history-search-multi-word
zpm-zsh/zpm-readme
zpm-zsh/zpm-info
zpm-zsh/zpm-telemetry
zpm-zsh/zpm-link
@omz/extract
@omz/command-not-found
@omz/pip
@empty/npm
@empty/rustup
zpm-zsh/create-zsh-plugin
</p> </details>

Base dependences

Installation

Add the following text into .zshrc

if [[ ! -f ~/.zpm/zpm.zsh ]]; then
  git clone --recursive https://github.com/zpm-zsh/zpm ~/.zpm
fi
source ~/.zpm/zpm.zsh

If you don't have .zshrc copy example of .zshrc from zpm

ln -sf ~/.zpm/zshrc ~/.zshrc

How to use

Currently zpm has following commands

The set of commands can be expanded extended using plugins

<details> <summary>Plugins for zpm itself</summary> <p> </p> </details>

Load plugin

Important

Be carefully, zpm doesn't guarantee loading order in call. So if you need to load a plugin before antoher, you should do 2 separate zpm load calls. This is very important for oh-my-zsh plugins, because @omz-core should be loaded before

Plugin name must have next form: @plugin-type/user/plugin-name. This plugin can be enabled using

# Add to `~/.zshrc` after zpm initialization:
zpm load @plugin-type/user/plugin-name

Notice: if you change ~/.zshrc, you need to remove zpm cache using: zpm clean

Additionaly they can have some tags. Tags must be separated by commas , without spaces, tag parameters must be separated from tag names or another tag parameters by :

# plugin type
#    |   plugin name
#    |      |     tag
#    |      |      |  tag parameters,
#    |      |      |  divided by `:`    boolean tag
#    |      |      |         |              |
#    ↓      ↓      ↓         ↓              ↓
@type/some/plugin,apply:source:path:fpath,async

Plugin name

If plugin name starts with @word, this word will be used as plugin type. Plugin name will be used to detect plugin origin url.

plugin-from/github  # @github doesn't necessary
@gitlab/plugin-from/gitlab
@bitbucket/plugin-from/bitbucket
@omz/some-plugin
@empty/custom/empty-plugin
@empty/another-empty-plugin

Plugin tags

apply tag

This tag has 3 possible arguments divided by :

zpm load some/plugin,apply:source:path:fpath
zpm load another/plugin,apply:path # zpm will only add /bin dir to $PATH, plugin will not be sourced, nor be added to $fpath

async tag

If this tag is present, zsh plugin will be loaded async

source tag

Define own file that will be loaded

zpm some/plugin,source:/other.file.zsh

path and fpath tags

Using these tags you can change the destination of folders which will be added to $PATH or $fpath

zpm some/plugin,path:/executables
zpm another/plugin,fpath:/completions

autoload tag

This tag defines functions that will be autoloaded by zpm (using autoload -Uz) divided by :

zpm load some/plugin,autoload:one:two:three

origin tag

All plugins have internal origin type property, like: git, dir, file, remote. You can define own origin, but you can't mix different types of origin types. So, you can define Gitlab origin for GitHub plugin, or different origin for GitHub Gist plugin.

zpm load some/plugin,origin:https://github.com/another/origin # This plugin will be loaded from https://github.com/another/origin, but will have internal name some/plugin

zpm load @git/my-plugin,git://my.site/plugin.git # This plugin will be loaded from 3-party origin
zpm load @gist/user/hash,origin:https://another-site/file.zsh # This file will be downloaded instead of gist
zpm load @remote/plugin,origin:https://mysite.com/plugin.zsh # In this case origin should be declared, because zpm can't detect origin
zpm load @dir/plugin,origin:/home/user/Projects/plugin # Internal plugin directory will be linked to your local directory
zpm load @file/plugin-file,origin:/home/user/Projects/plugin.zsh # Internal plugin file will be linked to your local file

Do not declare own origin:, because this can produce side effects

hook tag

This tag parameter contains command who will be run in the plugin directory after instalation or upgrade

zpm plugin/name,hook:"make; make install"

if and if-not conditions

If condition allows you to run the following commands only if the condition is true

zpm if some-condition (another commands)

Conditions:

Result of condition can be negated using if-not tag

The condition can be combined zpm if macos if-not ssh load repo/plugin

Notice: conditions will be verified only at first run, after that will be used generated cache

Upgrade

Run zpm upgrade for upgrading, or run zpm upgrade some-plugin another-plugin if you want to upgrade only these plugins

Clean

By default zpm will generate cache file at first run, but if you will change ~/.zshrc this cache should be removed using zpm clean command

Configuration

You can use another mirror for GitHub/Gitlab/Bitbucket:

# Declare this before zpm load
GITHUB_MIRROR="https://hub.fastgit.org"
GITLAB_MIRROR="Some url"
BITBUCKET_MIRROR="Some url"

Troubleshooting

Powerlevel10k

Powerlevel10k loads extra modules in its installation directory, which it automatically detects by taking the file containing its init code, making it absolute, and taking its directory. However, as zpm combines plugins into one fast-loading cache file, this automatic detection would break.

As a workaround, you have to explicitly tell Powerlevel10k where it is installed. This needs to be done before the cache file is loaded, which means before zpm itself is loaded, like this:

# Adjust the path accordingly if your zpm is not installed at `~/.zpm` or you're
# using a powerlevel10k fork
export POWERLEVEL9K_INSTALLATION_DIR=~/.zpm/plugins/romkatv---powerlevel10k
source ~/.zpm/zpm.zsh

# ...

zpm load romkatv/powerlevel10k

Update to latest zpm

If you have problems with zpm try updating:

rm -rf "${TMPDIR:-/tmp}/zsh-${UID:-user}" # clear the cache
cd ~/.zpm
git pull

Developing process

You can see debug information by setting the system variable DEBUG=zpm

When you make changes, add information about them to the change log in next section. Also add link to pr and link to your GitHub profile.

TODO

Changelog