This solution was heavily influenced by @keith's original contribution
in #356, which I think may have worked on some but not all setups due to
personal configuration differences.
The solution in #356 added the `_git_delete_branch` function in the
`zsh/completions` folder, which resulted in the tab-completion working
against `git`, but not against our `g` function. With our new loading
order where functions are loaded first and completions are loaded last,
we can load the `_git_delete_branch` function before any completions are
defined on `git`, `g`, or `hub`, allowing the `_git_delete_branch` shim
to be used by all three of those git-invoking commands/functions.
Close#355.
Why:
* Remove dupes from PATH
How:
$PATH is a scalar composed of contents of $path, so it uses typeset -U
("U" as in Unique) to ensure there are no dupes. It preserves the first
occurrence in the array, since it would be searched first before others
when matching a command in the directories in the PATH anyway.
This allows people to incorporate the thoughtbot dotfiles into their own
dotfiles in a more fine-grained manner.
I left some things in zshrc that we should eventually handle more
precisely:
- Load `.zsh/functions/*`. This could instead be replaced with: `mv
.zsh/functions/* .zsh/configs`.
- Load `.aliases`. This could instead be replaced with: `mv .aliases
.zsh/configs/aliases.zsh`.
- Load `.zshrc.local`. This file can realistically go away entirely,
with people adding their own files to `.zsh/configs`.
A further refactoring, which I have done locally, is to introduce a
`~/.sh/configs` directory, in which people can put POSIX-specific
configuration that can be shared between GNU Bash, zsh, ksh, etc:
aliases, functions, paths, prompts, and so on. But one step at a time.
Other changes:
* Move aliases setup to occur after loading other config, as some of our
aliases depend on environment variables having been set, so alias
loading must come last after we've sourced `zsh/configs`.
* Move autocompletion for `g` function from the function definition to
to `zsh/completions/_g`
* Move `PATH` setup to `zsh/configs/post` to ensure it happens after
other configuration that might alter the `PATH`
**Bring executables into better shellcheck compliance**
While evaluating linting and testing options for our shell
configuration, a run of Shellcheck against our executables turned up
some places where we could use more consistent syntax across our
executables, such as always using a shebang or quoting `$HOME` when we
build up a larger directory.
**Update syntax for zsh functions and completions**
A few changes found while linting zsh configs with shellcheck:
* thoughtbot's [style guide] [guide] calls for `$(..)` over backticks
when capturing command output
* use `-gt` to test array length in arguments
[guide]: https://github.com/thoughtbot/guides/tree/master/best-practices
Project should be moving over to spring, as this is the 'blessed'
approach and is part of suspenders. Leaving these functions around adds
yet another layer of indirection to consider when trying to run these
commands:
* function wrapper
* binstub
* rbenv shim
* actual binary
With arguments, g acts like git.
Without arguments, it runs `git status`.
* Source functions/* after loading ZSH completion so `compdef` is available to g
alias
* Use a regular alias to make `s` short for `rspec`
* Use an `rspec` shell function to route to zeus when appropriate
* Removes confusion from `s` working differently than `rspec`
* Removes need to use a special alias to get zeus working