• Stars
    star
    680
  • Rank 66,440 (Top 2 %)
  • Language
    Shell
  • License
    BSD 3-Clause "New...
  • Created almost 11 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A simple ZSH quickstart for using ZSH, zgenom, oh-my-zsh and a curated list of extra plugins. It is designed to be easy to customize without requiring you to maintain your own fork.

ZSH Quickstart Kit

License Build Status Awesomebot Megalinter GitHub last commit (branch)

Table of Contents

Announcement

I've switched the quickstart kit to use zgenom instead of zgen. This should be a painless update since zgenom is a superset of zgen.

Installation

Prerequisites

Fonts

This quickstart includes the powerlevel10k ZSH theme, which requires a Powerline-compatible font in your terminal to display status glyphs. Powerline-compatible fonts include many useful glyphs, including the nice branch icon that the theme in this .zshrc uses.

Here are a few good Powerline-compatible fonts:

  • Awesome Terminal Fonts - A family of fonts that include some nice monospaced Icons.
  • Cascadia Code - Microsoft's Cascadia Code
  • Fantasque Awesome Font - A nice monospaced font, patched with Font-Awesome, Octoicons, and Powerline-Glyphs.
  • Fira Mono - Mozilla's Fira type family.
  • Hack - Another Powerline-compatible font designed for source code and terminal usage.
  • Input Mono - A family of fonts designed specifically for code. It offers both monospaced and proportional fonts and includes Powerline glyphs.
  • Iosevka - Iosevka is an open source slender monospace sans-serif and slab-serif typeface inspired by Pragmata Pro, M+ and PF DIN Mono, designed to be the ideal font for programming.
  • Monoid - Monoid is customizable and optimized for coding with bitmap-like sharpness at 15px line-height even on low res displays.
  • Mononoki - Mononoki is a typeface by Matthias Tellen, created to enhance code formatting.
  • More Nerd Fonts - Another site to download nerd fonts.
  • Nerd fonts - A collection of over 20 patched fonts (over 1,700 variations) & the fontforge font patcher python script for Powerline, devicons, and vim-devicons: includes Droid Sans, Meslo, AnonymousPro, ProFont, Inconsolta, and many more. These can be installed with brew - do brew tap homebrew/cask-fonts && brew install --cask fontname
  • Powerline patched font collection - A collection of a dozen or so fonts patched to include Powerline glyphs.
  • Victor Mono - Victor Mono is a free programming font with semi-connected cursive italics, symbol ligatures (!=, ->>, =>, ===, <=, >=, ++) and Latin, Cyrillic and Greek characters.
  • spacemono - Google's new original monospace display typeface family.

OS-specific setup

fzf

To enable the enhanced history search, you'll need to install fzf. Manual install instructions can be found at fzf and os-specific instructions below.

macOS

macOS instructions 1. Download iTerm2 from [http://www.iterm2.com](http://www.iterm2.com) (optional). In my opinion, it is considerably nicer than the stock Terminal application that comes with macOS. There is an RCE flaw in all versions of iTerm 2 before 3.3.6, so update if you're using an affected version. 2. Install the current version of Homebrew from [http://brew.sh/](http://brew.sh/). 3. Install GNU Stow with `brew install stow` 4. Homebrew has a newer version of `zsh` than the one Apple shipped with the OS before 11.6, so `brew install zsh` to install it. 5. Switch your shell to `zsh` if necessary - Apple has defaulted the shell for new users to `zsh` since macOS Catalina (10.15): 1. System Preferences -> Users & Groups. 2. Unlock the preferences 3. Select your user 4. Select advanced options 5. Set your login shell to `/bin/zsh` (or `/usr/local/bin/zsh` if you decided to use the version packaged by `brew`) 6. Install some Powerline-compatible or NerdFont fonts from one of the links in the Fonts section above. 1. In iTerm 2, go to Preferences->Profile in your iTerm 2 preferences, then select one of the Powerline-compatible fonts you just installed. 2. **Make sure you also specify a Powerline-compatible font for non-ASCII in your iTerm 2 preferences or the prompt separators and branch glyphs will show up garbled**. 7. Install `fzf` with `brew install fzf`

Linux

Linux instructions 1. Switch your shell to `zsh` with `chsh -s /bin/zsh` 2. Install GNU Stow - `sudo yum install -y stow` on Red Hat / CentOS systems, `sudo apt-get -y install stow` on Debian / Ubuntu. 3. Install `fzf` - `sudo apt-get install -y fzf` on Debian / Ubuntu, do a manual install on Red Hat / Centos - instructions are at [fzf](https://github.com/junegunn/fzf). 4. Install the patched font in a valid X font path. Valid font paths can be listed with `xset q`: `mv YourChosenPowerlineFont.otf ~/.fonts` 5. Update the font cache for the path the font was installed in (root privileges may be needed for updating the font cache for some paths): `fc-cache -vf ~/.fonts/`

After installing a Nerdfont or Powerline-compatible font, you will need to configure your terminal emulator to use your selected Powerline-compatible font. The name of the correct font usually ends with for Powerline.

If the Powerline symbols can't be seen or are garbled, try closing all instances of the terminal emulator. The X Server may also need to be restarted for the new font to load correctly.

If you still can’t see the new fonts, confirm that the font has been installed to a valid X font path.

If you get garbled branch glyphs, make sure there isn't a separate font setting for non-ASCII characters in your terminal application that you also need to set to use a Powerline-compatible font. Konsole needs to be set to use UTF-8 encoding, for example.

Set up Zgenom and the starter kit

Now that your fonts and default shell have been set up, install zgenom and the dotfiles from this starter kit repository.

  1. Install Zgenom
    1. cd ~
    2. git clone https://github.com/jandamm/zgenom.git
  2. Install the starter kit
    1. cd ~
    2. git clone https://github.com/unixorn/zsh-quickstart-kit.git
  3. Configure zsh by symlinking the .zshrc, .zsh-functions, .zgen-setup and .zsh_aliases from this repository into your ~.
    1. You can do this with stow by:
      1. cd zsh-quickstart-kit
      2. stow --target=~ zsh. If you have issues using ~ as a target, do stow --target="$HOME" zsh. If you still have errors, symlink the files in the kit's zsh directory into your home directory.

The .zshrc, .zsh_aliases & .zsh_functions files included in this kit enable the plugins listed below.

Contents of the kit

The zsh-quickstart-kit configures your ZSH environment so that it includes:

  • Automatic periodic updates of both zgenom and your plugins
  • Cross-session shared history so commands typed in one terminal window can be seen and searched in all your other zsh sessions on the same machine.
  • Automatic deduplication of your command history.
  • Many more tab completions, courtesy of the zsh-users/zsh-completions repository, and periodic updating to the tip of master of that repository, so you get updates to the extra tab completions.
  • Supercharged command history search with fzf.
  • Syntax highlighting at the command line.
  • Tab completion of Rakefile targets.
  • Enabling oh-my-zsh-compatible plugins and themes (via the zgenom framework).
  • Various helper functions for interacting with macOS' clipboard, audio volume, Spotlight, and Quicklook. For your convenience, these will only load if you are on a macOS machine so that you can use the same plugin list on any *NIX system.
  • If you've installed iTerm2's shell integration, it will automatically be loaded during shell startup.

Included plugins

The quickstart kit also uses zgenom to load oh-my-zsh and these plugins:

  • aws
  • brew - only loaded on macOS
  • chruby
  • colored-man
  • git
  • github
  • osx - only loaded on macOS
  • pip
  • python
  • rsync
  • screen
  • sudo
  • vagrant

Customizing the kit

Behavior toggles

Running the following commands will toggle behavior the next time you start a shell session:

  • Prompt selectors - We now use the powerlevel10k prompt. I won't change the prompt out from under people without a way for them to get the old behavior, so there are commands to switch back and forth.
    • zsh-quickstart-select-powerlevel10k - Switch to the powerlevel10k prompt now used as the kit's default.
    • zsh-quickstart-select-bullet-train - Switch back to the bullet-train prompt originally used in the kit.
  • You can disable printing the list of ssh keys by executing zqs disable-ssh-key-listing.
  • bash prints ^C when you're typing a command and hit control-c to cancel it, so it is easy to see it wasn't executed. By default, ZSH doesn't print the ^C. I prefer seeing the ^C, so by default, the quickstart traps SIGINT and prints the ^C. You can disable this behavior by running zqs enable-control-c-decorator.

zqs

As of 2021-11-13, I've added a zqs command to start exposing some of the configurable parts in a more user-friendly way. The zqs command has the following subcommands:

zqs check-for-updates

Updates the quickstart kit if it has been longer than seven days since the last update.

zqs-disable-bindkey-handling

Disable bindkey setup and alias expansion in the quickstart .zshrc so people can use plugins like globalias to handle it instead.

zqs-enable-bindkey-handling

Let the quickstart's .zshrc configure bindkey setup and alias expansion. This is the default behavior.

zqs disable-omz-plugins

Set the quickstart to not include any oh-my-zsh plugins from the standard plugin list. Loading omz plugins can make terminal startup significantly slower.

zqs enable-control-c-decorator

Set the quickstart to create a TRAPINT handler in future zsh sessions to also display control-C when you type control-c. This is the default behavior.

zqs disable-control-c-decorator

Set the quickstart to not create the TRAPINT handler to display control-C when you type control-c in future zsh sessions.

zqs enable-omz-plugins

Sets the quickstart to include the oh-my-zsh plugins from the standard plugin list.

zqs enable-ssh-askpass-require

Enable the quickstart to prompt for your ssh passphrase on the command line.

zqs disable-ssh-askpass-require

The quickstart will prompt for your ssh passphrase via a gui program. Default behavior.

zqs-disable-ssh-key-listing

Don't print the loaded ssh keys when creating a new session.

zqs-enable-ssh-key-listing

Print the loaded ssh keys when creating a new session. This is the default behavior.

zqs-disable-ssh-key-loading

Don't load ssh keys when creating a new session. Useful if you're storing your private keys in a yubikey.

zqs-enable-ssh-key-loading

Load missing ssh private keys when creating a new session. This is the default behavior.

zqs-disable-zmv-autoloading

Don't run autoload -U zmv when creating a new session.

zqs-enable-zmv-autoloading

Run autoload -U zmv when creating a new session. This is the default behavior.

zqs selfupdate

Force an immediate update of the quickstart kit.

zqs update

Update the quickstart kit and all your plugins.

zqs update-plugins

Updates all your plugins.

zqs cleanup

Cleanup unused plugins after removing them from the list

zqs get-setting

zqs get-setting NAME [OPTIONAL default value] prints the value of a zqs setting, or if unset and a default value was passed, the specified default.

zqs set-setting

zqs set-setting NAME VALUE writes a setting.

zqs delete-setting

zqs delete-setting NAME deletes a setting from zqs's crude parameter store.

Functions and Aliases

Customizing with ~/.zshrc.d

The .zshrc included in this kit will automatically source any files it finds in ~/.zshrc.d. This happens after plugins are loaded. If you need to set variables or aliases before plugins are loaded, create files in ~/.zshrc.pre-plugins.d.

This makes it easy for you to add extra functions and aliases without having to maintain a separate fork of this repository and allows you to configure the behavior of some of the plugins by setting environment variables.

The files will be sourced in alphanumeric order after loading all the plugins, and I suggest you use a naming scheme of 001-onething, 002-something-else etc., to ensure they're loaded in the order you expect.

I like a plugin, but some of the aliases and functions it installs overwrite other commands or aliases I use

Make a file in ~/.zshrc.d named something like 999-reset-aliases. Because files in ~/.zshrc.d are loaded after all the ZSH plugins, you can add lines like unalias xyzzy to remove an alias named xyzzy, or unset -f abcd to remove a function named abcd.

Once you've cleared all the unwanted aliases and functions, you can add new ones with your preferred names.

ZSH options

The quickstart kit does an opinionated (i.e., my way) setup of ZSH options and adds some functions and aliases I like on my systems.

However, ~/.zshrc.d is processed after the quickstart sets its aliases, functions, and ZSH options, so if you don't care for something as set up in the quickstart, you can override the offending item in a shell fragment file there.

The kit also looks for files in ~/.zshrc.pre-plugins.d, and you can use snippet files in there to set environment variables that alter the startup behavior of plugins.

Self-update Settings

The quickstart kit will automatically check for updates every seven days. If you want to change the interval, set QUICKSTART_KIT_REFRESH_IN_DAYS in a file in ~/.zshrc.d. If you're going to disable self-updating entirely, add unset QUICKSTART_KIT_REFRESH_IN_DAYS in a file in ~/.zshrc.d.

Customizing the plugin list

I've included what I think is a good starter set of ZSH plugins in this repository. However, everyone has their preferences for their environment.

To make things easier to customize without users having to maintain their own forks, the kit provides two ways to customize the list of plugins it will load.

You can either add a fragment file to ~/.zshrc.add-plugins.d, or you can make a ~/.zsh-quickstart-local-plugin file.

Using fragment files

If all you want to do is add plugins to the standard list and you want to still automatically get any new changes I make to that standard list (new plugins, new locations when existing plugins are moved, etc) then adding a file into ~/.zshrc.add-plugins.d with your extra plugins listed as zgenom load githubuser/pluginrepo (one line per plugin) is the way to go. The kit will load its plugins, then add yours on the end. You can add separate files with plugins in the ~/.zshrc.add-plugins.d directory - my personal use case is having one file with all the plugins I use everywhere, and one that has extra plugins I only need on my work machines. This is the easiest option.

Complete plugin list replacement

If you don't care about future changes to the kit's plugins and want to fully replace the built-in list, then create a ~/.zsh-quickstart-local-plugins file. When the kit detects a file named ~/.zsh-quickstart-local-plugins, its .zshrc will source that instead of running the load-starter-plugin-list function defined in ~/.zgen-setup.

Using ~/.zsh-quickstart-local-plugins is not additive. It will completely replace the kit-provided list of plugins. If you want to just add more plugins, use the fragment file method above.

Creating a .zsh-quickstart-local-plugins from scratch is a pain, so to make customizing your plugin list easier, I've included a .zsh-quickstart-local-plugins-example file at the root of the repository that installs the same plugin list that the kit does by default that you can use as a starting point for your own .zsh-quickstart-local-plugins file.

Copy that to your $HOME/.zsh-quickstart-local-plugins, change the list, and the next time you start a terminal session, you'll get your plugin list loaded instead of the kit's defaults.

Disabling zmv

The quickstart automatically autoloads zmv. If you want to disable that so you can configure it with another plugin or on your own, run zqs disable-zmv-autoloading.

Disabling oh-my-zsh

If you don't want zgenom to load the oh-my-zsh defaults, run zqs-disable-omz-plugins.

FAQ

How do I reconfigure the prompt?

You may want to reconfigure your prompt after using it. The quickstart uses the powerlevel10k theme, so you can reconfigure your prompt by running p10k configure.

Powerlevel 10k warns that there is console output during startup

You see a warning during session startup -

[WARNING]: Console output during zsh initialization detected.
When using Powerlevel10k with instant prompt, console output during zsh
initialization may indicate issues.

You can stifle this output by adding typeset -g POWERLEVEL9K_INSTANT_PROMPT=quiet in a fragment file in ~/.zshrc.d.

I added a new completion plugin, and it isn't working

I've had reports that sometimes you need to reset your completions after adding a new plugin.

rm ~/.zcompdump*
compinit

I get a git error when I try to update the kit

You try to update the kit, and you get an error similar to this:

From https://github.com/unixorn/zsh-quickstart-kit
0c5bad9..2064c6b master -> origin/master

    755f689...e3f8677 switch-to-zgenom -> origin/switch-to-zgenom (forced update)
    Updating 0c5bad9..2064c6b
    error: Your local changes to the following files would be overwritten by merge:
    zsh/.zshrc
    Please commit your changes or stash them before you merge.
    Aborting

This happens when you edit a file provided by the quickstart kit, in this case, .zshrc. This is annoying, and to let you customize your ZSH settings without being forced to maintain your own fork of the kit, the kit-provided .zshrc will load any files it finds in ~/.zshrc.d.

GNU stow is warning that stowing zsh would cause conflicts

You ran stow --target=/Users/YourUsername zsh in the top level of the repo and stow printed the following error:

WARNING! stowing zsh would cause conflicts:
  * existing target is neither a link nor a directory: .zshrc
All operations aborted.

Per @jefheaton, this is caused when trying to replace an existing .zshrc file. He fixed it by closing ~ in Finder so Finder wouldn't create a .DS_Store file, deleting the existing .DS_Store and removing the old .zshrc. You may have to rename it first if ZSH is keeping the file open, then delete it after closing all your Terminal/iTerm 2 windows.

_arguments:comparguments:325: can only be called from completion function

This has been solved by running zgen update or switching to zgenom. New users of the kit should already be running zgenom. Thanks @RonanJackson, for reporting the fix.

Could not open a connection to your authentication agent

Confirm that ssh-agent is running. If not, Rob Montero has a good blog post on setting up ssh-agent on macOS, and here are instructions for starting ssh-agent with systemd on Linux.

I want to pin a plugin version

The plugin standard doesn't include a standard way of determining a version. If you need to pin a version of a plugin, the easiest way to do it is to fork the plugin's repository and then have your ~/.zsh-quickstart-local-plugins refer to that.

If you don't want to maintain a fork, you can also have zgenom load from a local directory. So clone the repository, then add something like

zgenom load ~/path/to/your/copy/of/example.plugin.zsh

Then you can tag working versions, pull from upstream for testing, and if the upstream doesn't work for you, check out your last-working-version tag, and zgenom will use your tagged version instead of the tip of the default branch.

Other Resources

ZSH

Dotfiles in general

dotfiles.github.io/ has a lot of great resources for dotfiles - frameworks for managing them, configurations for editors, and other bootstraps with initial configurations to start from.

Vim

If you're using vim, spf13 is an excellent starter configuration and plugin collection.

Thanks

Many thanks to all the contributors over the years who've helped make the quickstart better.

Made with contributors-img.

More Repositories

1

awesome-zsh-plugins

A collection of ZSH frameworks, plugins, themes and tutorials.
Shell
13,445
star
2

git-extra-commands

A collection of git utilities and useful extra git scripts.
Shell
918
star
3

sysadmin-reading-list

A reading and viewing list for larval stage sysadmins and SREs
472
star
4

luggage

Project to automate OS X package creation without using the packagemaker GUI
Makefile
391
star
5

fzf-zsh-plugin

ZSH plugin to enable fzf searches of a lot more stuff - docker, tmux, homebrew and more.
Shell
154
star
6

tumult.plugin.zsh

Tumult is a collection of macOS-specific functions and scripts for your shell environment. It is packaged as a ZSH plugin, but can be used with other shells as well.
Shell
153
star
7

aws-lambda-list

A list of hopefully useful AWS lambdas and lambda-related resources.
141
star
8

lima-xbar-plugin

xbar/Swiftbar plugin to control lima-vm
Python
81
star
9

works-with-home-assistant

Equipment and software that works with Home Assistant. And stuff that didn't so we can avoid it.
63
star
10

luggage-examples

Example luggage packages
Makefile
60
star
11

warhol.plugin.zsh

Colorize command output using grc and lscolors
Shell
55
star
12

chocolate-factory-engineering-docs

A collection of hopefully useful document templates for engineering orgs
39
star
13

autoupdate-antigen.zshplugin

Add automatic updating to antigen
Shell
27
star
14

docker-helpers.zshplugin

Miscellaneous utility scripts and aliases for use with Docker.
Shell
26
star
15

ha-mqtt-discoverable

Python module to create MQTT entities that are automatically discovered by Home Assistant
Python
23
star
16

autoupdate-zgen

Autoupdate plugin for zgen
Shell
20
star
17

jpb.zshplugin

ZSH plugin to load some of my tools.
Shell
20
star
18

bitbucket-git-helpers.plugin.zsh

Add some git helper scripts for dealing with repos on bitbucket
Ruby
17
star
19

jira-commands

Some command-line tools for interacting with JIRA
Python
16
star
20

osxtoolkit

Miscellaneous scripts to make OS X administration easier.
Ruby
13
star
21

rake-completion.zshplugin

rake task tab completion plugin for zsh, suitable for use with zgen and other oh-my-zsh compatible frameworks
Shell
8
star
22

apgar

Apgar is a quick and dirty health checker driver written in go.
Go
8
star
23

kubectx-zshplugin

Loads kubectx and kubens automagically for you
Shell
7
star
24

1password-op.plugin.zsh

ZSH plugin to load completions and aliases for 1Password's `op` tool
Shell
7
star
25

bigriver-tools

Some scripts for dealing with AWS
Python
6
star
26

docker-cupsd

cupsd in a docker container
Dockerfile
6
star
27

osx-dmg-tests

Making a separate repo for the disk image test suite that was in the pymacadmin project. No good reason other than that I don't like kitchen sink repos, this one is just the disk tests.
Python
6
star
28

gitlike-commands

Easy python module for creating git-style subcommand handling.
Python
6
star
29

containerized-awscli

Run the aws cli in a container
Shell
5
star
30

ocr-screenshots-macos

OCR all your screenshots automagically
Ruby
4
star
31

blog-scripts

Scripts from my blog
Shell
3
star
32

online-devops-meetups

Free online devops meetups.
3
star
33

logrus

A collection of random utility functions
Python
3
star
34

sourdough

Chef auto-self-registry tooling
Python
3
star
35

rvm-plugin

Autoload rvm if present
Shell
3
star
36

ha-mqtt-discoverable-cli

A cli for creating Home Assistant compatible MQTT entities that will be automatically discovered.
Python
2
star
37

ec2-tagread

Helper script to let bash scripts read EC2 tags
Python
2
star
38

thoth-duplicacy

Container for duplicacy and duplicacy-utils
Shell
2
star
39

thelogrus

Python 3 version of logrus
Python
2
star
40

haze

Some EC2 utility functions and scripts
Python
2
star
41

unixorn.github.io

HTML
2
star
42

doctoc-docker

Docker container for running doctoc
Ruby
2
star
43

SetupSSHonAMIs

I needed to create an AWS marketplace AMI at work, so the instances needed to get their authorized_keys set from the keypair specified to AWS.
Ruby
2
star
44

shellshock-patch-osx

This will download Apple's bash source, patch it, build it, and create a pkg file for you
2
star
45

rage-quit.plugin.zsh

Perl
2
star
46

jpb-utilities

Various utility scripts
Python
1
star
47

zsh-starterkit

zsh is great. starterkit makes it even better. start with omz and add this plugin to get great defaults.
Shell
1
star
48

docker-masquerade

ZSH Plugin full of shim scripts that run commands in docker containers instead of natively
Shell
1
star
49

poseidon

Kubernetes utility scripts
1
star
50

zsh-lunch-and-learn

Lunch and learn about ZSH
JavaScript
1
star
51

slackmoji

Random useful images for slack emoji.
1
star
52

k8s-helpers.zshplugin

Some helper functions I use with kubernetes
Shell
1
star
53

elasticsearch-shell-helpers

Helper scripts for elasticsearch
Shell
1
star
54

home-assistant-to-twilio-sms

Shell
1
star
55

arm-toolkit

Some scripts I like to have on my ARM cluster nodes
Perl
1
star
56

chef-valkyrie

chef-valkyrie purges dead EC2 instances from your Chef Server
Python
1
star
57

pyvizio-docker

pyvisio in a docker container
Ruby
1
star
58

pdcrier

Create/update PagerDuty alerts from the command line
Python
1
star
59

throttle.zsh-plugin

Limit the amount of CPU an application can gobble up on macOS
1
star
60

clio

Docker container for backing up local directories
1
star
61

twilio-sms-zsh-plugin

Adds tooling so you can send an SMS from the command line using Twilio's API
1
star
62

alpython2

alpine + Python 2 + Upgraded pip
Ruby
1
star
63

cookiecutter-zsh-plugin

Template create zsh plugin with cookiecutter
Makefile
1
star
64

ha-franklin

Monitor cupsd print queues and present the information to Home Assistant via MQTT
Python
1
star
65

sysadvent.plugin.zsh

Functions from sysadvent
1
star
66

grok-burnrate

Burnrate custom metric for Grok
Python
1
star
67

themis-lambda

Lambda function to scan an ASG for busy instances and set instance protection on them
Python
1
star
68

unixorn-py3

Python 3 base container
Ruby
1
star
69

history-search-multi-word

Multi-word history searching for Zsh
Shell
1
star
70

autoupdate-zgenom

ZSH Plugin for updating zgenom and its plugins
Shell
1
star