Skip to content
/ zr Public

zsh plugin manager written in rust

License

Notifications You must be signed in to change notification settings

jedahan/zr

Folders and files

NameName
Last commit message
Last commit date

Latest commit

author
Jonathan Dahan
Dec 10, 2024
bd12bb5 · Dec 10, 2024
Dec 9, 2024
Dec 9, 2024
May 7, 2017
Jan 29, 2019
Dec 10, 2024
Dec 10, 2024
Feb 27, 2023
Dec 10, 2024
Jul 11, 2017
Dec 10, 2024
Dec 27, 2017

Repository files navigation

zrat

zr(at)

nimble zsh plugin manager

zr 1.2.1
by Jonathan Dahan <[email protected]>

Example

. <(zr geometry-zsh/geometry junegunn/fzf.git/shell/key-bindings.zsh)

Format

zr author/name                                    *.zsh from github.com/author/name
zr author/name/file.zsh                        file.zsh from github.com/author/name
zr https://gitlab.com/a/plugin                    *.zsh from gitlab.com/a/plugin
zr https://gitlab.com/a/plugin.git/file.zsh    file.zsh from gitlab.com/a/plugin

Commands

zr +update                                      update plugins from already sourced zsh
zr +help                                        show help

install

zr is published to crates.io, and can be installed with cargo install zr

usage

Add this to your ~/.zshrc:

. <(zr frmendes/geometry junegunn/fzf.git/shell/key-bindings.zsh)

A bit more complex example, that only generates when .zshrc has been updated:

# Generate new ~/.config/zr.zsh if it does not exist or if ~/.zshrc has been changed
if [[ ! -f ~/.config/zr.zsh ]] || [[ ~/.zshrc -nt ~/.config/zr.zsh ]]; then
  zr \
    frmendes/geometry \
    jedahan/geometry-hydrate \
    junegunn/fzf.git/shell/key-bindings.zsh \
    > ~/.config/zr.zsh
fi

source ~/.config/zr.zsh

identifiers

zr supports four identifier formats. The last format requires .git as a delimeter.

format resolves to
author/name *.zsh from https://github.com/author/name
author/name/file.zsh file.zsh from https://github.com/author/name
https://gitlab.com/a/plugin *.zsh from https://gitlab.com/a/plugin
https://gitlab.com/a/plugin.git/file.zsh file.zsh from https://gitlab.com/a/plugin.git. The .git is used as a delimeter, and is required.

speed

The following two benchmarks show on a 2024 14" macbook pro m4

  • it takes 10ms to generate a sourceable script from a dozen or so repos
  • it takes an additional 30ms for zsh to load said script
$ hyperfine --warmup 3 \
  --command-name "generate shell script" \
    'zsh -d -f -l -c "source benchmark.zsh && zrinit && exit"' \
  --command-name "generate and load shell script" \
    'zsh -d -f -l -c "source benchmark.zsh && . <(zrinit) && exit"'

Benchmark 1: generate shell script
  Time (mean ± σ):       8.2 ms ±   1.3 ms    [User: 3.4 ms, System: 3.7 ms]
  Range (min … max):     7.2 ms …  12.1 ms    258 runs

Benchmark 2: generate and load shell script
  Time (mean ± σ):      42.1 ms ±   2.6 ms    [User: 22.4 ms, System: 58.2 ms]
  Range (min … max):    38.7 ms …  51.2 ms    54 runs
# benchmark.zsh
function zrinit {
  XDG_CACHE_HOME=/tmp/zrbenchmark zr sorin-ionescu/prezto.git/modules/git/alias.zsh \
    sorin-ionescu/prezto.git/modules/history/init.zsh \
    junegunn/fzf.git/shell/key-bindings.zsh \
    zsh-users/zsh-autosuggestions \
    zdharma/fast-syntax-highlighting \
    molovo/tipz \
    geometry-zsh/geometry \
    jedahan/geometry-hydrate \
    jedahan/geometry-todo \
    geometry-zsh/geometry \
    ael-code/zsh-colored-man-pages \
    momo-lab/zsh-abbrev-alias \
    jedahan/alacritty-completions \
    zpm-zsh/ssh
}

publishing

git tag 1.2.1
git push --tags
cargo publish --locked

thanks

  • SX91 for linux fixes
  • alanpearce for bug reports and nix package
  • nshtg for bug reports and windows fix
  • foray1010 for improving install instructions
  • Avi-D-coder for adding completions support
  • ralsei for prodding to update crates.io
  • tekumara for helping figure out --update
  • myrovh for fixing panics on some linux systems
  • TimB87 for adding openssl 3 support
  • olets for adding recursive clone support
  • everyone on #rust-beginners