# ZSH Presentation This was part of an internal presentation I gave at parsely on how to build a minimal setup for zsh. You can clone this repo to `~/.dotfiles` and use it as a skeleton to start your own minimal zsh/dotfile structure. ## Overwhelming list of plugin stuff https://github.com/unixorn/awesome-zsh-plugins There is so much to read but I would mostly just skim `plugins` for things you need. https://github.com/unixorn/awesome-zsh-plugins#plugins Fun example I found while browsing plugins https://github.com/mattberther/zsh-pyenv ## Managing symlinks with gnustow Source: http://brandon.invergo.net/news/2012-05-26-using-gnu-stow-to-manage-your-dotfiles.html?round=two Stow mocks the directory stucture of the .dotfiles to understand where files should go. So instead of doing say: ``` ln -s /path/to/my/source/file.txt /path/to/symlink.txt ``` You create the directory structure with actual folders and stow can use that structure to determine where to place the files given a root directory. It will complain if files already exist so you won't overwrite them. To install the dotfiles you can simply: ``` cd stow ./install ``` ## Functions and Aliases I only split up my main config and another file that contains my functions and aliases. I've included a filtered version of my aliases to give ideas, but there is a lot cruft in there. Essential Tools: - fzf (https://github.com/junegunn/fzf) - gh (github cli https://cli.github.com/) - exa (pretty ls https://github.com/ogham/exa) ## Zplug zplug is a zsh plugin manager. Add the repos you want in your ~/.zshrc and then when you start a new shell you'll be prompted to install the new plugins. Supports oh-my-zsh plugins. ## Autocompletes zsh uses a variable called `fpath` to determine where to find autocomplete files. Autocomplete files are prefixed with an underscore and then the command name. For example, to find the autocompletes for `docker`, zsh would search the fpath variable for a file called `_docker`. You can write your own autocompletes for things. Defining an alias in your zsh will let the alias pick up the autocompletes for the original commands but if you write a function it will not: ``` # gss will pick up the tab completion for git stash alias gs="git stash" # this will not gs() { git stash } ``` You can use the `compdef` function to assign the autocompletes of one command to another. Example in zshrc You can also write your own completions if you know a simple bash command to get the list of options you'd like to be presented with.