diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index c6b3e8ce..0c5f3ace 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1,6 +1,5 @@
# Plugin owners
plugins/archlinux/ @ratijas
-plugins/aws/ @maksyms
plugins/genpass/ @atoponce
plugins/git-lfs/ @hellovietduc
plugins/gitfast/ @felipec
@@ -10,3 +9,5 @@ plugins/shell-proxy/ @septs
plugins/universalarchive/ @Konfekt
plugins/wp-cli/ @joshmedeski
plugins/zoxide/ @ajeetdsouza
+plugins/starship/ @axieax
+plugins/dbt/ @msempere
diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml
new file mode 100644
index 00000000..4a25c807
--- /dev/null
+++ b/.github/workflows/installer.yml
@@ -0,0 +1,54 @@
+name: Test and Deploy installer
+on:
+ workflow_dispatch: {}
+ push:
+ paths:
+ - tools/install.sh
+ - .github/workflows/installer
+ - .github/workflows/installer.yml
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+ cancel-in-progress: false
+
+permissions:
+ contents: read # to checkout
+
+jobs:
+ test:
+ name: Test installer
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os:
+ - ubuntu-latest
+ - macos-latest
+ steps:
+ - name: Set up git repository
+ uses: actions/checkout@v3
+ - name: Install zsh
+ if: runner.os == 'Linux'
+ run: sudo apt-get update; sudo apt-get install zsh
+ - name: Test installer
+ run: sh ./tools/install.sh
+
+ deploy:
+ name: Deploy installer in install.ohmyz.sh
+ if: github.ref == 'refs/heads/master'
+ runs-on: ubuntu-latest
+ environment: vercel
+ needs:
+ - test
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3
+ - name: Install Vercel CLI
+ run: npm install -g vercel
+ - name: Setup project and deploy
+ env:
+ VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
+ VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
+ run: |
+ cp tools/install.sh .github/workflows/installer/install.sh
+ cd .github/workflows/installer
+ vc deploy --prod -t ${{ secrets.VERCEL_TOKEN }}
diff --git a/.github/workflows/installer/.gitignore b/.github/workflows/installer/.gitignore
new file mode 100644
index 00000000..f66fce31
--- /dev/null
+++ b/.github/workflows/installer/.gitignore
@@ -0,0 +1 @@
+install.sh
diff --git a/.github/workflows/installer/.vercelignore b/.github/workflows/installer/.vercelignore
new file mode 100644
index 00000000..41b23336
--- /dev/null
+++ b/.github/workflows/installer/.vercelignore
@@ -0,0 +1,2 @@
+/*
+!/install.sh
diff --git a/.github/workflows/installer/vercel.json b/.github/workflows/installer/vercel.json
new file mode 100644
index 00000000..8c5aec5e
--- /dev/null
+++ b/.github/workflows/installer/vercel.json
@@ -0,0 +1,14 @@
+{
+ "headers": [
+ {
+ "source": "/((?!favicon.ico).*)",
+ "headers": [{ "key": "Content-Type", "value": "text/plain" }]
+ }
+ ],
+ "rewrites": [
+ {
+ "source": "/((?!favicon.ico|install.sh).*)",
+ "destination": "/install.sh"
+ }
+ ]
+}
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 57a1e383..de7d9826 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -7,7 +7,7 @@ on:
branches:
- master
push:
- branches:
+ branches:
- master
concurrency:
@@ -20,19 +20,13 @@ permissions:
jobs:
tests:
name: Run tests
- runs-on: ${{ matrix.os }}
+ runs-on: ubuntu-latest
if: github.repository == 'ohmyzsh/ohmyzsh'
- strategy:
- matrix:
- os: [ubuntu-latest, macos-latest]
steps:
- name: Set up git repository
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
- name: Install zsh
- if: runner.os == 'Linux'
run: sudo apt-get update; sudo apt-get install zsh
- - name: Test installer
- run: sh ./tools/install.sh
- name: Check syntax
run: |
for file in ./oh-my-zsh.sh \
diff --git a/.gitignore b/.gitignore
index 71ae444e..10bd4beb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,4 +8,5 @@ log/
.DS_Store
# editor configs
-.vscode
\ No newline at end of file
+.vscode
+.idea
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 00000000..a8f5a14b
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,4 @@
+{
+ "printWidth": 110,
+ "proseWrap": "always"
+}
diff --git a/README.md b/README.md
index 1e4b7ff7..308d117e 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,8 @@ Finally, you'll begin to get the sort of attention that you have always felt you
To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twitter.com/ohmyzsh) on Twitter, and join us on [Discord](https://discord.gg/ohmyzsh).
[](https://github.com/ohmyzsh/ohmyzsh/actions?query=workflow%3ACI)
-[](https://twitter.com/intent/follow?screen_name=ohmyzsh)
+[](https://twitter.com/intent/follow?screen_name=ohmyzsh)
+[](https://mstdn.social/@ohmyzsh)
[](https://discord.gg/ohmyzsh)
[](https://gitpod.io/#https://github.com/ohmyzsh/ohmyzsh)
[](https://huntr.dev/bounties/disclose/?utm_campaign=ohmyzsh%2Fohmyzsh&utm_medium=social&utm_source=github&target=https%3A%2F%2Fgithub.com%2Fohmyzsh%2Fohmyzsh)
@@ -22,29 +23,33 @@ To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twi
Table of Contents
- [Getting Started](#getting-started)
+ - [Operating System Compatibility](#operating-system-compatibility)
- [Prerequisites](#prerequisites)
- [Basic Installation](#basic-installation)
- - [Manual inspection](#manual-inspection)
+ - [Manual Inspection](#manual-inspection)
- [Using Oh My Zsh](#using-oh-my-zsh)
- [Plugins](#plugins)
- [Enabling Plugins](#enabling-plugins)
- [Using Plugins](#using-plugins)
- [Themes](#themes)
- - [Selecting a Theme](#selecting-a-theme)
+ - [Selecting A Theme](#selecting-a-theme)
- [FAQ](#faq)
- [Advanced Topics](#advanced-topics)
- [Advanced Installation](#advanced-installation)
- [Custom Directory](#custom-directory)
- - [Unattended install](#unattended-install)
- - [Installing from a forked repository](#installing-from-a-forked-repository)
+ - [Unattended Install](#unattended-install)
+ - [Installing From A Forked Repository](#installing-from-a-forked-repository)
- [Manual Installation](#manual-installation)
- [Installation Problems](#installation-problems)
- - [Custom Plugins and Themes](#custom-plugins-and-themes)
+ - [Custom Plugins And Themes](#custom-plugins-and-themes)
+ - [Enable GNU ls In macOS And freeBSD Systems](#enable-gnu-ls-in-macos-and-freebsd-systems)
+ - [Skip Aliases](#skip-aliases)
- [Getting Updates](#getting-updates)
+ - [Updates Verbosity](#updates-verbosity)
- [Manual Updates](#manual-updates)
- [Uninstalling Oh My Zsh](#uninstalling-oh-my-zsh)
-- [How do I contribute to Oh My Zsh?](#how-do-i-contribute-to-oh-my-zsh)
- - [Do NOT send us themes](#do-not-send-us-themes)
+- [How Do I Contribute To Oh My Zsh?](#how-do-i-contribute-to-oh-my-zsh)
+ - [Do Not Send Us Themes](#do-not-send-us-themes)
- [Contributors](#contributors)
- [Follow Us](#follow-us)
- [Merchandise](#merchandise)
@@ -55,9 +60,21 @@ To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twi
## Getting Started
+### Operating System Compatibility
+
+| O/S | Status |
+| :------------- | :-----: |
+| Android | ✅ |
+| freeBSD | ✅ |
+| LCARS | 🛸 |
+| Linux | ✅ |
+| macOS | ✅ |
+| OS/2 Warp | ❌ |
+| Windows (WSL2) | ✅ |
+
+
### Prerequisites
-- A Unix-like operating system: macOS, Linux, BSD. On Windows: WSL2 is preferred, but cygwin or msys also mostly work.
- [Zsh](https://www.zsh.org) should be installed (v4.3.9 or more recent is fine but we prefer 5.0.8 and newer). If not pre-installed (run `zsh --version` to confirm), check the following wiki instructions here: [Installing ZSH](https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH)
- `curl` or `wget` should be installed
- `git` should be installed (recommended v2.4.11 or higher)
@@ -74,7 +91,7 @@ Oh My Zsh is installed by running one of the following commands in your terminal
_Note that any previous `.zshrc` will be renamed to `.zshrc.pre-oh-my-zsh`. After installation, you can move the configuration you want to preserve into the new `.zshrc`._
-#### Manual inspection
+#### Manual Inspection
It's a good idea to inspect the install script from projects you don't yet know. You can do
that by downloading the install script first, looking through it so everything looks normal,
@@ -123,7 +140,7 @@ Each built-in plugin includes a **README**, documenting it. This README should s
We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme happy. We have over one hundred and fifty themes now bundled. Most of them have [screenshots](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) on the wiki (We are working on updating this!). Check them out!
-#### Selecting a Theme
+#### Selecting A Theme
_Robby's theme is the default one. It's not the fanciest one. It's not the simplest one. It's just the right one (for him)._
@@ -194,7 +211,7 @@ like this:
ZSH="$HOME/.dotfiles/oh-my-zsh" sh install.sh
```
-#### Unattended install
+#### Unattended Install
If you're running the Oh My Zsh install script as part of an automated install, you can pass the `--unattended`
flag to the `install.sh` script. This will have the effect of not trying to change
@@ -204,7 +221,7 @@ the default shell, and it also won't run `zsh` when the installation has finishe
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
```
-#### Installing from a forked repository
+#### Installing From A Forked Repository
The install script also accepts these variables to allow installation of a different repository:
@@ -229,19 +246,19 @@ REPO=apjanke/oh-my-zsh BRANCH=edge sh install.sh
#### Manual Installation
-##### 1. Clone the repository
+##### 1. Clone The Repository
```sh
git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh
```
-##### 2. _Optionally_, backup your existing `~/.zshrc` file
+##### 2. _Optionally_, Backup Your Existing `~/.zshrc` File
```sh
cp ~/.zshrc ~/.zshrc.orig
```
-##### 3. Create a new zsh configuration file
+##### 3. Create A New Zsh Configuration File
You can create a new zsh config file by copying the template that we have included for you.
@@ -249,7 +266,7 @@ You can create a new zsh config file by copying the template that we have includ
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
```
-##### 4. Change your default shell
+##### 4. Change Your Default Shell
```sh
chsh -s $(which zsh)
@@ -257,7 +274,7 @@ chsh -s $(which zsh)
You must log out from your user session and log back in to see this change.
-##### 5. Initialize your new zsh configuration
+##### 5. Initialize Your New Zsh Configuration
Once you open up a new terminal window, it should load zsh with Oh My Zsh's configuration.
@@ -268,7 +285,7 @@ If you have any hiccups installing, here are a few common fixes.
- You _might_ need to modify your `PATH` in `~/.zshrc` if you're not able to find some commands after switching to `oh-my-zsh`.
- If you installed manually or changed the install location, check the `ZSH` environment variable in `~/.zshrc`.
-### Custom Plugins and Themes
+### Custom Plugins And Themes
If you want to override any of the default behaviors, just add a new file (ending in `.zsh`) in the `custom/` directory.
@@ -276,6 +293,72 @@ If you have many functions that go well together, you can put them as a `XYZ.plu
If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`.
+### Enable GNU ls In macOS And freeBSD Systems
+
+
+
+The default behaviour in Oh My Zsh is to use BSD `ls` in macOS and freeBSD systems. If GNU `ls` is installed
+(as `gls` command), you can choose to use it instead. To do it, you can use zstyle-based config before
+sourcing `oh-my-zsh.sh`:
+
+```zsh
+zstyle ':omz:lib:theme-and-appearance' gnu-ls yes
+```
+
+_Note: this is not compatible with `DISABLE_LS_COLORS=true`_
+
+### Skip Aliases
+
+
+
+If you want to skip default Oh My Zsh aliases (those defined in `lib/*` files) or plugin aliases,
+you can use the settings below in your `~/.zshrc` file, **before Oh My Zsh is loaded**. Note that
+there are many different ways to skip aliases, depending on your needs.
+
+```sh
+# Skip all aliases, in lib files and enabled plugins
+zstyle ':omz:*' aliases no
+
+# Skip all aliases in lib files
+zstyle ':omz:lib:*' aliases no
+# Skip only aliases defined in the directories.zsh lib file
+zstyle ':omz:lib:directories' aliases no
+
+# Skip all plugin aliases
+zstyle ':omz:plugins:*' aliases no
+# Skip only the aliases from the git plugin
+zstyle ':omz:plugins:git' aliases no
+```
+
+You can combine these in other ways taking into account that more specific scopes takes precedence:
+
+```sh
+# Skip all plugin aliases, except for the git plugin
+zstyle ':omz:plugins:*' aliases no
+zstyle ':omz:plugins:git' aliases yes
+```
+
+A previous version of this feature was using the setting below, which has been removed:
+
+```sh
+zstyle ':omz:directories' aliases no
+```
+
+Instead, you can now use the following:
+
+```sh
+zstyle ':omz:lib:directories' aliases no
+```
+
+#### Notice
+
+> This feature is currently in a testing phase and it may be subject to change in the future.
+> It is also not currently compatible with plugin managers such as zpm or zinit, which don't
+> source the init script (`oh-my-zsh.sh`) where this feature is implemented in.
+
+> It is also not currently aware of "aliases" that are defined as functions. Example of such
+> are `gccd`, `ggf`, or `ggl` functions from the git plugin.
+
## Getting Updates
By default, you will be prompted to check for updates every 2 weeks. You can choose other update modes by adding a line to your `~/.zshrc` file, **before Oh My Zsh is loaded**:
@@ -307,6 +390,18 @@ zstyle ':omz:update' frequency 7
zstyle ':omz:update' frequency 0
```
+### Updates Verbosity
+
+You can also limit the update verbosity with the following settings:
+
+```sh
+zstyle ':omz:update' verbose default # default update prompt
+
+zstyle ':omz:update' verbose minimal # only few lines
+
+zstyle ':omz:update' verbose silent # only errors
+```
+
### Manual Updates
If you'd like to update at any point in time (maybe someone just released a new plugin and you don't want to wait a week?) you just need to run:
@@ -323,7 +418,7 @@ Oh My Zsh isn't for everyone. We'll miss you, but we want to make this an easy b
If you want to uninstall `oh-my-zsh`, just run `uninstall_oh_my_zsh` from the command-line. It will remove itself and revert your previous `bash` or `zsh` configuration.
-## How do I contribute to Oh My Zsh?
+## How Do I Contribute To Oh My Zsh?
Before you participate in our delightful community, please read the [code of conduct](CODE_OF_CONDUCT.md).
@@ -333,7 +428,7 @@ We also need people to test out pull requests. So take a look through [the open
See [Contributing](CONTRIBUTING.md) for more details.
-### Do NOT send us themes
+### Do Not Send Us Themes
We have (more than) enough themes for the time being. Please add your theme to the [external themes](https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes) wiki page.
@@ -364,4 +459,4 @@ Oh My Zsh is released under the [MIT license](LICENSE.txt).

-Oh My Zsh was started by the team at [Planet Argon](https://www.planetargon.com/?utm_source=github), a [Ruby on Rails development agency](https://www.planetargon.com/skills/ruby-on-rails-development?utm_source=github). Check out our [other open source projects](https://www.planetargon.com/open-source?utm_source=github).
+Oh My Zsh was started by the team at [Planet Argon](https://www.planetargon.com/?utm_source=github), a [Ruby on Rails development agency](http://www.planetargon.com/services/ruby-on-rails-development?utm_source=github). Check out our [other open source projects](https://www.planetargon.com/open-source?utm_source=github).
diff --git a/custom/example.zsh b/custom/example.zsh
index c505a967..21a8d8be 100644
--- a/custom/example.zsh
+++ b/custom/example.zsh
@@ -1,10 +1,12 @@
-# You can put files here to add functionality separated per file, which
-# will be ignored by git.
-# Files on the custom/ directory will be automatically loaded by the init
-# script, in alphabetical order.
-
-# For example: add yourself some shortcuts to projects you often work on.
-#
+# Put files in this folder to add your own custom functionality.
+# See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization
+#
+# Files in the custom/ directory will be:
+# - loaded automatically by the init script, in alphabetical order
+# - loaded last, after all built-ins in the lib/ directory, to override them
+# - ignored by git by default
+#
+# Example: add custom/shortcuts.zsh for shortcuts to your local projects
+#
# brainstormr=~/Projects/development/planetargon/brainstormr
# cd $brainstormr
-#
diff --git a/custom/plugins/example/example.plugin.zsh b/custom/plugins/example/example.plugin.zsh
index 406f2744..83611fe3 100644
--- a/custom/plugins/example/example.plugin.zsh
+++ b/custom/plugins/example/example.plugin.zsh
@@ -1,2 +1,3 @@
# Add your own custom plugins in the custom/plugins directory. Plugins placed
# here will override ones with the same name in the main plugins directory.
+# See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization#overriding-and-adding-plugins
diff --git a/custom/themes/example.zsh-theme b/custom/themes/example.zsh-theme
index ef8f1c63..494d029e 100644
--- a/custom/themes/example.zsh-theme
+++ b/custom/themes/example.zsh-theme
@@ -1,4 +1,6 @@
# Put your custom themes in this folder.
+# See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization#overriding-and-adding-themes
+#
# Example:
PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% "
diff --git a/lib/cli.zsh b/lib/cli.zsh
index fed00d21..561c1b98 100644
--- a/lib/cli.zsh
+++ b/lib/cli.zsh
@@ -11,7 +11,7 @@ function omz {
# Subcommand functions start with _ so that they don't
# appear as completion entries when looking for `omz`
- (( $+functions[_omz::$command] )) || {
+ (( ${+functions[_omz::$command]} )) || {
_omz::help
return 1
}
@@ -776,10 +776,11 @@ function _omz::update {
local last_commit=$(builtin cd -q "$ZSH"; git rev-parse HEAD)
# Run update script
+ zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default
if [[ "$1" != --unattended ]]; then
- ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" --interactive || return $?
+ ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode || return $?
else
- ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" || return $?
+ ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -v $verbose_mode || return $?
fi
# Update last updated file
diff --git a/lib/clipboard.zsh b/lib/clipboard.zsh
index ad83fc4b..4b37abc9 100644
--- a/lib/clipboard.zsh
+++ b/lib/clipboard.zsh
@@ -57,6 +57,9 @@ function detect-clipboard() {
elif [[ "${OSTYPE}" == (cygwin|msys)* ]]; then
function clipcopy() { cat "${1:-/dev/stdin}" > /dev/clipboard; }
function clippaste() { cat /dev/clipboard; }
+ elif (( $+commands[clip.exe] )) && (( $+commands[powershell.exe] )); then
+ function clipcopy() { cat "${1:-/dev/stdin}" | clip.exe; }
+ function clippaste() { powershell.exe -noprofile -command Get-Clipboard; }
elif [ -n "${WAYLAND_DISPLAY:-}" ] && (( ${+commands[wl-copy]} )) && (( ${+commands[wl-paste]} )); then
function clipcopy() { cat "${1:-/dev/stdin}" | wl-copy &>/dev/null &|; }
function clippaste() { wl-paste; }
@@ -81,9 +84,6 @@ function detect-clipboard() {
elif [ -n "${TMUX:-}" ] && (( ${+commands[tmux]} )); then
function clipcopy() { tmux load-buffer "${1:--}"; }
function clippaste() { tmux save-buffer -; }
- elif [[ $(uname -r) = *icrosoft* ]]; then
- function clipcopy() { cat "${1:-/dev/stdin}" | clip.exe; }
- function clippaste() { powershell.exe -noprofile -command Get-Clipboard; }
else
function _retry_clipboard_detection_or_fail() {
local clipcmd="${1}"; shift
@@ -100,8 +100,8 @@ function detect-clipboard() {
fi
}
-# Detect at startup. A non-zero exit here indicates that the dummy clipboards were set,
-# which is not really an error. If the user calls them, they will attempt to redetect
-# (for example, perhaps the user has now installed xclip) and then either print an error
-# or proceed successfully.
-detect-clipboard || true
+function clipcopy clippaste {
+ unfunction clipcopy clippaste
+ detect-clipboard || true # let one retry
+ "$0" "$@"
+}
diff --git a/lib/completion.zsh b/lib/completion.zsh
index 2c569548..63379b53 100644
--- a/lib/completion.zsh
+++ b/lib/completion.zsh
@@ -18,9 +18,9 @@ if [[ "$CASE_SENSITIVE" = true ]]; then
zstyle ':completion:*' matcher-list 'r:|=*' 'l:|=* r:|=*'
else
if [[ "$HYPHEN_INSENSITIVE" = true ]]; then
- zstyle ':completion:*' matcher-list 'm:{a-zA-Z-_}={A-Za-z_-}' 'r:|=*' 'l:|=* r:|=*'
+ zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]-_}={[:upper:][:lower:]_-}' 'r:|=*' 'l:|=* r:|=*'
else
- zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|=*' 'l:|=* r:|=*'
+ zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'r:|=*' 'l:|=* r:|=*'
fi
fi
unset CASE_SENSITIVE HYPHEN_INSENSITIVE
diff --git a/lib/correction.zsh b/lib/correction.zsh
index 4259d341..ba9664fc 100644
--- a/lib/correction.zsh
+++ b/lib/correction.zsh
@@ -1,13 +1,8 @@
if [[ "$ENABLE_CORRECTION" == "true" ]]; then
alias cp='nocorrect cp'
- alias ebuild='nocorrect ebuild'
- alias gist='nocorrect gist'
- alias heroku='nocorrect heroku'
- alias hpodder='nocorrect hpodder'
alias man='nocorrect man'
alias mkdir='nocorrect mkdir'
alias mv='nocorrect mv'
- alias mysql='nocorrect mysql'
alias sudo='nocorrect sudo'
alias su='nocorrect su'
diff --git a/lib/directories.zsh b/lib/directories.zsh
index c62f5646..8927a56a 100644
--- a/lib/directories.zsh
+++ b/lib/directories.zsh
@@ -1,8 +1,10 @@
# Changing/making/removing directory
+setopt auto_cd
setopt auto_pushd
setopt pushd_ignore_dups
setopt pushdminus
+
alias -g ...='../..'
alias -g ....='../../..'
alias -g .....='../../../..'
diff --git a/lib/functions.zsh b/lib/functions.zsh
index dfcc4d96..a252d0a3 100644
--- a/lib/functions.zsh
+++ b/lib/functions.zsh
@@ -5,7 +5,7 @@ function zsh_stats() {
}
function uninstall_oh_my_zsh() {
- env ZSH="$ZSH" sh "$ZSH/tools/uninstall.sh"
+ command env ZSH="$ZSH" sh "$ZSH/tools/uninstall.sh"
}
function upgrade_oh_my_zsh() {
@@ -30,6 +30,13 @@ function open_command() {
;;
esac
+ # If a URL is passed, $BROWSER might be set to a local browser within SSH.
+ # See https://github.com/ohmyzsh/ohmyzsh/issues/11098
+ if [[ -n "$BROWSER" && "$1" = (http|https)://* ]]; then
+ "$BROWSER" "$@"
+ return
+ fi
+
${=open_cmd} "$@" &>/dev/null
}
@@ -56,7 +63,7 @@ function takegit() {
}
function take() {
- if [[ $1 =~ ^(https?|ftp).*\.tar\.(gz|bz2|xz)$ ]]; then
+ if [[ $1 =~ ^(https?|ftp).*\.(tar\.(gz|bz2|xz)|tgz)$ ]]; then
takeurl "$1"
elif [[ $1 =~ ^([A-Za-z0-9]\+@|https?|git|ssh|ftps?|rsync).*\.git/?$ ]]; then
takegit "$1"
diff --git a/lib/misc.zsh b/lib/misc.zsh
index 1f637083..132f3355 100644
--- a/lib/misc.zsh
+++ b/lib/misc.zsh
@@ -15,8 +15,9 @@ if [[ $DISABLE_MAGIC_FUNCTIONS != true ]]; then
done
fi
-## jobs
-setopt long_list_jobs
+setopt multios # enable redirect to multiple streams: echo >file1 >file2
+setopt long_list_jobs # show long list format job notifications
+setopt interactivecomments # recognize comments
env_default 'PAGER' 'less'
env_default 'LESS' '-R'
@@ -30,6 +31,3 @@ if (( $+commands[ack-grep] )); then
elif (( $+commands[ack] )); then
alias afind='ack -il'
fi
-
-# recognize comments
-setopt interactivecomments
diff --git a/lib/prompt_info_functions.zsh b/lib/prompt_info_functions.zsh
index e5535848..3dc9b6d1 100644
--- a/lib/prompt_info_functions.zsh
+++ b/lib/prompt_info_functions.zsh
@@ -18,6 +18,7 @@ function chruby_prompt_info \
vi_mode_prompt_info \
virtualenv_prompt_info \
jenv_prompt_info \
+ azure_prompt_info \
tf_prompt_info \
{
return 1
diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh
index 80ca7ef7..a800e651 100644
--- a/lib/termsupport.zsh
+++ b/lib/termsupport.zsh
@@ -17,7 +17,7 @@ function title {
: ${2=$1}
case "$TERM" in
- cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty|st*|foot)
+ cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty|st*|foot*|contour*)
print -Pn "\e]2;${2:q}\a" # set window name
print -Pn "\e]1;${1:q}\a" # set tab name
;;
@@ -109,28 +109,55 @@ if [[ -z "$INSIDE_EMACS" || "$INSIDE_EMACS" = vterm ]]; then
add-zsh-hook preexec omz_termsupport_preexec
fi
-# Keep Apple Terminal.app's current working directory updated
-# Based on this answer: https://superuser.com/a/315029
-# With extra fixes to handle multibyte chars and non-UTF-8 locales
+# Keep terminal emulator's current working directory correct,
+# even if the current working directory path contains symbolic links
+#
+# References:
+# - Apple's Terminal.app: https://superuser.com/a/315029
+# - iTerm2: https://iterm2.com/documentation-escape-codes.html (iTerm2 Extension / CurrentDir+RemoteHost)
+# - Konsole: https://bugs.kde.org/show_bug.cgi?id=327720#c1
+# - libvte (gnome-terminal, mate-terminal, …): https://bugzilla.gnome.org/show_bug.cgi?id=675987#c14
+# Apparently it had a bug before ~2012 were it would display the unknown OSC 7 code
+#
+# As of May 2021 mlterm, PuTTY, rxvt, screen, termux & xterm simply ignore the unknown OSC.
-if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then
- # Emits the control sequence to notify Terminal.app of the cwd
- # Identifies the directory using a file: URI scheme, including
- # the host name to disambiguate local vs. remote paths.
- function update_terminalapp_cwd() {
- emulate -L zsh
-
- # Percent-encode the host and path names.
- local URL_HOST URL_PATH
- URL_HOST="$(omz_urlencode -P $HOST)" || return 1
- URL_PATH="$(omz_urlencode -P $PWD)" || return 1
-
- # Undocumented Terminal.app-specific control sequence
- printf '\e]7;%s\a' "file://$URL_HOST$URL_PATH"
- }
-
- # Use a precmd hook instead of a chpwd hook to avoid contaminating output
- add-zsh-hook precmd update_terminalapp_cwd
- # Run once to get initial cwd set
- update_terminalapp_cwd
+# Don't define the function if we're inside Emacs or in an SSH session (#11696)
+if [[ -n "$INSIDE_EMACS" || -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then
+ return
fi
+
+# Don't define the function if we're in an unsupported terminal
+case "$TERM" in
+ # all of these either process OSC 7 correctly or ignore entirely
+ xterm*|putty*|rxvt*|konsole*|mlterm*|alacritty|screen*|tmux*) ;;
+ contour*|foot*) ;;
+ *)
+ # Terminal.app and iTerm2 process OSC 7 correctly
+ case "$TERM_PROGRAM" in
+ Apple_Terminal|iTerm.app) ;;
+ *) return ;;
+ esac ;;
+esac
+
+# Emits the control sequence to notify many terminal emulators
+# of the cwd
+#
+# Identifies the directory using a file: URI scheme, including
+# the host name to disambiguate local vs. remote paths.
+function omz_termsupport_cwd {
+ # Percent-encode the host and path names.
+ local URL_HOST URL_PATH
+ URL_HOST="$(omz_urlencode -P $HOST)" || return 1
+ URL_PATH="$(omz_urlencode -P $PWD)" || return 1
+
+ # Konsole errors if the HOST is provided
+ [[ -z "$KONSOLE_VERSION" ]] || URL_HOST=""
+
+ # common control sequence (OSC 7) to set current host and path
+ printf "\e]7;file://%s%s\e\\" "${URL_HOST}" "${URL_PATH}"
+}
+
+# Use a precmd hook instead of a chpwd hook to avoid contaminating output
+# i.e. when a script or function changes directory without `cd -q`, chpwd
+# will be called the output may be swallowed by the script or function.
+add-zsh-hook precmd omz_termsupport_cwd
diff --git a/lib/theme-and-appearance.zsh b/lib/theme-and-appearance.zsh
index 00947f72..585e969d 100644
--- a/lib/theme-and-appearance.zsh
+++ b/lib/theme-and-appearance.zsh
@@ -1,59 +1,81 @@
-# ls colors
+# Sets color variable such as $fg, $bg, $color and $reset_color
autoload -U colors && colors
-# Enable ls colors
+# Expand variables and commands in PROMPT variables
+setopt prompt_subst
+
+# Prompt function theming defaults
+ZSH_THEME_GIT_PROMPT_PREFIX="git:(" # Beginning of the git prompt, before the branch name
+ZSH_THEME_GIT_PROMPT_SUFFIX=")" # End of the git prompt
+ZSH_THEME_GIT_PROMPT_DIRTY="*" # Text to display if the branch is dirty
+ZSH_THEME_GIT_PROMPT_CLEAN="" # Text to display if the branch is clean
+ZSH_THEME_RUBY_PROMPT_PREFIX="("
+ZSH_THEME_RUBY_PROMPT_SUFFIX=")"
+
+
+# Use diff --color if available
+if command diff --color /dev/null{,} &>/dev/null; then
+ function diff {
+ command diff --color "$@"
+ }
+fi
+
+# Don't set ls coloring if disabled
+[[ "$DISABLE_LS_COLORS" != true ]] || return 0
+
+# Default coloring for BSD-based ls
export LSCOLORS="Gxfxcxdxbxegedabagacad"
-# TODO organise this chaotic logic
-
-if [[ "$DISABLE_LS_COLORS" != "true" ]]; then
- # Find the option for using colors in ls, depending on the version
- if [[ "$OSTYPE" == netbsd* ]]; then
- # On NetBSD, test if "gls" (GNU ls) is installed (this one supports colors);
- # otherwise, leave ls as is, because NetBSD's ls doesn't support -G
- gls --color -d . &>/dev/null && alias ls='gls --color=tty'
- elif [[ "$OSTYPE" == openbsd* ]]; then
- # On OpenBSD, "gls" (ls from GNU coreutils) and "colorls" (ls from base,
- # with color and multibyte support) are available from ports. "colorls"
- # will be installed on purpose and can't be pulled in by installing
- # coreutils, so prefer it to "gls".
- gls --color -d . &>/dev/null && alias ls='gls --color=tty'
- colorls -G -d . &>/dev/null && alias ls='colorls -G'
- elif [[ "$OSTYPE" == (darwin|freebsd)* ]]; then
- # this is a good alias, it works by default just using $LSCOLORS
- ls -G . &>/dev/null && alias ls='ls -G'
-
- # only use coreutils ls if there is a dircolors customization present ($LS_COLORS or .dircolors file)
- # otherwise, gls will use the default color scheme which is ugly af
- [[ -n "$LS_COLORS" || -f "$HOME/.dircolors" ]] && gls --color -d . &>/dev/null && alias ls='gls --color=tty'
+# Default coloring for GNU-based ls
+if [[ -z "$LS_COLORS" ]]; then
+ # Define LS_COLORS via dircolors if available. Otherwise, set a default
+ # equivalent to LSCOLORS (generated via https://geoff.greer.fm/lscolors)
+ if (( $+commands[dircolors] )); then
+ [[ -f "$HOME/.dircolors" ]] \
+ && source <(dircolors -b "$HOME/.dircolors") \
+ || source <(dircolors -b)
else
- # For GNU ls, we use the default ls color theme. They can later be overwritten by themes.
- if [[ -z "$LS_COLORS" ]]; then
- (( $+commands[dircolors] )) && eval "$(dircolors -b)"
- fi
-
- ls --color -d . &>/dev/null && alias ls='ls --color=tty' || { ls -G . &>/dev/null && alias ls='ls -G' }
-
- # Take advantage of $LS_COLORS for completion as well.
- zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
+ export LS_COLORS="di=1;36:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43"
fi
fi
-# enable diff color if possible.
-if command diff --color /dev/null /dev/null &>/dev/null; then
- alias diff='diff --color'
-fi
+function test-ls-args {
+ local cmd="$1" # ls, gls, colorls, ...
+ local args="${@[2,-1]}" # arguments except the first one
+ command "$cmd" "$args" /dev/null &>/dev/null
+}
-setopt auto_cd
-setopt multios
-setopt prompt_subst
+# Find the option for using colors in ls, depending on the version
+case "$OSTYPE" in
+ netbsd*)
+ # On NetBSD, test if `gls` (GNU ls) is installed (this one supports colors);
+ # otherwise, leave ls as is, because NetBSD's ls doesn't support -G
+ test-ls-args gls --color && alias ls='gls --color=tty'
+ ;;
+ openbsd*)
+ # On OpenBSD, `gls` (ls from GNU coreutils) and `colorls` (ls from base,
+ # with color and multibyte support) are available from ports.
+ # `colorls` will be installed on purpose and can't be pulled in by installing
+ # coreutils (which might be installed for ), so prefer it to `gls`.
+ test-ls-args gls --color && alias ls='gls --color=tty'
+ test-ls-args colorls -G && alias ls='colorls -G'
+ ;;
+ (darwin|freebsd)*)
+ # This alias works by default just using $LSCOLORS
+ test-ls-args ls -G && alias ls='ls -G'
+ # Only use GNU ls if installed and there are user defaults for $LS_COLORS,
+ # as the default coloring scheme is not very pretty
+ zstyle -t ':omz:lib:theme-and-appearance' gnu-ls \
+ && test-ls-args gls --color \
+ && alias ls='gls --color=tty'
+ ;;
+ *)
+ if test-ls-args ls --color; then
+ alias ls='ls --color=tty'
+ elif test-ls-args ls -G; then
+ alias ls='ls -G'
+ fi
+ ;;
+esac
-[[ -n "$WINDOW" ]] && SCREEN_NO="%B$WINDOW%b " || SCREEN_NO=""
-
-# git theming default: Variables for theming the git info prompt
-ZSH_THEME_GIT_PROMPT_PREFIX="git:(" # Prefix at the very beginning of the prompt, before the branch name
-ZSH_THEME_GIT_PROMPT_SUFFIX=")" # At the very end of the prompt
-ZSH_THEME_GIT_PROMPT_DIRTY="*" # Text to display if the branch is dirty
-ZSH_THEME_GIT_PROMPT_CLEAN="" # Text to display if the branch is clean
-ZSH_THEME_RUBY_PROMPT_PREFIX="("
-ZSH_THEME_RUBY_PROMPT_SUFFIX=")"
+unfunction test-ls-args
diff --git a/lib/vcs_info.zsh b/lib/vcs_info.zsh
index e60938c1..be6d32ee 100644
--- a/lib/vcs_info.zsh
+++ b/lib/vcs_info.zsh
@@ -38,7 +38,7 @@
# due to malicious input as a consequence of CVE-2021-45444, which affects
# zsh versions from 5.0.3 to 5.8.
#
-autoload -Uz +X regexp-replace VCS_INFO_formats 2>/dev/null || return
+autoload -Uz +X regexp-replace VCS_INFO_formats 2>/dev/null || return 0
# We use $tmp here because it's already a local variable in VCS_INFO_formats
typeset PATCH='for tmp (base base-name branch misc revision subdir) hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"'
diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh
index 29d39ca2..137ca3b6 100644
--- a/oh-my-zsh.sh
+++ b/oh-my-zsh.sh
@@ -1,14 +1,14 @@
+# ANSI formatting function (\033[m)
+# 0: reset, 1: bold, 4: underline, 22: no bold, 24: no underline, 31: red, 33: yellow
+omz_f() {
+ [ $# -gt 0 ] || return
+ IFS=";" printf "\033[%sm" $*
+}
+# If stdout is not a terminal ignore all formatting
+[ -t 1 ] || omz_f() { :; }
+
# Protect against non-zsh execution of Oh My Zsh (use POSIX syntax here)
[ -n "$ZSH_VERSION" ] || {
- # ANSI formatting function (\033[m)
- # 0: reset, 1: bold, 4: underline, 22: no bold, 24: no underline, 31: red, 33: yellow
- omz_f() {
- [ $# -gt 0 ] || return
- IFS=";" printf "\033[%sm" $*
- }
- # If stdout is not a terminal ignore all formatting
- [ -t 1 ] || omz_f() { :; }
-
omz_ptree() {
# Get process tree of the current process
pid=$$; pids="$pid"
@@ -38,6 +38,15 @@
return 1
}
+# Check if in emulation mode, if so early return
+# https://github.com/ohmyzsh/ohmyzsh/issues/11686
+[[ "$(emulate)" = zsh ]] || {
+ printf "$(omz_f 1 31)Error:$(omz_f 22) Oh My Zsh can't be loaded in \`$(emulate)\` emulation mode.$(omz_f 0)\n" >&2
+ return 1
+}
+
+unset -f omz_f
+
# If ZSH is not defined, use the current script's directory.
[[ -z "$ZSH" ]] && export ZSH="${${(%):-%x}:a:h}"
@@ -57,9 +66,7 @@ mkdir -p "$ZSH_CACHE_DIR/completions"
(( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
# Check for updates on initial load...
-if [[ "$DISABLE_AUTO_UPDATE" != true ]]; then
- source "$ZSH/tools/check_for_upgrade.sh"
-fi
+source "$ZSH/tools/check_for_upgrade.sh"
# Initializes Oh My Zsh
@@ -143,24 +150,62 @@ fi
unset zcompdump_revision zcompdump_fpath zcompdump_refresh
# zcompile the completion dump file if the .zwc is older or missing.
-zrecompile -q -p "$ZSH_COMPDUMP" && command rm -f "$ZSH_COMPDUMP.zwc.old"
+if command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then
+ zrecompile -q -p "$ZSH_COMPDUMP"
+ command rm -rf "$ZSH_COMPDUMP.zwc.old" "${ZSH_COMPDUMP}.lock"
+fi
-# Load all of the config files in ~/oh-my-zsh that end in .zsh
+_omz_source() {
+ local context filepath="$1"
+
+ # Construct zstyle context based on path
+ case "$filepath" in
+ lib/*) context="lib:${filepath:t:r}" ;; # :t = lib_name.zsh, :r = lib_name
+ plugins/*) context="plugins:${filepath:h:t}" ;; # :h = plugins/plugin_name, :t = plugin_name
+ esac
+
+ local disable_aliases=0
+ zstyle -T ":omz:${context}" aliases || disable_aliases=1
+
+ # Back up alias names prior to sourcing
+ local -A aliases_pre galiases_pre
+ if (( disable_aliases )); then
+ aliases_pre=("${(@kv)aliases}")
+ galiases_pre=("${(@kv)galiases}")
+ fi
+
+ # Source file from $ZSH_CUSTOM if it exists, otherwise from $ZSH
+ if [[ -f "$ZSH_CUSTOM/$filepath" ]]; then
+ source "$ZSH_CUSTOM/$filepath"
+ elif [[ -f "$ZSH/$filepath" ]]; then
+ source "$ZSH/$filepath"
+ fi
+
+ # Unset all aliases that don't appear in the backed up list of aliases
+ if (( disable_aliases )); then
+ if (( #aliases_pre )); then
+ aliases=("${(@kv)aliases_pre}")
+ else
+ (( #aliases )) && unalias "${(@k)aliases}"
+ fi
+ if (( #galiases_pre )); then
+ galiases=("${(@kv)galiases_pre}")
+ else
+ (( #galiases )) && unalias "${(@k)galiases}"
+ fi
+ fi
+}
+
+# Load all of the lib files in ~/oh-my-zsh/lib that end in .zsh
# TIP: Add files you don't want in git to .gitignore
-for config_file ("$ZSH"/lib/*.zsh); do
- custom_config_file="$ZSH_CUSTOM/lib/${config_file:t}"
- [[ -f "$custom_config_file" ]] && config_file="$custom_config_file"
- source "$config_file"
+for lib_file ("$ZSH"/lib/*.zsh); do
+ _omz_source "lib/${lib_file:t}"
done
-unset custom_config_file
+unset lib_file
# Load all of the plugins that were defined in ~/.zshrc
for plugin ($plugins); do
- if [[ -f "$ZSH_CUSTOM/plugins/$plugin/$plugin.plugin.zsh" ]]; then
- source "$ZSH_CUSTOM/plugins/$plugin/$plugin.plugin.zsh"
- elif [[ -f "$ZSH/plugins/$plugin/$plugin.plugin.zsh" ]]; then
- source "$ZSH/plugins/$plugin/$plugin.plugin.zsh"
- fi
+ _omz_source "plugins/$plugin/$plugin.plugin.zsh"
done
unset plugin
@@ -188,3 +233,6 @@ if [[ -n "$ZSH_THEME" ]]; then
echo "[oh-my-zsh] theme '$ZSH_THEME' not found"
fi
fi
+
+# set completion colors to be the same as `ls`, after theme has been loaded
+[[ -z "$LS_COLORS" ]] || zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
diff --git a/plugins/alias-finder/.zunit.yml b/plugins/alias-finder/.zunit.yml
new file mode 100644
index 00000000..ae65f8ef
--- /dev/null
+++ b/plugins/alias-finder/.zunit.yml
@@ -0,0 +1,9 @@
+tap: false
+directories:
+ tests: tests
+ output: tests/_output
+ support: tests/_support
+time_limit: 0
+fail_fast: false
+allow_risky: false
+verbose: true
diff --git a/plugins/alias-finder/README.md b/plugins/alias-finder/README.md
index 409f4b65..6c87c723 100644
--- a/plugins/alias-finder/README.md
+++ b/plugins/alias-finder/README.md
@@ -2,45 +2,32 @@
This plugin searches the defined aliases and outputs any that match the command inputted. This makes learning new aliases easier.
+## Usage
+
To use it, add `alias-finder` to the `plugins` array of your zshrc file:
```
plugins=(... alias-finder)
```
-## Usage
-To see if there is an alias defined for the command, pass it as an argument to `alias-finder`. This can also run automatically before each command you input - add `ZSH_ALIAS_FINDER_AUTOMATIC=true` to your zshrc if you want this.
+To enable it for every single command, set zstyle in your `~/.zshrc`.
-## Options
+```zsh
+# ~/.zshrc
+
+zstyle ':omz:plugins:alias-finder' autoload yes # disabled by default
+zstyle ':omz:plugins:alias-finder' longer yes # disabled by default
+zstyle ':omz:plugins:alias-finder' exact yes # disabled by default
+zstyle ':omz:plugins:alias-finder' cheaper yes # disabled by default
+```
+
+As you can see, options are also available with zstyle.
+
+### Options
+
+> In order to clarify, let's say `alias a=abc` has source 'abc' and destination 'a'.
+
+- Use `--longer` or `-l` to include aliases where the source is longer than the input (in other words, the source could contain the whole input).
+- Use `--exact` or `-e` to avoid aliases where the source is shorter than the input (in other words, the source must be the same with the input).
+- Use `--cheaper` or `-c` to avoid aliases where the destination is longer than the input (in other words, the destination must be the shorter than the input).
-- Use `--longer` or `-l` to allow the aliases to be longer than the input (match aliases if they contain the input).
-- Use `--exact` or `-e` to avoid matching aliases that are shorter than the input.
-## Examples
-```
-$ alias-finder "git pull"
-gl='git pull'
-g=git
-```
-```
-$ alias-finder "web_search google oh my zsh"
-google='web_search google'
-```
-```
-$ alias-finder "git commit -v"
-gc="git commit -v"
-g=git
-```
-```
-$ alias-finder -e "git commit -v"
-gc='git commit -v'
-```
-```
-$ alias-finder -l "git commit -v"
-gc='git commit -v'
-'gc!'='git commit -v --amend'
-gca='git commit -v -a'
-'gca!'='git commit -v -a --amend'
-'gcan!'='git commit -v -a --no-edit --amend'
-'gcans!'='git commit -v -a -s --no-edit --amend'
-'gcn!'='git commit -v --no-edit --amend'
-```
diff --git a/plugins/alias-finder/alias-finder.plugin.zsh b/plugins/alias-finder/alias-finder.plugin.zsh
index caee9b5a..5fdfbc83 100644
--- a/plugins/alias-finder/alias-finder.plugin.zsh
+++ b/plugins/alias-finder/alias-finder.plugin.zsh
@@ -1,44 +1,59 @@
alias-finder() {
- local cmd="" exact="" longer="" wordStart="" wordEnd="" multiWordEnd=""
- for i in $@; do
- case $i in
+ local cmd=" " exact="" longer="" cheaper="" wordEnd="'{0,1}$" finder="" filter=""
+
+ # build command and options
+ for c in "$@"; do
+ case $c in
+ # TODO: Remove backward compatibility (other than zstyle form)
+ # set options if exist
-e|--exact) exact=true;;
-l|--longer) longer=true;;
- *)
- if [[ -z $cmd ]]; then
- cmd=$i
- else
- cmd="$cmd $i"
- fi
- ;;
+ -c|--cheaper) cheaper=true;;
+ # concatenate cmd
+ *) cmd="$cmd$c " ;;
esac
done
- cmd=$(sed 's/[].\|$(){}?+*^[]/\\&/g' <<< $cmd) # adds escaping for grep
- if (( $(wc -l <<< $cmd) == 1 )); then
- while [[ $cmd != "" ]]; do
- if [[ $longer = true ]]; then
- wordStart="'{0,1}"
- else
- wordEnd="$"
- multiWordEnd="'$"
- fi
- if [[ $cmd == *" "* ]]; then
- local finder="'$cmd$multiWordEnd"
- else
- local finder=$wordStart$cmd$wordEnd
- fi
- alias | grep -E "=$finder"
- if [[ $exact = true || $longer = true ]]; then
- break
- else
- cmd=$(sed -E 's/ {0,1}[^ ]*$//' <<< $cmd) # removes last word
- fi
- done
+
+ zstyle -t ':omz:plugins:alias-finder' longer && longer=true
+ zstyle -t ':omz:plugins:alias-finder' exact && exact=true
+ zstyle -t ':omz:plugins:alias-finder' cheaper && cheaper=true
+
+ # format cmd for grep
+ ## - replace newlines with spaces
+ ## - trim both ends
+ ## - replace multiple spaces with one space
+ ## - add escaping character to special characters
+ cmd=$(echo -n "$cmd" | tr '\n' ' ' | xargs | tr -s '[:space:]' | sed 's/[].\|$(){}?+*^[]/\\&/g')
+
+ if [[ $longer == true ]]; then
+ wordEnd="" # remove wordEnd to find longer aliases
fi
+
+ # find with alias and grep, removing last word each time until no more words
+ while [[ $cmd != "" ]]; do
+ finder="'{0,1}$cmd$wordEnd"
+
+ # make filter to find only shorter results than current cmd
+ if [[ $cheaper == true ]]; then
+ cmdLen=$(echo -n "$cmd" | wc -c)
+ filter="^'{0,1}.{0,$((cmdLen - 1))}="
+ fi
+
+ alias | grep -E "$filter" | grep -E "=$finder"
+
+ if [[ $exact == true ]]; then
+ break # because exact case is only one
+ elif [[ $longer = true ]]; then
+ break # because above grep command already found every longer aliases during first cycle
+ fi
+
+ cmd=$(sed -E 's/ {0,}[^ ]*$//' <<< "$cmd") # remove last word
+ done
}
preexec_alias-finder() {
- if [[ $ZSH_ALIAS_FINDER_AUTOMATIC = true ]]; then
+ # TODO: Remove backward compatibility (other than zstyle form)
+ zstyle -t ':omz:plugins:alias-finder' autoload && alias-finder $1 || if [[ $ZSH_ALIAS_FINDER_AUTOMATIC = true ]]; then
alias-finder $1
fi
}
diff --git a/plugins/alias-finder/tests/_output/.gitkeep b/plugins/alias-finder/tests/_output/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/plugins/alias-finder/tests/_support/.gitkeep b/plugins/alias-finder/tests/_support/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/plugins/alias-finder/tests/_support/bootstrap b/plugins/alias-finder/tests/_support/bootstrap
new file mode 100644
index 00000000..01076611
--- /dev/null
+++ b/plugins/alias-finder/tests/_support/bootstrap
@@ -0,0 +1,2 @@
+#!/usr/bin/env zsh
+# Write your bootstrap code here
diff --git a/plugins/alias-finder/tests/test_run.sh b/plugins/alias-finder/tests/test_run.sh
new file mode 100644
index 00000000..6b7abebb
--- /dev/null
+++ b/plugins/alias-finder/tests/test_run.sh
@@ -0,0 +1,107 @@
+#!/usr/bin/env zunit
+
+@setup {
+ load ../alias-finder.plugin.zsh
+
+ set_git_aliases() {
+ unalias -a # all
+ alias g="git"
+ alias gc="git commit"
+ alias gcv="git commit -v"
+ alias gcvs="git commit -v -S"
+ }
+}
+
+@test 'find aliases that contain input' {
+ set_git_aliases
+
+ run alias-finder "git"
+
+ assert "${#lines[@]}" equals 1
+ assert "${lines[1]}" same_as "g=git"
+}
+
+@test 'find aliases that contain input with whitespaces at ends' {
+ set_git_aliases
+
+ run alias-finder " git "
+
+ assert "${#lines[@]}" equals 1
+ assert "${lines[1]}" same_as "g=git"
+}
+
+@test 'find aliases that contain multiple words' {
+ set_git_aliases
+
+ run alias-finder "git commit -v"
+
+ assert "${#lines[@]}" equals 3
+ assert "${lines[1]}" same_as "gcv='git commit -v'"
+ assert "${lines[2]}" same_as "gc='git commit'"
+ assert "${lines[3]}" same_as "g=git"
+}
+
+@test 'find alias that is the same with input when --exact option is set' {
+ set_git_aliases
+
+ run alias-finder -e "git"
+
+ assert "${#lines[@]}" equals 1
+ assert "${lines[1]}" same_as "g=git"
+}
+
+@test 'find alias that is the same with multiple words input when --exact option is set' {
+ set_git_aliases
+
+ run alias-finder -e "git commit -v"
+
+ assert "${#lines[@]}" equals 1
+ assert "${lines[1]}" same_as "gcv='git commit -v'"
+}
+
+@test 'find alias that is the same with or longer than input when --longer option is set' {
+ set_git_aliases
+
+ run alias-finder -l "git"
+
+ assert "${#lines[@]}" equals 4
+ assert "${lines[1]}" same_as "g=git"
+ assert "${lines[2]}" same_as "gc='git commit'"
+ assert "${lines[3]}" same_as "gcv='git commit -v'"
+ assert "${lines[4]}" same_as "gcvs='git commit -v -S'"
+}
+
+@test 'find alias that is the same with or longer than multiple words input when --longer option is set' {
+ set_git_aliases
+
+ run alias-finder -l "git commit -v"
+
+ assert "${#lines[@]}" equals 2
+ assert "${lines[1]}" same_as "gcv='git commit -v'"
+ assert "${lines[2]}" same_as "gcvs='git commit -v -S'"
+}
+
+@test 'find aliases including expensive (longer) than input' {
+ set_git_aliases
+ alias expensiveCommands="git commit"
+
+ run alias-finder "git commit -v"
+
+ assert "${#lines[@]}" equals 4
+ assert "${lines[1]}" same_as "gcv='git commit -v'"
+ assert "${lines[2]}" same_as "expensiveCommands='git commit'"
+ assert "${lines[3]}" same_as "gc='git commit'"
+ assert "${lines[4]}" same_as "g=git"
+}
+
+@test 'find aliases excluding expensive (longer) than input when --cheap option is set' {
+ set_git_aliases
+ alias expensiveCommands="git commit"
+
+ run alias-finder -c "git commit -v"
+
+ assert "${#lines[@]}" equals 3
+ assert "${lines[1]}" same_as "gcv='git commit -v'"
+ assert "${lines[2]}" same_as "gc='git commit'"
+ assert "${lines[3]}" same_as "g=git"
+}
diff --git a/plugins/aliases/README.md b/plugins/aliases/README.md
index 66fd8458..14f9c5c5 100644
--- a/plugins/aliases/README.md
+++ b/plugins/aliases/README.md
@@ -15,14 +15,14 @@ Requirements: Python needs to be installed.
## Usage
-- `acs`: show all aliases by group.
+- `als`: show all aliases by group
-- `acs -h/--help`: print help mesage.
+- `als -h/--help`: print help message
-- `acs `: filter aliases by `` and highlight.
+- `als `: filter and highlight aliases by ``
-- `acs -g /--group `. Multiple uses of the flag show all groups,
+- `als -g /--group `: show only aliases for group ``. Multiple uses of the flag show all groups
-- `acs --groups-only`: show only group names
+- `als --groups`: show only group names
- 
+ 
diff --git a/plugins/aliases/aliases.plugin.zsh b/plugins/aliases/aliases.plugin.zsh
index 9864de95..7f1ba83b 100644
--- a/plugins/aliases/aliases.plugin.zsh
+++ b/plugins/aliases/aliases.plugin.zsh
@@ -4,7 +4,7 @@
0="${${(M)0:#/*}:-$PWD/$0}"
eval '
- function acs(){
+ function als(){
(( $+commands[python3] )) || {
echo "[error] No python executable detected"
return
diff --git a/plugins/aliases/cheatsheet.py b/plugins/aliases/cheatsheet.py
index 3362a6ab..61bf5f95 100644
--- a/plugins/aliases/cheatsheet.py
+++ b/plugins/aliases/cheatsheet.py
@@ -15,6 +15,7 @@ def parse(line):
def cheatsheet(lines):
exps = [ parse(line) for line in lines ]
+ exps.sort(key=lambda exp:exp[2])
cheatsheet = {'_default': []}
for key, group in itertools.groupby(exps, lambda exp:exp[2]):
group_list = [ item for item in group ]
@@ -56,8 +57,8 @@ def pretty_print(cheatsheet, wfilter, group_list=None, groups_only=False):
pretty_print_group(key, [ alias for alias in aliases if alias[0].find(wfilter)>-1 or alias[1].find(wfilter)>-1], wfilter)
if __name__ == '__main__':
- parser = argparse.ArgumentParser(description="Pretty print aliases.")
- parser.add_argument('filter', nargs="*", help="search aliases matching string")
+ parser = argparse.ArgumentParser(description="Pretty print aliases.", prog="als")
+ parser.add_argument('filter', nargs="*", metavar="", help="search aliases matching keywords")
parser.add_argument('-g', '--group', dest="group_list", action='append', help="only print aliases in given groups")
parser.add_argument('--groups', dest='groups_only', action='store_true', help="only print alias groups")
args = parser.parse_args()
diff --git a/plugins/archlinux/README.md b/plugins/archlinux/README.md
index fd772c61..5e015dba 100644
--- a/plugins/archlinux/README.md
+++ b/plugins/archlinux/README.md
@@ -181,3 +181,4 @@ whether the package manager is installed, checked in the following order:
- Ybalrid (Arthur Brainville) - ybalrid@ybalrid.info
- Jeff M. Hubbard - jeffmhubbard@gmail.com
- K. Harishankar(harishnkr) - hari2menon1234@gmail.com
+- WH-2099 - wh2099@outlook.com
\ No newline at end of file
diff --git a/plugins/archlinux/archlinux.plugin.zsh b/plugins/archlinux/archlinux.plugin.zsh
index 4f136477..fca6548c 100644
--- a/plugins/archlinux/archlinux.plugin.zsh
+++ b/plugins/archlinux/archlinux.plugin.zsh
@@ -23,30 +23,27 @@ alias pacfiles='pacman -F'
alias pacls='pacman -Ql'
alias pacown='pacman -Qo'
alias pacupd="sudo pacman -Sy"
-alias upgrade='sudo pacman -Syu'
function paclist() {
- # Based on https://bbs.archlinux.org/viewtopic.php?id=93683
- pacman -Qqe | \
- xargs -I '{}' \
- expac "${bold_color}% 20n ${fg_no_bold[white]}%d${reset_color}" '{}'
+ pacman -Qqe | xargs -I{} -P0 --no-run-if-empty pacman -Qs --color=auto "^{}\$"
}
function pacdisowned() {
- local tmp db fs
- tmp=${TMPDIR-/tmp}/pacman-disowned-$UID-$$
- db=$tmp/db
- fs=$tmp/fs
+ local tmp_dir db fs
+ tmp_dir=$(mktemp --directory)
+ db=$tmp_dir/db
+ fs=$tmp_dir/fs
- mkdir "$tmp"
- trap 'rm -rf "$tmp"' EXIT
+ trap "rm -rf $tmp_dir" EXIT
pacman -Qlq | sort -u > "$db"
- find /bin /etc /lib /sbin /usr ! -name lost+found \
+ find /etc /usr ! -name lost+found \
\( -type d -printf '%p/\n' -o -print \) | sort > "$fs"
comm -23 "$fs" "$db"
+
+ rm -rf $tmp_dir
}
alias pacmanallkeys='sudo pacman-key --refresh-keys'
@@ -109,7 +106,6 @@ if (( $+commands[aura] )); then
alias auupd="sudo aura -Sy"
alias auupg='sudo sh -c "aura -Syu && aura -Au"'
alias ausu='sudo sh -c "aura -Syu --no-confirm && aura -Au --no-confirm"'
- alias upgrade='sudo aura -Syu'
# extra bonus specially for aura
alias auown="aura -Qqo"
@@ -136,7 +132,6 @@ if (( $+commands[pacaur] )); then
alias painsd='pacaur -S --asdeps'
alias pamir='pacaur -Syy'
alias paupd="pacaur -Sy"
- alias upgrade='pacaur -Syu'
fi
if (( $+commands[trizen] )); then
@@ -158,7 +153,6 @@ if (( $+commands[trizen] )); then
alias trinsd='trizen -S --asdeps'
alias trmir='trizen -Syy'
alias trupd="trizen -Sy"
- alias upgrade='trizen -Syu'
fi
if (( $+commands[yay] )); then
@@ -180,5 +174,30 @@ if (( $+commands[yay] )); then
alias yainsd='yay -S --asdeps'
alias yamir='yay -Syy'
alias yaupd="yay -Sy"
- alias upgrade='yay -Syu'
fi
+
+# Check Arch Linux PGP Keyring before System Upgrade to prevent failure.
+function upgrade() {
+ echo ":: Checking Arch Linux PGP Keyring..."
+ local installedver="$(sudo pacman -Qi archlinux-keyring | grep -Po '(?<=Version : ).*')"
+ local currentver="$(sudo pacman -Si archlinux-keyring | grep -Po '(?<=Version : ).*')"
+ if [ $installedver != $currentver ]; then
+ echo " Arch Linux PGP Keyring is out of date."
+ echo " Updating before full system upgrade."
+ sudo pacman -Sy --needed --noconfirm archlinux-keyring
+ else
+ echo " Arch Linux PGP Keyring is up to date."
+ echo " Proceeding with full system upgrade."
+ fi
+ if (( $+commands[yay] )); then
+ yay -Syu
+ elif (( $+commands[trizen] )); then
+ trizen -Syu
+ elif (( $+commands[pacaur] )); then
+ pacaur -Syu
+ elif (( $+commands[aura] )); then
+ sudo aura -Syu
+ else
+ sudo pacman -Syu
+ fi
+}
diff --git a/plugins/argocd/README.md b/plugins/argocd/README.md
new file mode 100644
index 00000000..0f900ff2
--- /dev/null
+++ b/plugins/argocd/README.md
@@ -0,0 +1,20 @@
+# Argo CD plugin
+
+This plugin adds completion for the [Argo CD](https://argoproj.github.io/cd/) CLI.
+
+To use it, add `argocd` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... argocd)
+```
+
+This plugin does not add any aliases.
+
+## Cache
+
+This plugin caches the completion script and is automatically updated asynchronously when the plugin is
+loaded, which is usually when you start up a new terminal emulator.
+
+The cache is stored at:
+
+- `$ZSH_CACHE/completions/_argocd` completions script
diff --git a/plugins/argocd/argocd.plugin.zsh b/plugins/argocd/argocd.plugin.zsh
new file mode 100644
index 00000000..8de7b023
--- /dev/null
+++ b/plugins/argocd/argocd.plugin.zsh
@@ -0,0 +1,14 @@
+# Autocompletion for argocd.
+if (( ! $+commands[argocd] )); then
+ return
+fi
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `argocd`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_argocd" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _argocd
+ _comps[argocd]=_argocd
+fi
+
+argocd completion zsh >| "$ZSH_CACHE_DIR/completions/_argocd" &|
diff --git a/plugins/asdf/asdf.plugin.zsh b/plugins/asdf/asdf.plugin.zsh
index 3016282c..7635d20c 100644
--- a/plugins/asdf/asdf.plugin.zsh
+++ b/plugins/asdf/asdf.plugin.zsh
@@ -2,26 +2,29 @@
ASDF_DIR="${ASDF_DIR:-$HOME/.asdf}"
ASDF_COMPLETIONS="$ASDF_DIR/completions"
-# If not found, check for archlinux/AUR package (/opt/asdf-vm/)
-if [[ ! -f "$ASDF_DIR/asdf.sh" || ! -f "$ASDF_COMPLETIONS/asdf.bash" ]] && [[ -f "/opt/asdf-vm/asdf.sh" ]]; then
- ASDF_DIR="/opt/asdf-vm"
- ASDF_COMPLETIONS="$ASDF_DIR"
-fi
-
-# If not found, check for Homebrew package
-if [[ ! -f "$ASDF_DIR/asdf.sh" || ! -f "$ASDF_COMPLETIONS/asdf.bash" ]] && (( $+commands[brew] )); then
- brew_prefix="$(brew --prefix asdf)"
- ASDF_DIR="${brew_prefix}/libexec"
- ASDF_COMPLETIONS="${brew_prefix}/etc/bash_completion.d"
- unset brew_prefix
+if [[ ! -f "$ASDF_DIR/asdf.sh" || ! -f "$ASDF_COMPLETIONS/_asdf" ]]; then
+ # If not found, check for archlinux/AUR package (/opt/asdf-vm/)
+ if [[ -f "/opt/asdf-vm/asdf.sh" ]]; then
+ ASDF_DIR="/opt/asdf-vm"
+ ASDF_COMPLETIONS="$ASDF_DIR"
+ # If not found, check for Homebrew package
+ elif (( $+commands[brew] )); then
+ _ASDF_PREFIX="$(brew --prefix asdf)"
+ ASDF_DIR="${_ASDF_PREFIX}/libexec"
+ ASDF_COMPLETIONS="${_ASDF_PREFIX}/share/zsh/site-functions"
+ unset _ASDF_PREFIX
+ else
+ return
+ fi
fi
# Load command
if [[ -f "$ASDF_DIR/asdf.sh" ]]; then
- . "$ASDF_DIR/asdf.sh"
-
+ source "$ASDF_DIR/asdf.sh"
# Load completions
- if [[ -f "$ASDF_COMPLETIONS/asdf.bash" ]]; then
- . "$ASDF_COMPLETIONS/asdf.bash"
+ if [[ -f "$ASDF_COMPLETIONS/_asdf" ]]; then
+ fpath+=("$ASDF_COMPLETIONS")
+ autoload -Uz _asdf
+ compdef _asdf asdf # compdef is already loaded before loading plugins
fi
fi
diff --git a/plugins/autoenv/autoenv.plugin.zsh b/plugins/autoenv/autoenv.plugin.zsh
index 229a8a83..2f84f0ac 100644
--- a/plugins/autoenv/autoenv.plugin.zsh
+++ b/plugins/autoenv/autoenv.plugin.zsh
@@ -17,9 +17,13 @@ if ! type autoenv_init >/dev/null; then
/usr/local/bin
/usr/share/autoenv-git
~/Library/Python/bin
+ .venv/bin
+ venv/bin
+ env/bin
+ .env/bin
)
for d ( $install_locations ); do
- if [[ -e $d/activate.sh ]]; then
+ if [[ -e $d/activate || -e $d/activate.sh ]]; then
autoenv_dir=$d
break
fi
@@ -29,13 +33,13 @@ if ! type autoenv_init >/dev/null; then
# Look for Homebrew path as a last resort
if [[ -z "$autoenv_dir" ]] && (( $+commands[brew] )); then
d=$(brew --prefix)/opt/autoenv
- if [[ -e $d/activate.sh ]]; then
+ if [[ -e $d/activate || -e $d/activate.sh ]]; then
autoenv_dir=$d
fi
fi
# Complain if autoenv is not installed
- if [[ -z $autoenv_dir ]]; then
+ if [[ -z $autoenv_dir ]]; then
cat <&2
-------- AUTOENV ---------
Could not locate autoenv installation.
@@ -46,7 +50,11 @@ END
return 1
fi
# Load autoenv
- source $autoenv_dir/activate.sh
+ if [[ -e $autoenv_dir/activate ]]; then
+ source $autoenv_dir/activate
+ else
+ source $autoenv_dir/activate.sh
+ fi
fi
}
[[ $? != 0 ]] && return $?
diff --git a/plugins/autojump/autojump.plugin.zsh b/plugins/autojump/autojump.plugin.zsh
index e11f231b..1b868ee8 100644
--- a/plugins/autojump/autojump.plugin.zsh
+++ b/plugins/autojump/autojump.plugin.zsh
@@ -1,18 +1,18 @@
declare -a autojump_paths
autojump_paths=(
- $HOME/.autojump/etc/profile.d/autojump.zsh # manual installation
- $HOME/.autojump/share/autojump/autojump.zsh # manual installation
- $HOME/.nix-profile/etc/profile.d/autojump.sh # NixOS installation
- /run/current-system/sw/share/autojump/autojump.zsh # NixOS installation
- /usr/share/autojump/autojump.zsh # Debian and Ubuntu package
- /etc/profile.d/autojump.zsh # manual installation
- /etc/profile.d/autojump.sh # Gentoo installation
- /usr/local/share/autojump/autojump.zsh # FreeBSD installation
- /usr/pkg/share/autojump/autojump.zsh # NetBSD installation
- /opt/local/etc/profile.d/autojump.sh # macOS with MacPorts
- /usr/local/etc/profile.d/autojump.sh # macOS with Homebrew (default)
- /opt/homebrew/etc/profile.d/autojump.sh # macOS with Homebrew (default on M1 macs)
- /etc/profiles/per-user/$USER/bin/autojump # macOS Nix, Home Manager and flakes
+ $HOME/.autojump/etc/profile.d/autojump.zsh # manual installation
+ $HOME/.autojump/share/autojump/autojump.zsh # manual installation
+ $HOME/.nix-profile/etc/profile.d/autojump.sh # NixOS installation
+ /run/current-system/sw/share/autojump/autojump.zsh # NixOS installation
+ /usr/share/autojump/autojump.zsh # Debian and Ubuntu package
+ /etc/profile.d/autojump.zsh # manual installation
+ /etc/profile.d/autojump.sh # Gentoo installation
+ /usr/local/share/autojump/autojump.zsh # FreeBSD installation
+ /usr/pkg/share/autojump/autojump.zsh # NetBSD installation
+ /opt/local/etc/profile.d/autojump.sh # macOS with MacPorts
+ /usr/local/etc/profile.d/autojump.sh # macOS with Homebrew (default)
+ /opt/homebrew/etc/profile.d/autojump.sh # macOS with Homebrew (default on M1 macs)
+ /etc/profiles/per-user/$USER/etc/profile.d/autojump.sh # macOS Nix, Home Manager and flakes
)
for file in $autojump_paths; do
diff --git a/plugins/aws/README.md b/plugins/aws/README.md
index d6f4f460..9e1e055b 100644
--- a/plugins/aws/README.md
+++ b/plugins/aws/README.md
@@ -1,7 +1,8 @@
# aws
-This plugin provides completion support for [awscli](https://docs.aws.amazon.com/cli/latest/reference/index.html)
-and a few utilities to manage AWS profiles and display them in the prompt.
+This plugin provides completion support for [awscli v2](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/index.html)
+and a few utilities to manage AWS profiles/regions and display them in the prompt.
+[awscli v1](https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html) is no longer supported.
To use it, add `aws` to the plugins array in your zshrc file.
@@ -12,9 +13,12 @@ plugins=(... aws)
## Plugin commands
* `asp []`: sets `$AWS_PROFILE` and `$AWS_DEFAULT_PROFILE` (legacy) to ``.
- It also sets `$AWS_EB_PROFILE` to `` for the Elastic Beanstalk CLI.
+ It also sets `$AWS_EB_PROFILE` to `` for the Elastic Beanstalk CLI. It sets `$AWS_PROFILE_REGION` for display in `aws_prompt_info`.
Run `asp` without arguments to clear the profile.
-* `asp [] login`: If AWS SSO has been configured in your aws profile, it will run the `aws sso login` command following profile selection.
+* `asp [] login`: If AWS SSO has been configured in your aws profile, it will run the `aws sso login` command following profile selection.
+
+* `asr []`: sets `$AWS_REGION` and `$AWS_DEFAULT_REGION` (legacy) to ``.
+ Run `asr` without arguments to clear the profile.
* `acp [] []`: in addition to `asp` functionality, it actually changes
the profile by assuming the role specified in the `` configuration. It supports
@@ -25,25 +29,36 @@ plugins=(... aws)
* `agp`: gets the current value of `$AWS_PROFILE`.
+* `agr`: gets the current value of `$AWS_REGION`.
+
* `aws_change_access_key`: changes the AWS access key of a profile.
* `aws_profiles`: lists the available profiles in the `$AWS_CONFIG_FILE` (default: `~/.aws/config`).
Used to provide completion for the `asp` function.
+* `aws_regions`: lists the available regions.
+ Used to provide completion for the `asr` function.
+
## Plugin options
* Set `SHOW_AWS_PROMPT=false` in your zshrc file if you want to prevent the plugin from modifying your RPROMPT.
Some themes might overwrite the value of RPROMPT instead of appending to it, so they'll need to be fixed to
- see the AWS profile prompt.
+ see the AWS profile/region prompt.
## Theme
The plugin creates an `aws_prompt_info` function that you can use in your theme, which displays
-the current `$AWS_PROFILE`. It uses two variables to control how that is shown:
+the current `$AWS_PROFILE` and `$AWS_REGION`. It uses four variables to control how that is shown:
-* ZSH_THEME_AWS_PREFIX: sets the prefix of the AWS_PROFILE. Defaults to ``.
+* ZSH_THEME_AWS_PROFILE_SUFFIX: sets the suffix of the AWS_PROFILE. Defaults to `>`.
+
+* ZSH_THEME_AWS_REGION_PREFIX: sets the prefix of the AWS_REGION. Defaults to ``.
+
+* ZSH_THEME_AWS_DIVIDER: sets the divider between ZSH_THEME_AWS_PROFILE_SUFFIX and ZSH_THEME_AWS_REGION_PREFIX. Defaults to ` ` (single space).
## Configuration
@@ -53,7 +68,7 @@ the current `$AWS_PROFILE`. It uses two variables to control how that is shown:
Source profile credentials in `~/.aws/credentials`:
-```
+```ini
[source-profile-name]
aws_access_key_id = ...
aws_secret_access_key = ...
@@ -61,7 +76,7 @@ aws_secret_access_key = ...
Role configuration in `~/.aws/config`:
-```
+```ini
[profile source-profile-name]
mfa_serial = arn:aws:iam::111111111111:mfa/myuser
region = us-east-1
diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh
index 2167f552..c946515b 100644
--- a/plugins/aws/aws.plugin.zsh
+++ b/plugins/aws/aws.plugin.zsh
@@ -2,10 +2,14 @@ function agp() {
echo $AWS_PROFILE
}
+function agr() {
+ echo $AWS_REGION
+}
+
# AWS profile selection
function asp() {
if [[ -z "$1" ]]; then
- unset AWS_DEFAULT_PROFILE AWS_PROFILE AWS_EB_PROFILE
+ unset AWS_DEFAULT_PROFILE AWS_PROFILE AWS_EB_PROFILE AWS_PROFILE_REGION
echo AWS profile cleared.
return
fi
@@ -22,11 +26,32 @@ function asp() {
export AWS_PROFILE=$1
export AWS_EB_PROFILE=$1
+ export AWS_PROFILE_REGION=$(aws configure get region)
+
if [[ "$2" == "login" ]]; then
aws sso login
fi
}
+# AWS region selection
+function asr() {
+ if [[ -z "$1" ]]; then
+ unset AWS_DEFAULT_REGION AWS_REGION
+ echo AWS region cleared.
+ return
+ fi
+
+ local -a available_regions
+ available_regions=($(aws_regions))
+ if [[ -z "${available_regions[(r)$1]}" ]]; then
+ echo "${fg[red]}Available regions: \n$(aws_regions)"
+ return 1
+ fi
+
+ export AWS_REGION=$1
+ export AWS_DEFAULT_REGION=$1
+}
+
# AWS profile switch
function acp() {
if [[ -z "$1" ]]; then
@@ -135,21 +160,60 @@ function aws_change_access_key() {
return 1
fi
- echo "Insert the credentials when asked."
- asp "$1" || return 1
- AWS_PAGER="" aws iam create-access-key
- AWS_PAGER="" aws configure --profile "$1"
+ local profile="$1"
+ # Get current access key
+ local original_aws_access_key_id="$(aws configure get aws_access_key_id --profile $profile)"
- echo "You can now safely delete the old access key running \`aws iam delete-access-key --access-key-id ID\`"
+ asp "$profile" || return 1
+ echo "Generating a new access key pair for you now."
+ if aws --no-cli-pager iam create-access-key; then
+ echo "Insert the newly generated credentials when asked."
+ aws --no-cli-pager configure --profile $profile
+ else
+ echo "Current access keys:"
+ aws --no-cli-pager iam list-access-keys
+ echo "Profile \"${profile}\" is currently using the $original_aws_access_key_id key. You can delete an old access key by running \`aws --profile $profile iam delete-access-key --access-key-id AccessKeyId\`"
+ return 1
+ fi
+
+ read -q "yn?Would you like to disable your previous access key (${original_aws_access_key_id}) now? "
+ case $yn in
+ [Yy]*)
+ echo -n "\nDisabling access key ${original_aws_access_key_id}..."
+ if aws --no-cli-pager iam update-access-key --access-key-id ${original_aws_access_key_id} --status Inactive; then
+ echo "done."
+ else
+ echo "\nFailed to disable ${original_aws_access_key_id} key."
+ fi
+ ;;
+ *)
+ echo ""
+ ;;
+ esac
+ echo "You can now safely delete the old access key by running \`aws --profile $profile iam delete-access-key --access-key-id ${original_aws_access_key_id}\`"
echo "Your current keys are:"
- AWS_PAGER="" aws iam list-access-keys
+ aws --no-cli-pager iam list-access-keys
+}
+
+function aws_regions() {
+ if [[ $AWS_DEFAULT_PROFILE || $AWS_PROFILE ]];then
+ aws ec2 describe-regions |grep RegionName | awk -F ':' '{gsub(/"/, "", $2);gsub(/,/, "", $2);gsub(/ /, "", $2); print $2}'
+ else
+ echo "You must specify a AWS profile."
+ fi
}
function aws_profiles() {
+ aws --no-cli-pager configure list-profiles 2> /dev/null && return
[[ -r "${AWS_CONFIG_FILE:-$HOME/.aws/config}" ]] || return 1
grep --color=never -Eo '\[.*\]' "${AWS_CONFIG_FILE:-$HOME/.aws/config}" | sed -E 's/^[[:space:]]*\[(profile)?[[:space:]]*([^[:space:]]+)\][[:space:]]*$/\2/g'
}
+function _aws_regions() {
+ reply=($(aws_regions))
+}
+compctl -K _aws_regions asr
+
function _aws_profiles() {
reply=($(aws_profiles))
}
@@ -157,15 +221,25 @@ compctl -K _aws_profiles asp acp aws_change_access_key
# AWS prompt
function aws_prompt_info() {
- [[ -n "$AWS_PROFILE" ]] || return
- echo "${ZSH_THEME_AWS_PREFIX=}"
+ local _aws_to_show
+ local region="${AWS_REGION:-${AWS_DEFAULT_REGION:-$AWS_PROFILE_REGION}}"
+
+ if [[ -n "$AWS_PROFILE" ]];then
+ _aws_to_show+="${ZSH_THEME_AWS_PROFILE_PREFIX=""}"
+ fi
+
+ if [[ -n "$region" ]]; then
+ [[ -n "$_aws_to_show" ]] && _aws_to_show+="${ZSH_THEME_AWS_DIVIDER=" "}"
+ _aws_to_show+="${ZSH_THEME_AWS_REGION_PREFIX=""}"
+ fi
+
+ echo "$_aws_to_show"
}
if [[ "$SHOW_AWS_PROMPT" != false && "$RPROMPT" != *'$(aws_prompt_info)'* ]]; then
RPROMPT='$(aws_prompt_info)'"$RPROMPT"
fi
-
# Load awscli completions
# AWS CLI v2 comes with its own autocompletion. Check if that is there, otherwise fall back
@@ -210,3 +284,4 @@ else
[[ -r $_aws_zsh_completer_path ]] && source $_aws_zsh_completer_path
unset _aws_zsh_completer_path _brew_prefix
fi
+
diff --git a/plugins/azure/README.md b/plugins/azure/README.md
new file mode 100644
index 00000000..f3993085
--- /dev/null
+++ b/plugins/azure/README.md
@@ -0,0 +1,49 @@
+# azure
+
+This plugin provides completion support for [azure cli](https://docs.microsoft.com/en-us/cli/azure/)
+and a few utilities to manage azure subscriptions and display them in the prompt.
+
+To use it, add `azure` to the plugins array in your zshrc file.
+
+```zsh
+plugins=(... azure)
+```
+
+## Plugin commands
+
+
+* `az_subscriptions`: lists the available subscriptions in the `AZURE_CONFIG_DIR` (default: `~/.azure/`).
+ Used to provide completion for the `azss` function.
+
+* `azgs`: gets the current value of `$azure_subscription`.
+
+* `azss []`: sets the `$azure_subscription`.
+
+
+NOTE : because azure keeps the state of active subscription in ${AZURE_CONFIG_DIR:-$HOME/.azure/azureProfile.json}, the prompt command requires `jq` to be enabled to parse the file. If jq is not in the path the prompt will show nothing
+
+## Theme
+
+The plugin creates an `azure_prompt_info` function that you can use in your theme, which displays
+the current `$azure_subscription`. It uses two variables to control how that is shown:
+
+- ZSH_THEME_AZURE_PREFIX: sets the prefix of the azure_subscription. Defaults to ``.
+
+
+```
+RPROMPT='$(azure_prompt_info)'
+```
+
+## Develop
+
+On ubuntu get a working environment with :
+
+` docker run -it -v $(pwd):/mnt -w /mnt ubuntu bash`
+
+```
+apt install -y curl jq zsh git vim
+sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
+curl -sL https://aka.ms/InstallAzureCLIDeb | bash
+```
\ No newline at end of file
diff --git a/plugins/azure/azure.plugin.zsh b/plugins/azure/azure.plugin.zsh
new file mode 100644
index 00000000..b33b0f80
--- /dev/null
+++ b/plugins/azure/azure.plugin.zsh
@@ -0,0 +1,60 @@
+# AZ Get Subscriptions
+function azgs() {
+ az account show --output tsv --query 'name' 2>/dev/null
+}
+
+# AZ Subscription Selection
+alias azss="az account set --subscription"
+
+
+function az_subscriptions() {
+ az account list --all --output tsv --query '[*].name' 2> /dev/null
+}
+
+function _az_subscriptions() {
+ reply=($(az_subscriptions))
+}
+compctl -K _az_subscriptions azss
+
+# Azure prompt
+function azure_prompt_info() {
+ [[ ! -f "${AZURE_CONFIG_DIR:-$HOME/.azure}/azureProfile.json" ]] && return
+ # azgs is too expensive, if we have jq, we enable the prompt
+ (( $+commands[jq] )) || return 1
+ azgs=$(jq -r '.subscriptions[] | select(.isDefault==true) .name' "${AZURE_CONFIG_DIR:-$HOME/.azure}/azureProfile.json")
+ echo "${ZSH_THEME_AZURE_PREFIX:=}"
+}
+
+
+# Load az completions
+function _az-homebrew-installed() {
+ # check if Homebrew is installed
+ (( $+commands[brew] )) || return 1
+
+ # if so, we assume it's default way to install brew
+ if [[ ${commands[brew]:t2} == bin/brew ]]; then
+ _brew_prefix="${commands[brew]:h:h}" # remove trailing /bin/brew
+ else
+ # ok, it is not in the default prefix
+ # this call to brew is expensive (about 400 ms), so at least let's make it only once
+ _brew_prefix=$(brew --prefix)
+ fi
+}
+
+
+# get az.completion.sh location from $PATH
+_az_zsh_completer_path="$commands[az_zsh_completer.sh]"
+
+# otherwise check common locations
+if [[ -z $_az_zsh_completer_path ]]; then
+ # Homebrew
+ if _az-homebrew-installed; then
+ _az_zsh_completer_path=$_brew_prefix/etc/bash_completion.d/az
+ # Linux
+ else
+ _az_zsh_completer_path=/etc/bash_completion.d/azure-cli
+ fi
+fi
+
+[[ -r $_az_zsh_completer_path ]] && autoload -U +X bashcompinit && bashcompinit && source $_az_zsh_completer_path
+unset _az_zsh_completer_path _brew_prefix
diff --git a/plugins/battery/battery.plugin.zsh b/plugins/battery/battery.plugin.zsh
index db5eeb93..1d3d529a 100644
--- a/plugins/battery/battery.plugin.zsh
+++ b/plugins/battery/battery.plugin.zsh
@@ -13,6 +13,10 @@
# Author: Avneet Singh (kalsi-avneet) #
# Modified to add support for Android #
###########################################
+# Author: Not Pua (im-notpua) #
+# Modified to add support for OpenBSD #
+###########################################
+
if [[ "$OSTYPE" = darwin* ]]; then
function battery_is_charging() {
@@ -139,6 +143,46 @@ elif [[ "$OSTYPE" = linux-android ]] && (( ${+commands[termux-battery-status]} )
echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}"
fi
}
+elif [[ "$OSTYPE" = openbsd* ]]; then
+ function battery_is_charging() {
+ [[ $(apm -b) -eq 3 ]]
+ }
+ function battery_pct() {
+ apm -l
+ }
+ function battery_pct_remaining() {
+ if ! battery_is_charging; then
+ battery_pct
+ else
+ echo "External Power"
+ fi
+ }
+ function battery_time_remaining() {
+ local remaining_time
+ remaining_time=$(apm -m)
+ if [[ $remaining_time -ge 0 ]]; then
+ ((hour = $remaining_time / 60 ))
+ ((minute = $remaining_time % 60 ))
+ printf %02d:%02d $hour $minute
+ fi
+ }
+ function battery_pct_prompt() {
+ local battery_pct color
+ battery_pct=$(battery_pct_remaining)
+ if battery_is_charging; then
+ echo "∞"
+ else
+ if [[ $battery_pct -gt 50 ]]; then
+ color='green'
+ elif [[ $battery_pct -gt 20 ]]; then
+ color='yellow'
+ else
+ color='red'
+ fi
+ echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}"
+ fi
+ }
+
elif [[ "$OSTYPE" = linux* ]]; then
function battery_is_charging() {
if (( $+commands[acpitool] )); then
diff --git a/plugins/brew/README.md b/plugins/brew/README.md
index 9ce2c5bb..299393b2 100644
--- a/plugins/brew/README.md
+++ b/plugins/brew/README.md
@@ -10,28 +10,34 @@ plugins=(... brew)
## Shellenv
-If `brew` is not found in the PATH, this plugin will attempt to find it in common
-locations, and execute `brew shellenv` to set the environment appropriately.
-This plugin will also export `HOMEBREW_PREFIX="$(brew --prefix)"` if not previously
-defined for convenience.
+If `brew` is not found in the PATH, this plugin will attempt to find it in common locations, and execute
+`brew shellenv` to set the environment appropriately. This plugin will also export
+`HOMEBREW_PREFIX="$(brew --prefix)"` if not previously defined for convenience.
+
+In case you installed `brew` in a non-common location, you can still set `BREW_LOCATION` variable pointing to
+the `brew` binary before sourcing `oh-my-zsh.sh` and it'll set up the environment.
## Aliases
-| Alias | Command | Description |
-| -------- | ------------------------------------- | ------------------------------------------------------------------- |
-| `bcubc` | `brew upgrade --cask && brew cleanup` | Update outdated casks, then run cleanup. |
-| `bcubo` | `brew update && brew outdated --cask` | Update Homebrew data, then list outdated casks. |
-| `brewp` | `brew pin` | Pin a specified formula so that it's not upgraded. |
-| `brews` | `brew list -1` | List installed formulae or the installed files for a given formula. |
-| `brewsp` | `brew list --pinned` | List pinned formulae, or show the version of a given formula. |
-| `bubc` | `brew upgrade && brew cleanup` | Upgrade outdated formulae and casks, then run cleanup. |
-| `bubo` | `brew update && brew outdated` | Update Homebrew data, then list outdated formulae and casks. |
-| `bubu` | `bubo && bubc` | Do the last two operations above. |
-| `buf` | `brew upgrade --formula` | Upgrade only formulas (not casks). |
+| Alias | Command | Description |
+| -------- | --------------------------------------- | ------------------------------------------------------------------- |
+| `bcubc` | `brew upgrade --cask && brew cleanup` | Update outdated casks, then run cleanup. |
+| `bcubo` | `brew update && brew outdated --cask` | Update Homebrew data, then list outdated casks. |
+| `brewp` | `brew pin` | Pin a specified formula so that it's not upgraded. |
+| `brews` | `brew list -1` | List installed formulae or the installed files for a given formula. |
+| `brewsp` | `brew list --pinned` | List pinned formulae, or show the version of a given formula. |
+| `bubc` | `brew upgrade && brew cleanup` | Upgrade outdated formulae and casks, then run cleanup. |
+| `bugbc` | `brew upgrade --greedy && brew cleanup` | Upgrade outdated formulae and casks (greedy), then run cleanup. |
+| `bubo` | `brew update && brew outdated` | Update Homebrew data, then list outdated formulae and casks. |
+| `bubu` | `bubo && bubc` | Do the last two operations above. |
+| `bfu` | `brew upgrade --formula` | Upgrade only formulas (not casks). |
+| `buz` | `brew uninstall --zap` | Remove all files associated with a cask. |
## Completion
-With the release of Homebrew 1.0, they decided to bundle the zsh completion as part of the
-brew installation, so we no longer ship it with the brew plugin; now it only has brew
-aliases. If you find that brew completion no longer works, make sure you have your Homebrew
-installation fully up to date.
+This plugin configures paths with Homebrew's completion functions automatically, so you don't need to do it
+manually. See: https://docs.brew.sh/Shell-Completion#configuring-completions-in-zsh.
+
+With the release of Homebrew 1.0, they decided to bundle the zsh completion as part of the brew installation,
+so we no longer ship it with the brew plugin; now it only has brew aliases. If you find that brew completion
+no longer works, make sure you have your Homebrew installation fully up to date.
diff --git a/plugins/brew/brew.plugin.zsh b/plugins/brew/brew.plugin.zsh
index ea890082..44703637 100644
--- a/plugins/brew/brew.plugin.zsh
+++ b/plugins/brew/brew.plugin.zsh
@@ -1,5 +1,10 @@
if (( ! $+commands[brew] )); then
- if [[ -x /opt/homebrew/bin/brew ]]; then
+ if [[ -n "$BREW_LOCATION" ]]; then
+ if [[ ! -x "$BREW_LOCATION" ]]; then
+ echo "[oh-my-zsh] $BREW_LOCATION is not executable"
+ return
+ fi
+ elif [[ -x /opt/homebrew/bin/brew ]]; then
BREW_LOCATION="/opt/homebrew/bin/brew"
elif [[ -x /usr/local/bin/brew ]]; then
BREW_LOCATION="/usr/local/bin/brew"
@@ -25,14 +30,22 @@ if [[ -z "$HOMEBREW_PREFIX" ]]; then
export HOMEBREW_PREFIX="$(brew --prefix)"
fi
+if [[ -d "$HOMEBREW_PREFIX/share/zsh/site-functions" ]]; then
+ fpath+=("$HOMEBREW_PREFIX/share/zsh/site-functions")
+fi
+
alias bcubc='brew upgrade --cask && brew cleanup'
alias bcubo='brew update && brew outdated --cask'
+alias bcubc='brew upgrade --cask && brew cleanup'
alias brewp='brew pin'
alias brewsp='brew list --pinned'
alias bubc='brew upgrade && brew cleanup'
+alias bugbc='brew upgrade --greedy && brew cleanup'
alias bubo='brew update && brew outdated'
alias bubu='bubo && bubc'
-alias buf='brew upgrade --formula'
+alias bubug='bubo && bugbc'
+alias bfu='brew upgrade --formula'
+alias buz='brew uninstall --zap'
function brews() {
local formulae="$(brew leaves | xargs brew deps --installed --for-each)"
diff --git a/plugins/bridgetown/README.md b/plugins/bridgetown/README.md
new file mode 100644
index 00000000..0a41814e
--- /dev/null
+++ b/plugins/bridgetown/README.md
@@ -0,0 +1,26 @@
+# Bridgetown plugin
+
+This plugin adds some aliases and autocompletion for common [Bridgetown](https://bridgetownrb.com/) commands.
+
+To use it, add `bridgetown` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... bridgetown)
+```
+
+## Aliases
+
+| Alias | Command |
+|-------|----------------------------|
+| br | `bridgetown` |
+| bra | `bin/bridgetown apply` |
+| brb | `bin/bridgetown build` |
+| brc | `bin/bridgetown console` |
+| brclean | `bin/bridgetown clean` |
+| brd | `bin/bridgetown deploy` |
+| brdoc | `bin/bridgetown doctor` |
+| brh | `bin/bridgetown help` |
+| brn | `bridgetown new` |
+| brp | `bridgetown plugins` |
+| brpl | `bridgetown plugins list` |
+| brs | `bin/bridgetown start` |
diff --git a/plugins/bridgetown/bridgetown.plugin.zsh b/plugins/bridgetown/bridgetown.plugin.zsh
new file mode 100644
index 00000000..502e9dfe
--- /dev/null
+++ b/plugins/bridgetown/bridgetown.plugin.zsh
@@ -0,0 +1,12 @@
+alias br='bridgetown'
+alias bra='bin/bridgetown apply'
+alias brb='bin/bridgetown build'
+alias brc='bin/bridgetown console'
+alias brclean='bin/bridgetown clean'
+alias brd='bin/bridgetown deploy'
+alias brdoc='bin/bridgetown doctor'
+alias brh='bin/bridgetown help'
+alias brn='bridgetown new'
+alias brp='bridgetown plugins'
+alias brpl='bridgetown plugins list'
+alias brs='bin/bridgetown start'
diff --git a/plugins/bun/README.md b/plugins/bun/README.md
new file mode 100644
index 00000000..5a312370
--- /dev/null
+++ b/plugins/bun/README.md
@@ -0,0 +1,20 @@
+# Bun Plugin
+
+This plugin sets up completion for [Bun](https://bun.sh).
+
+To use it, add `bun` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... bun)
+```
+
+This plugin does not add any aliases.
+
+## Cache
+
+This plugin caches the completion script and is automatically updated when the
+plugin is loaded, which is usually when you start up a new terminal emulator.
+
+The cache is stored at:
+
+- `$ZSH_CACHE_DIR/completions/_bun_` completions script
diff --git a/plugins/bun/bun.plugin.zsh b/plugins/bun/bun.plugin.zsh
new file mode 100644
index 00000000..9924faa8
--- /dev/null
+++ b/plugins/bun/bun.plugin.zsh
@@ -0,0 +1,14 @@
+# If Bun is not found, don't do the rest of the script
+if (( ! $+commands[bun] )); then
+ return
+fi
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `bun`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_bun" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _bun
+ _comps[bun]=_bun
+fi
+
+bun completions >| "$ZSH_CACHE_DIR/completions/_bun" &|
diff --git a/plugins/cakephp3/cakephp3.plugin.zsh b/plugins/cakephp3/cakephp3.plugin.zsh
index dbfbeba3..a1a289fd 100644
--- a/plugins/cakephp3/cakephp3.plugin.zsh
+++ b/plugins/cakephp3/cakephp3.plugin.zsh
@@ -1,10 +1,10 @@
# CakePHP 3 basic command completion
_cakephp3_get_command_list () {
- bin/cake Completion commands
+ bin/cake completion commands
}
_cakephp3_get_sub_command_list () {
- bin/cake Completion subcommands ${words[2]}
+ bin/cake completion subcommands ${words[2]}
}
_cakephp3_get_3rd_argument () {
@@ -34,5 +34,5 @@ compdef _cakephp3 cake
#Alias
alias c3='bin/cake'
-alias c3cache='bin/cake orm_cache clear'
+alias c3cache='bin/cake schema_cache clear'
alias c3migrate='bin/cake migrations migrate'
diff --git a/plugins/colored-man-pages/colored-man-pages.plugin.zsh b/plugins/colored-man-pages/colored-man-pages.plugin.zsh
index 981992d8..57facbb5 100644
--- a/plugins/colored-man-pages/colored-man-pages.plugin.zsh
+++ b/plugins/colored-man-pages/colored-man-pages.plugin.zsh
@@ -36,6 +36,7 @@ function colored() {
# Prefer `less` whenever available, since we specifically configured
# environment for it.
environment+=( PAGER="${commands[less]:-$PAGER}" )
+ environment+=( GROFF_NO_SGR=1 )
# See ./nroff script.
if [[ "$OSTYPE" = solaris* ]]; then
diff --git a/plugins/dbt/README.md b/plugins/dbt/README.md
new file mode 100644
index 00000000..e05d79cc
--- /dev/null
+++ b/plugins/dbt/README.md
@@ -0,0 +1,29 @@
+# dbt plugin
+
+## Introduction
+
+The `dbt plugin` adds several aliases for useful [dbt](https://docs.getdbt.com/) commands and
+[aliases](#aliases).
+
+To use it, add `dbt` to the plugins array of your zshrc file:
+
+```
+plugins=(... dbt)
+```
+
+## Aliases
+
+| Alias | Command | Description |
+| ------ | ------------------------------------------------ | ---------------------------------------------------- |
+| dbtlm | `dbt ls -s state:modified` | List modified models only |
+| dbtrm | `dbt run -s state:modified` | Run modified models only |
+| dbttm | `dbt test -m state:modified` | Test modified models only |
+| dbtrtm | `dbtrm && dbttm` | Run and test modified models only |
+| dbtrs | `dbt clean; dbt deps; dbt seed` | Re-seed data |
+| dbtfrt | `dbtrs; dbt run --full-refresh; dbt test` | Perform a full fresh run with tests |
+| dbtcds | `dbt docs generate; dbt docs serve` | Generate docs without compiling |
+| dbtds | `dbt docs generate --no-compile; dbt docs serve` | Generate and serve docs skipping doc. re-compilation |
+
+## Maintainer
+
+### [msempere](https://github.com/msempere)
diff --git a/plugins/dbt/dbt.plugin.zsh b/plugins/dbt/dbt.plugin.zsh
new file mode 100644
index 00000000..6fcc2eec
--- /dev/null
+++ b/plugins/dbt/dbt.plugin.zsh
@@ -0,0 +1,23 @@
+# list modified models only
+alias dbtlm="dbt ls -s state:modified"
+
+# run modified models only
+alias dbtrm="dbt run -s state:modified"
+
+# test modified models only
+alias dbttm="dbt test -m state:modified"
+
+# run and test modified models only
+alias dbtrtm="dbtrm && dbttm"
+
+# re-seed data
+alias dbtrs="dbt clean; dbt deps; dbt seed"
+
+# perform a full fresh run with tests
+alias dbtfrt="dbtrs; dbt run --full-refresh; dbt test"
+
+# generate and serve docs
+alias dbtcds="dbt docs generate; dbt docs serve"
+
+# generate and serve docs skipping doc. re-compilation
+alias dbtds="dbt docs generate --no-compile; dbt docs serve"
diff --git a/plugins/debian/README.md b/plugins/debian/README.md
index c1ebe1c5..6835ad65 100644
--- a/plugins/debian/README.md
+++ b/plugins/debian/README.md
@@ -13,7 +13,12 @@ plugins=(... debian)
- `$apt_pref`: use aptitude or apt if installed, fallback is apt-get.
- `$apt_upgr`: use upgrade or safe-upgrade (for aptitude).
-Set `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh My Zsh) to override this behavior.
+Set **both** `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh My Zsh) to override this behavior, e.g.:
+
+```sh
+apt_pref='apt'
+apt_upgr='full-upgrade'
+```
## Common Aliases
@@ -21,7 +26,7 @@ Set `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh
| ------ | ---------------------------------------------------------------------- | ---------------------------------------------------------- |
| `age` | `apt-get` | Command line tool for handling packages |
| `api` | `aptitude` | Same functionality as `apt-get`, provides extra options |
-| `acse` | `apt-cache search` | Command line tool for searching apt software package cache |
+| `acs` | `apt-cache search` | Command line tool for searching apt software package cache |
| `aps` | `aptitude search` | Searches installed packages using aptitude |
| `as` | `aptitude -F '* %p -> %d \n(%v/%V)' --no-gui --disable-columns search` | Print searched packages using a custom format |
| `afs` | `apt-file search --regexp` | Search file in packages |
diff --git a/plugins/debian/debian.plugin.zsh b/plugins/debian/debian.plugin.zsh
index bab1ae1c..5ef4cfb6 100644
--- a/plugins/debian/debian.plugin.zsh
+++ b/plugins/debian/debian.plugin.zsh
@@ -26,7 +26,7 @@ alias age='apt-get'
alias api='aptitude'
# Some self-explanatory aliases
-alias acse="apt-cache search"
+alias acs="apt-cache search"
alias aps='aptitude search'
alias as="aptitude -F '* %p -> %d \n(%v/%V)' --no-gui --disable-columns search"
diff --git a/plugins/deno/README.md b/plugins/deno/README.md
index 69131839..38f9f203 100644
--- a/plugins/deno/README.md
+++ b/plugins/deno/README.md
@@ -4,16 +4,17 @@ This plugin sets up completion and aliases for [Deno](https://deno.land).
## Aliases
-| Alias | Full command |
-| ----- | ---------------- |
-| db | deno bundle |
-| dc | deno compile |
-| dca | deno cache |
-| dfmt | deno fmt |
-| dh | deno help |
-| dli | deno lint |
-| drn | deno run |
-| drA | deno run -A |
-| drw | deno run --watch |
-| dts | deno test |
-| dup | deno upgrade |
+| Alias | Full command |
+| ----- | ------------------- |
+| db | deno bundle |
+| dc | deno compile |
+| dca | deno cache |
+| dfmt | deno fmt |
+| dh | deno help |
+| dli | deno lint |
+| drn | deno run |
+| drA | deno run -A |
+| drw | deno run --watch |
+| dru | deno run --unstable |
+| dts | deno test |
+| dup | deno upgrade |
diff --git a/plugins/deno/deno.plugin.zsh b/plugins/deno/deno.plugin.zsh
index 7708f84d..bf97d6f0 100644
--- a/plugins/deno/deno.plugin.zsh
+++ b/plugins/deno/deno.plugin.zsh
@@ -8,6 +8,7 @@ alias dli='deno lint'
alias drn='deno run'
alias drA='deno run -A'
alias drw='deno run --watch'
+alias dru='deno run --unstable'
alias dts='deno test'
alias dup='deno upgrade'
diff --git a/plugins/dirhistory/dirhistory.plugin.zsh b/plugins/dirhistory/dirhistory.plugin.zsh
index 7021fc03..8d67c618 100644
--- a/plugins/dirhistory/dirhistory.plugin.zsh
+++ b/plugins/dirhistory/dirhistory.plugin.zsh
@@ -19,15 +19,17 @@ export DIRHISTORY_SIZE=30
# Returns the element if the array was not empty,
# otherwise returns empty string.
function pop_past() {
- typeset -g $1="${dirhistory_past[$#dirhistory_past]}"
+ setopt localoptions no_ksh_arrays
if [[ $#dirhistory_past -gt 0 ]]; then
+ typeset -g $1="${dirhistory_past[$#dirhistory_past]}"
dirhistory_past[$#dirhistory_past]=()
fi
}
function pop_future() {
- typeset -g $1="${dirhistory_future[$#dirhistory_future]}"
+ setopt localoptions no_ksh_arrays
if [[ $#dirhistory_future -gt 0 ]]; then
+ typeset -g $1="${dirhistory_future[$#dirhistory_future]}"
dirhistory_future[$#dirhistory_future]=()
fi
}
@@ -35,6 +37,7 @@ function pop_future() {
# Push a new element onto the end of dirhistory_past. If the size of the array
# is >= DIRHISTORY_SIZE, the array is shifted
function push_past() {
+ setopt localoptions no_ksh_arrays
if [[ $#dirhistory_past -ge $DIRHISTORY_SIZE ]]; then
shift dirhistory_past
fi
@@ -44,6 +47,7 @@ function push_past() {
}
function push_future() {
+ setopt localoptions no_ksh_arrays
if [[ $#dirhistory_future -ge $DIRHISTORY_SIZE ]]; then
shift dirhistory_future
fi
diff --git a/plugins/dnf/README.md b/plugins/dnf/README.md
index dc0d1e0a..f45c8778 100644
--- a/plugins/dnf/README.md
+++ b/plugins/dnf/README.md
@@ -10,6 +10,9 @@ To use it, add `dnf` to the plugins array in your zshrc file:
plugins=(... dnf)
```
+Classic `dnf` is getting superseded by `dnf5`; this plugin detects the presence
+of `dnf5` and uses it as drop-in alternative to the slower `dnf`.
+
## Aliases
| Alias | Command | Description |
diff --git a/plugins/dnf/dnf.plugin.zsh b/plugins/dnf/dnf.plugin.zsh
index 653ce7dd..642422fe 100644
--- a/plugins/dnf/dnf.plugin.zsh
+++ b/plugins/dnf/dnf.plugin.zsh
@@ -1,15 +1,19 @@
## Aliases
+local dnfprog="dnf"
-alias dnfl="dnf list" # List packages
-alias dnfli="dnf list installed" # List installed packages
-alias dnfgl="dnf grouplist" # List package groups
-alias dnfmc="dnf makecache" # Generate metadata cache
-alias dnfp="dnf info" # Show package information
-alias dnfs="dnf search" # Search package
+# Prefer dnf5 if installed
+command -v dnf5 > /dev/null && dnfprog=dnf5
-alias dnfu="sudo dnf upgrade" # Upgrade package
-alias dnfi="sudo dnf install" # Install package
-alias dnfgi="sudo dnf groupinstall" # Install package group
-alias dnfr="sudo dnf remove" # Remove package
-alias dnfgr="sudo dnf groupremove" # Remove package group
-alias dnfc="sudo dnf clean all" # Clean cache
+alias dnfl="${dnfprog} list" # List packages
+alias dnfli="${dnfprog} list installed" # List installed packages
+alias dnfgl="${dnfprog} grouplist" # List package groups
+alias dnfmc="${dnfprog} makecache" # Generate metadata cache
+alias dnfp="${dnfprog} info" # Show package information
+alias dnfs="${dnfprog} search" # Search package
+
+alias dnfu="sudo ${dnfprog} upgrade" # Upgrade package
+alias dnfi="sudo ${dnfprog} install" # Install package
+alias dnfgi="sudo ${dnfprog} groupinstall" # Install package group
+alias dnfr="sudo ${dnfprog} remove" # Remove package
+alias dnfgr="sudo ${dnfprog} groupremove" # Remove package group
+alias dnfc="sudo ${dnfprog} clean all" # Clean cache
diff --git a/plugins/docker-compose/README.md b/plugins/docker-compose/README.md
index 13f3c2ce..bbcff2e0 100644
--- a/plugins/docker-compose/README.md
+++ b/plugins/docker-compose/README.md
@@ -11,22 +11,23 @@ plugins=(... docker-compose)
## Aliases
-| Alias | Command | Description |
-|-----------|--------------------------------|------------------------------------------------------------------|
-| dco | `docker-compose` | Docker-compose main command |
-| dcb | `docker-compose build` | Build containers |
-| dce | `docker-compose exec` | Execute command inside a container |
-| dcps | `docker-compose ps` | List containers |
-| dcrestart | `docker-compose restart` | Restart container |
-| dcrm | `docker-compose rm` | Remove container |
-| dcr | `docker-compose run` | Run a command in container |
-| dcstop | `docker-compose stop` | Stop a container |
-| dcup | `docker-compose up` | Build, (re)create, start, and attach to containers for a service |
-| dcupb | `docker-compose up --build` | Same as `dcup`, but build images before starting containers |
-| dcupd | `docker-compose up -d` | Same as `dcup`, but starts as daemon |
-| dcdn | `docker-compose down` | Stop and remove containers |
-| dcl | `docker-compose logs` | Show logs of container |
-| dclf | `docker-compose logs -f` | Show logs and follow output |
-| dcpull | `docker-compose pull` | Pull image of a service |
-| dcstart | `docker-compose start` | Start a container |
-| dck | `docker-compose kill` | Kills containers |
+| Alias | Command | Description |
+|-----------|--------------------------------|----------------------------------------------------------------------------------|
+| dco | `docker-compose` | Docker-compose main command |
+| dcb | `docker-compose build` | Build containers |
+| dce | `docker-compose exec` | Execute command inside a container |
+| dcps | `docker-compose ps` | List containers |
+| dcrestart | `docker-compose restart` | Restart container |
+| dcrm | `docker-compose rm` | Remove container |
+| dcr | `docker-compose run` | Run a command in container |
+| dcstop | `docker-compose stop` | Stop a container |
+| dcup | `docker-compose up` | Build, (re)create, start, and attach to containers for a service |
+| dcupb | `docker-compose up --build` | Same as `dcup`, but build images before starting containers |
+| dcupd | `docker-compose up -d` | Same as `dcup`, but starts as daemon |
+| dcupdb | `docker-compose up -d --build` | Same as `dcup`, but build images before starting containers and starts as daemon |
+| dcdn | `docker-compose down` | Stop and remove containers |
+| dcl | `docker-compose logs` | Show logs of container |
+| dclf | `docker-compose logs -f` | Show logs and follow output |
+| dcpull | `docker-compose pull` | Pull image of a service |
+| dcstart | `docker-compose start` | Start a container |
+| dck | `docker-compose kill` | Kills containers |
diff --git a/plugins/docker-compose/docker-compose.plugin.zsh b/plugins/docker-compose/docker-compose.plugin.zsh
index b8a4b067..7a8bf4a0 100644
--- a/plugins/docker-compose/docker-compose.plugin.zsh
+++ b/plugins/docker-compose/docker-compose.plugin.zsh
@@ -12,6 +12,7 @@ alias dcstop="$dccmd stop"
alias dcup="$dccmd up"
alias dcupb="$dccmd up --build"
alias dcupd="$dccmd up -d"
+alias dcupdb="$dccmd up -d --build"
alias dcdn="$dccmd down"
alias dcl="$dccmd logs"
alias dclf="$dccmd logs -f"
diff --git a/plugins/docker/README.md b/plugins/docker/README.md
index 606690f1..0ab2e41f 100644
--- a/plugins/docker/README.md
+++ b/plugins/docker/README.md
@@ -13,18 +13,15 @@ https://github.com/docker/cli/blob/master/contrib/completion/zsh/_docker
## Settings
-By default, the completion doesn't allow option-stacking, meaning if you try to
-complete `docker run -it ` it won't work, because you're _stacking_ the
-`-i` and `-t` options.
+By default, the completion doesn't allow option-stacking, meaning if you try to complete
+`docker run -it ` it won't work, because you're _stacking_ the `-i` and `-t` options.
-[You can enable it](https://github.com/docker/cli/commit/b10fb43048) by **adding
-the lines below to your zshrc file**, but be aware of the side effects:
+[You can enable it](https://github.com/docker/cli/commit/b10fb43048) by **adding the lines below to your zshrc
+file**, but be aware of the side effects:
-> This enables Zsh to understand commands like `docker run -it
-> ubuntu`. However, by enabling this, this also makes Zsh complete
-> `docker run -u` with `docker run -uapprox` which is not valid. The
-> users have to put the space or the equal sign themselves before trying
-> to complete.
+> This enables Zsh to understand commands like `docker run -it ubuntu`. However, by enabling this, this also
+> makes Zsh complete `docker run -u` with `docker run -uapprox` which is not valid. The users have to put
+> the space or the equal sign themselves before trying to complete.
>
> Therefore, this behavior is disabled by default. To enable it:
>
@@ -33,41 +30,49 @@ the lines below to your zshrc file**, but be aware of the side effects:
> zstyle ':completion:*:*:docker-*:*' option-stacking yes
> ```
+### Use old-style completion
+
+If the current completion does not work well for you, you can enable legacy completion instead with the
+following setting. See https://github.com/ohmyzsh/ohmyzsh/issues/11789 for more information.
+
+```zsh
+zstyle ':omz:plugins:docker' legacy-completion yes
+```
+
## Aliases
-| Alias | Command | Description |
-| :------ | :-------------------------- | :--------------------------------------------------------------------------------------- |
-| dbl | `docker build` | Build an image from a Dockerfile |
-| dcin | `docker container inspect` | Display detailed information on one or more containers |
-| dlo | `docker container logs` | Fetch the logs of a docker container |
-| dcls | `docker container ls` | List all the running docker containers |
-| dclsa | `docker container ls -a` | List all running and stopped containers |
-| dpo | `docker container port` | List port mappings or a specific mapping for the container |
-| dpu | `docker pull` | Pull an image or a repository from a registry |
-| dr | `docker container run` | Create a new container and start it using the specified command |
-| drit | `docker container run -it` | Create a new container and start it in an interactive shell |
-| drm | `docker container rm` | Remove the specified container(s) |
-| drm! | `docker container rm -f` | Force the removal of a running container (uses SIGKILL) |
-| dst | `docker container start` | Start one or more stopped containers |
-| dstp | `docker container stop` | Stop one or more running containers |
-| dtop | `docker top` | Display the running processes of a container |
-| dxc | `docker container exec` | Run a new command in a running container |
-| dxcit | `docker container exec -it` | Run a new command in a running container in an interactive shell |
-| | | **Docker Images** |
-| dib | `docker image build` | Build an image from a Dockerfile (same as docker build) |
-| dii | `docker image inspect` | Display detailed information on one or more images |
-| dils | `docker image ls` | List docker images |
-| dipu | `docker image push` | Push an image or repository to a remote registry |
-| dirm | `docker image rm` | Remove one or more images |
-| dit | `docker image tag` | Add a name and tag to a particular image |
-| | | **Docker Network** |
-| dnc | `docker network create` | Create a new network |
-| dncn | `docker network connect` | Connect a container to a network |
-| dndcn | `docker network disconnect` | Disconnect a container from a network |
-| dni | `docker network inspect` | Return information about one or more networks |
-| dnls | `docker network ls` | List all networks the engine daemon knows about, including those spanning multiple hosts |
-| dnrm | `docker network rm` | Remove one or more networks |
-| | | **Docker Volume** |
-| dvi | `docker volume inspect` | Display detailed information about one or more volumes |
-| dvls | `docker volume ls` | List all the volumes known to docker |
-| dvprune | `docker volume prune` | Cleanup dangling volumes |
+| Alias | Command | Description |
+| :------ | :---------------------------- | :--------------------------------------------------------------------------------------- |
+| dbl | `docker build` | Build an image from a Dockerfile |
+| dcin | `docker container inspect` | Display detailed information on one or more containers |
+| dcls | `docker container ls` | List all the running docker containers |
+| dclsa | `docker container ls -a` | List all running and stopped containers |
+| dib | `docker image build` | Build an image from a Dockerfile (same as docker build) |
+| dii | `docker image inspect` | Display detailed information on one or more images |
+| dils | `docker image ls` | List docker images |
+| dipu | `docker image push` | Push an image or repository to a remote registry |
+| dirm | `docker image rm` | Remove one or more images |
+| dit | `docker image tag` | Add a name and tag to a particular image |
+| dlo | `docker container logs` | Fetch the logs of a docker container |
+| dnc | `docker network create` | Create a new network |
+| dncn | `docker network connect` | Connect a container to a network |
+| dndcn | `docker network disconnect` | Disconnect a container from a network |
+| dni | `docker network inspect` | Return information about one or more networks |
+| dnls | `docker network ls` | List all networks the engine daemon knows about, including those spanning multiple hosts |
+| dnrm | `docker network rm` | Remove one or more networks |
+| dpo | `docker container port` | List port mappings or a specific mapping for the container |
+| dpu | `docker pull` | Pull an image or a repository from a registry |
+| dr | `docker container run` | Create a new container and start it using the specified command |
+| drit | `docker container run -it` | Create a new container and start it in an interactive shell |
+| drm | `docker container rm` | Remove the specified container(s) |
+| drm! | `docker container rm -f` | Force the removal of a running container (uses SIGKILL) |
+| dst | `docker container start` | Start one or more stopped containers |
+| drs | `docker container restart` | Restart one or more containers |
+| dsta | `docker stop $(docker ps -q)` | Stop all running containers |
+| dstp | `docker container stop` | Stop one or more running containers |
+| dtop | `docker top` | Display the running processes of a container |
+| dvi | `docker volume inspect` | Display detailed information about one or more volumes |
+| dvls | `docker volume ls` | List all the volumes known to docker |
+| dvprune | `docker volume prune` | Cleanup dangling volumes |
+| dxc | `docker container exec` | Run a new command in a running container |
+| dxcit | `docker container exec -it` | Run a new command in a running container in an interactive shell |
diff --git a/plugins/docker/_docker b/plugins/docker/completions/_docker
similarity index 97%
rename from plugins/docker/_docker
rename to plugins/docker/completions/_docker
index 8ee35abc..466b09d9 100644
--- a/plugins/docker/_docker
+++ b/plugins/docker/completions/_docker
@@ -567,7 +567,7 @@ __docker_container_commands() {
"cp:Copy files/folders between a container and the local filesystem"
"create:Create a new container"
"diff:Inspect changes on a container's filesystem"
- "exec:Run a command in a running container"
+ "exec:Execute a command in a running container"
"export:Export a container's filesystem as a tar archive"
"inspect:Display detailed information on one or more containers"
"kill:Kill one or more running containers"
@@ -579,7 +579,7 @@ __docker_container_commands() {
"rename:Rename a container"
"restart:Restart one or more containers"
"rm:Remove one or more containers"
- "run:Run a command in a new container"
+ "run:Create and run a new container from an image"
"start:Start one or more stopped containers"
"stats:Display a live stream of container(s) resource usage statistics"
"stop:Stop one or more running containers"
@@ -602,6 +602,7 @@ __docker_container_subcommand() {
opts_create_run=(
"($help -a --attach)"{-a=,--attach=}"[Attach to stdin, stdout or stderr]:device:(STDIN STDOUT STDERR)"
"($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: "
+ "($help)*--annotation=[Add an annotation to the container (passed through to the OCI runtime)]:annotations: "
"($help)*--blkio-weight-device=[Block IO (relative device weight)]:device:Block IO weight: "
"($help)*--cap-add=[Add Linux capabilities]:capability: "
"($help)*--cap-drop=[Drop Linux capabilities]:capability: "
@@ -650,6 +651,7 @@ __docker_container_subcommand() {
"($help)*"{-p=,--publish=}"[Expose a container's port to the host]:port:_ports"
"($help)--pid=[PID namespace to use]:PID namespace:__docker_complete_pid"
"($help)--privileged[Give extended privileges to this container]"
+ "($help -q --quiet)"{-q,--quiet}"[Suppress the pull output]"
"($help)--read-only[Mount the container's root filesystem as read only]"
"($help)*--security-opt=[Security options]:security option: "
"($help)*--shm-size=[Size of '/dev/shm' (format is '')]:shm size: "
@@ -661,7 +663,7 @@ __docker_container_subcommand() {
"($help)*--ulimit=[ulimit options]:ulimit: "
"($help)--userns=[Container user namespace]:user namespace:(host)"
"($help)--tmpfs[mount tmpfs]"
- "($help)*-v[Bind mount a volume]:volume: "
+ "($help)*-v[Bind mount a volume]:volume:_directories -W / -P '/' -S '\:' -r '/ '"
"($help)--volume-driver=[Optional volume driver for the container]:volume driver:(local)"
"($help)*--volumes-from=[Mount volumes from the specified container]:volume: "
"($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories"
@@ -802,7 +804,7 @@ __docker_container_subcommand() {
"($help -a --all)"{-a,--all}"[Show all containers]" \
"($help)--before=[Show only container created before...]:containers:__docker_complete_containers" \
"($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_ps_filters" \
- "($help)--format=[Pretty-print containers using a Go template]:template: " \
+ "($help)--format=[Format the output using the given Go template]:template: " \
"($help -l --latest)"{-l,--latest}"[Show only the latest created container]" \
"($help -n --last)"{-n=,--last=}"[Show n last created containers (includes all states)]:n:(1 5 10 25 50)" \
"($help)--no-trunc[Do not truncate output]" \
@@ -907,7 +909,7 @@ __docker_container_subcommand() {
_arguments $(__docker_arguments) \
$opts_help \
"($help -a --all)"{-a,--all}"[Show all containers (default shows just running)]" \
- "($help)--format=[Pretty-print images using a Go template]:template: " \
+ "($help)--format=[Format the output using the given Go template]:template: " \
"($help)--no-stream[Disable streaming stats and only pull the first result]" \
"($help)--no-trunc[Do not truncate output]" \
"($help -)*:containers:__docker_complete_running_containers" && ret=0
@@ -973,8 +975,8 @@ __docker_image_commands() {
"load:Load an image from a tar archive or STDIN"
"ls:List images"
"prune:Remove unused images"
- "pull:Pull an image or a repository from a registry"
- "push:Push an image or a repository to a registry"
+ "pull:Download an image from a registry"
+ "push:Upload an image to a registry"
"rm:Remove one or more images"
"save:Save one or more images to a tar archive (streamed to STDOUT by default)"
"tag:Tag an image into a repository"
@@ -1060,7 +1062,7 @@ __docker_image_subcommand() {
"($help -a --all)"{-a,--all}"[Show all images]" \
"($help)--digests[Show digests]" \
"($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_images_filters" \
- "($help)--format=[Pretty-print images using a Go template]:template: " \
+ "($help)--format=[Format the output using the given Go template]:template: " \
"($help)--no-trunc[Do not truncate output]" \
"($help -q --quiet)"{-q,--quiet}"[Only show image IDs]" \
"($help -): :__docker_complete_repositories" && ret=0
@@ -1082,7 +1084,7 @@ __docker_image_subcommand() {
(push)
_arguments $(__docker_arguments) \
$opts_help \
- "($help -a --all-tags)"{-a,--all-tags}"[Push all tagged images in the repository]" \
+ "($help -a --all-tags)"{-a,--all-tags}"[Push all tags of an image to the repository]" \
"($help)--disable-content-trust[Skip image signing]" \
"($help -): :__docker_complete_images" && ret=0
;;
@@ -1292,7 +1294,7 @@ __docker_network_subcommand() {
$opts_help \
"($help)--no-trunc[Do not truncate the output]" \
"($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_network_complete_ls_filters" \
- "($help)--format=[Pretty-print networks using a Go template]:template: " \
+ "($help)--format=[Format the output using the given Go template]:template: " \
"($help -q --quiet)"{-q,--quiet}"[Only display network IDs]" && ret=0
;;
(prune)
@@ -2050,7 +2052,7 @@ __docker_service_subcommand() {
_arguments $(__docker_arguments) \
$opts_help \
"($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_service_complete_ls_filters" \
- "($help)--format=[Pretty-print services using a Go template]:template: " \
+ "($help)--format=[Format the output using the given Go template]:template: " \
"($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
;;
(rm|remove)
@@ -2253,7 +2255,7 @@ __docker_stack_subcommand() {
_arguments $(__docker_arguments) \
$opts_help \
"($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_services_filters" \
- "($help)--format=[Pretty-print services using a Go template]:template: " \
+ "($help)--format=[Format the output using the given Go template]:template: " \
"($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \
"($help -):stack:__docker_complete_stacks" && ret=0
;;
@@ -2520,12 +2522,14 @@ __docker_volume_subcommand() {
_arguments $(__docker_arguments) \
$opts_help \
"($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_volume_complete_ls_filters" \
- "($help)--format=[Pretty-print volumes using a Go template]:template: " \
+ "($help)--format=[Format the output using the given Go template]:template: " \
"($help -q --quiet)"{-q,--quiet}"[Only display volume names]" && ret=0
;;
(prune)
_arguments $(__docker_arguments) \
$opts_help \
+ "($help -a --all)"{-a,--all}"[Remove all unused local volumes, not just anonymous ones]" \
+ "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
"($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0
;;
(rm)
@@ -2582,10 +2586,8 @@ __docker_context_subcommand() {
(create)
_arguments $(__docker_arguments) \
$opts_help \
- "($help)--default-stack-orchestrator=[Default orchestrator for stack operations to use with this context]:default-stack-orchestrator:(swarm kubernetes all)" \
"($help)--description=[Description of the context]:description:" \
"($help)--docker=[Set the docker endpoint]:docker:" \
- "($help)--kubernetes=[Set the kubernetes endpoint]:kubernetes:" \
"($help)--from=[Create context from a named context]:from:__docker_complete_contexts" \
"($help -):name: " && ret=0
;;
@@ -2607,10 +2609,8 @@ __docker_context_subcommand() {
(update)
_arguments $(__docker_arguments) \
$opts_help \
- "($help)--default-stack-orchestrator=[Default orchestrator for stack operations to use with this context]:default-stack-orchestrator:(swarm kubernetes all)" \
"($help)--description=[Description of the context]:description:" \
"($help)--docker=[Set the docker endpoint]:docker:" \
- "($help)--kubernetes=[Set the kubernetes endpoint]:kubernetes:" \
"($help -):name:" && ret=0
;;
esac
@@ -2734,9 +2734,6 @@ __docker_subcommand() {
"($help -b --bridge)"{-b=,--bridge=}"[Attach containers to a network bridge]:bridge:_net_interfaces" \
"($help)--bip=[Network bridge IP]:IP address: " \
"($help)--cgroup-parent=[Parent cgroup for all containers]:cgroup: " \
- "($help)--cluster-advertise=[Address or interface name to advertise]:Instance to advertise (host\:port): " \
- "($help)--cluster-store=[URL of the distributed storage backend]:Cluster Store:->cluster-store" \
- "($help)*--cluster-store-opt=[Cluster store options]:Cluster options:->cluster-store-options" \
"($help)--config-file=[Path to daemon configuration file]:Config File:_files" \
"($help)--containerd=[Path to containerd socket]:socket:_files -g \"*.sock\"" \
"($help)--containerd-namespace=[Containerd namespace to use]:containerd namespace:" \
@@ -2771,16 +2768,16 @@ __docker_subcommand() {
"($help)--live-restore[Enable live restore of docker when containers are still running]" \
"($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" \
"($help)*--log-opt=[Default log driver options for containers]:log driver options:__docker_complete_log_options" \
- "($help)--max-concurrent-downloads[Set the max concurrent downloads for each pull]" \
- "($help)--max-concurrent-uploads[Set the max concurrent uploads for each push]" \
+ "($help)--max-concurrent-downloads[Set the max concurrent downloads]" \
+ "($help)--max-concurrent-uploads[Set the max concurrent uploads]" \
"($help)--max-download-attempts[Set the max download attempts for each pull]" \
"($help)--mtu=[Network MTU]:mtu:(0 576 1420 1500 9000)" \
"($help)--oom-score-adjust=[Set the oom_score_adj for the daemon]:oom-score:(-500)" \
"($help -p --pidfile)"{-p=,--pidfile=}"[Path to use for daemon PID file]:PID file:_files" \
"($help)--raw-logs[Full timestamps without ANSI coloring]" \
- "($help)*--registry-mirror=[Preferred Docker registry mirror]:registry mirror: " \
+ "($help)*--registry-mirror=[Preferred registry mirror]:registry mirror: " \
"($help)--seccomp-profile=[Path to seccomp profile]:path:_files -g \"*.json\"" \
- "($help -s --storage-driver)"{-s=,--storage-driver=}"[Storage driver to use]:driver:(aufs btrfs devicemapper overlay overlay2 vfs zfs)" \
+ "($help -s --storage-driver)"{-s=,--storage-driver=}"[Storage driver to use]:driver:(btrfs devicemapper overlay2 vfs zfs)" \
"($help)--selinux-enabled[Enable selinux support]" \
"($help)--shutdown-timeout=[Set the shutdown timeout value in seconds]:time: " \
"($help)*--storage-opt=[Storage driver options]:storage driver options: " \
@@ -2795,22 +2792,6 @@ __docker_subcommand() {
"($help)--validate[Validate daemon configuration and exit]" && ret=0
case $state in
- (cluster-store)
- if compset -P '*://'; then
- _message 'host:port' && ret=0
- else
- store=('consul' 'etcd' 'zk')
- _describe -t cluster-store "Cluster Store" store -qS "://" && ret=0
- fi
- ;;
- (cluster-store-options)
- if compset -P '*='; then
- _files && ret=0
- else
- opts=('discovery.heartbeat' 'discovery.ttl' 'kv.cacertfile' 'kv.certfile' 'kv.keyfile' 'kv.path')
- _describe -t cluster-store-opts "Cluster Store Options" opts -qS "=" && ret=0
- fi
- ;;
(users-groups)
if compset -P '*:'; then
_groups && ret=0
@@ -3095,6 +3076,7 @@ _docker() {
_arguments $(__docker_arguments) -C \
"(: -)"{-h,--help}"[Print usage]" \
"($help)--config[Location of client config files]:path:_directories" \
+ "($help -c --context)"{-c=,--context=}"[Execute the command in a docker context]:context:__docker_complete_contexts" \
"($help -D --debug)"{-D,--debug}"[Enable debug mode]" \
"($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \
"($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \
@@ -3110,7 +3092,8 @@ _docker() {
local host=${opt_args[-H]}${opt_args[--host]}
local config=${opt_args[--config]}
- local docker_options="${host:+--host $host} ${config:+--config $config}"
+ local context=${opt_args[-c]}${opt_args[--context]}
+ local docker_options="${host:+--host $host} ${config:+--config $config} ${context:+--context $context} "
case $state in
(command)
diff --git a/plugins/docker/docker.plugin.zsh b/plugins/docker/docker.plugin.zsh
index 9c8ad8a2..7e657f2d 100644
--- a/plugins/docker/docker.plugin.zsh
+++ b/plugins/docker/docker.plugin.zsh
@@ -1,39 +1,62 @@
alias dbl='docker build'
-alias dpu='docker pull'
-alias dtop='docker top'
-
-# docker containers
alias dcin='docker container inspect'
-alias dlo='docker container logs'
alias dcls='docker container ls'
alias dclsa='docker container ls -a'
-alias dpo='docker container port'
-alias dr='docker container run'
-alias drit='docker container run -it'
-alias drm='docker container rm'
-alias 'drm!'='docker container rm -f'
-alias dst='docker container start'
-alias dstp='docker container stop'
-alias dxc='docker container exec'
-alias dxcit='docker container exec -it'
-
-# docker images
alias dib='docker image build'
alias dii='docker image inspect'
alias dils='docker image ls'
alias dipu='docker image push'
alias dirm='docker image rm'
alias dit='docker image tag'
-
-# docker network
+alias dlo='docker container logs'
alias dnc='docker network create'
alias dncn='docker network connect'
alias dndcn='docker network disconnect'
alias dni='docker network inspect'
alias dnls='docker network ls'
alias dnrm='docker network rm'
-
-# docker volume
+alias dpo='docker container port'
+alias dpu='docker pull'
+alias dr='docker container run'
+alias drit='docker container run -it'
+alias drm='docker container rm'
+alias 'drm!'='docker container rm -f'
+alias dst='docker container start'
+alias drs='docker container restart'
+alias dsta='docker stop $(docker ps -q)'
+alias dstp='docker container stop'
+alias dtop='docker top'
alias dvi='docker volume inspect'
alias dvls='docker volume ls'
alias dvprune='docker volume prune'
+alias dxc='docker container exec'
+alias dxcit='docker container exec -it'
+
+if (( ! $+commands[docker] )); then
+ return
+fi
+
+# Standarized $0 handling
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `docker`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_docker" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _docker
+ _comps[docker]=_docker
+fi
+
+{
+ # `docker completion` is only available from 23.0.0 on
+ # docker version returns `Docker version 24.0.2, build cb74dfcd85`
+ # with `s:,:` remove the comma after the version, and select third word of it
+ if zstyle -t ':omz:plugins:docker' legacy-completion || \
+ ! is-at-least 23.0.0 ${${(s:,:z)"$(command docker --version)"}[3]}; then
+ command cp "${0:h}/completions/_docker" "$ZSH_CACHE_DIR/completions/_docker"
+ else
+ command docker completion zsh >| "$ZSH_CACHE_DIR/completions/_docker"
+ fi
+} &|
diff --git a/plugins/doctl/doctl.plugin.zsh b/plugins/doctl/doctl.plugin.zsh
index d23ed085..7b3a384a 100644
--- a/plugins/doctl/doctl.plugin.zsh
+++ b/plugins/doctl/doctl.plugin.zsh
@@ -4,6 +4,14 @@
#
# Author: https://github.com/HalisCz
-if [ $commands[doctl] ]; then
- source <(doctl completion zsh)
+if (( ! $+commands[doctl] )); then
+ return
fi
+
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_doctl" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _doctl
+ _comps[doctl]=_doctl
+fi
+
+doctl completion zsh >| "$ZSH_CACHE_DIR/completions/_doctl" &|
diff --git a/plugins/dotnet/README.md b/plugins/dotnet/README.md
index 87dfd8f8..a15e8057 100644
--- a/plugins/dotnet/README.md
+++ b/plugins/dotnet/README.md
@@ -17,6 +17,7 @@ plugins=(... dotnet)
| dt | dotnet test | Run unit tests using the test runner specified in a .NET project. |
| dw | dotnet watch | Watch for source file changes and restart the dotnet command. |
| dwr | dotnet watch run | Watch for source file changes and restart the `run` command. |
+| dwt | dotnet watch test| Watch for source file changes and restart the `test` command. |
| ds | dotnet sln | Modify Visual Studio solution files. |
| da | dotnet add | Add a package or reference to a .NET project. |
| dp | dotnet pack | Create a NuGet package. |
diff --git a/plugins/dotnet/dotnet.plugin.zsh b/plugins/dotnet/dotnet.plugin.zsh
index 8ea31cdb..89d46467 100644
--- a/plugins/dotnet/dotnet.plugin.zsh
+++ b/plugins/dotnet/dotnet.plugin.zsh
@@ -26,6 +26,7 @@ alias dr='dotnet run'
alias dt='dotnet test'
alias dw='dotnet watch'
alias dwr='dotnet watch run'
+alias dwt='dotnet watch test'
alias ds='dotnet sln'
alias da='dotnet add'
alias dp='dotnet pack'
diff --git a/plugins/emacs/README.md b/plugins/emacs/README.md
index c8e33b5a..8ed4a147 100644
--- a/plugins/emacs/README.md
+++ b/plugins/emacs/README.md
@@ -25,6 +25,6 @@ The plugin uses a custom launcher (which we'll call here `$EMACS_LAUNCHER`) that
| e | `emacs` | Same as emacs alias |
| te | `$EMACS_LAUNCHER -nw` | Open terminal emacsclient |
| eeval | `$EMACS_LAUNCHER --eval` | Same as `M-x eval` but from outside Emacs |
-| eframe | `emacsclient --alternate-editor "" --create-frame` | Create new X frame |
+| eframe | `emacsclient --alternate-editor="" --create-frame` | Create new X frame |
| efile | - | Print the path to the file open in the current buffer |
| ecd | - | Print the directory of the file open in the the current buffer |
diff --git a/plugins/emacs/emacs.plugin.zsh b/plugins/emacs/emacs.plugin.zsh
index fede5b0c..4747f035 100644
--- a/plugins/emacs/emacs.plugin.zsh
+++ b/plugins/emacs/emacs.plugin.zsh
@@ -32,7 +32,7 @@ alias te="$EMACS_PLUGIN_LAUNCHER -nw"
# same than M-x eval but from outside Emacs.
alias eeval="$EMACS_PLUGIN_LAUNCHER --eval"
# create a new X frame
-alias eframe='emacsclient --alternate-editor "" --create-frame'
+alias eframe='emacsclient --alternate-editor="" --create-frame'
# Emacs ANSI Term tracking
if [[ -n "$INSIDE_EMACS" ]]; then
diff --git a/plugins/emacs/emacsclient.sh b/plugins/emacs/emacsclient.sh
index 96893c93..172c0ae9 100755
--- a/plugins/emacs/emacsclient.sh
+++ b/plugins/emacs/emacsclient.sh
@@ -15,11 +15,11 @@ emacsfun() {
# Only create another X frame if there isn't one present
if [ -z "$frames" -o "$frames" = nil ]; then
- emacsclient --alternate-editor "" --create-frame "$@"
+ emacsclient --alternate-editor="" --create-frame "$@"
return $?
fi
- emacsclient --alternate-editor "" "$@"
+ emacsclient --alternate-editor="" "$@"
}
# Adapted from https://github.com/davidshepherd7/emacs-read-stdin/blob/master/emacs-read-stdin.sh
diff --git a/plugins/extract/README.md b/plugins/extract/README.md
index 44f0b05a..c8d98b22 100644
--- a/plugins/extract/README.md
+++ b/plugins/extract/README.md
@@ -1,10 +1,10 @@
# extract plugin
-This plugin defines a function called `extract` that extracts the archive file
-you pass it, and it supports a wide variety of archive filetypes.
+This plugin defines a function called `extract` that extracts the archive file you pass it, and it supports a
+wide variety of archive filetypes.
-This way you don't have to know what specific command extracts a file, you just
-do `extract ` and the function takes care of the rest.
+This way you don't have to know what specific command extracts a file, you just do `extract ` and
+the function takes care of the rest.
To use it, add `extract` to the plugins array in your zshrc file:
@@ -15,7 +15,7 @@ plugins=(... extract)
## Supported file extensions
| Extension | Description |
-|:------------------|:-------------------------------------|
+| :---------------- | :----------------------------------- |
| `7z` | 7zip file |
| `Z` | Z archive (LZW) |
| `apk` | Android app file |
@@ -25,6 +25,7 @@ plugins=(... extract)
| `cpio` | Cpio archive |
| `deb` | Debian package |
| `ear` | Enterprise Application aRchive |
+| `exe` | Windows executable file |
| `gz` | Gzip file |
| `ipa` | iOS app package |
| `ipsw` | iOS firmware file |
@@ -32,6 +33,7 @@ plugins=(... extract)
| `lrz` | LRZ archive |
| `lz4` | LZ4 archive |
| `lzma` | LZMA archive |
+| `obscpio` | cpio archive used on OBS |
| `rar` | WinRAR archive |
| `rpm` | RPM package |
| `sublime-package` | Sublime Text package |
@@ -51,10 +53,13 @@ plugins=(... extract)
| `txz` | Tarball with lzma2 compression |
| `tzst` | Tarball with zstd compression |
| `war` | Web Application archive (Java-based) |
+| `whl` | Python wheel file |
| `xpi` | Mozilla XPI module file |
| `xz` | LZMA2 archive |
| `zip` | Zip archive |
+| `zlib` | zlib archive |
| `zst` | Zstandard file (zstd) |
+| `zpaq` | Zpaq file |
-See [list of archive formats](https://en.wikipedia.org/wiki/List_of_archive_formats) for
-more information regarding archive formats.
+See [list of archive formats](https://en.wikipedia.org/wiki/List_of_archive_formats) for more information
+regarding archive formats.
diff --git a/plugins/extract/_extract b/plugins/extract/_extract
index 27b099c9..56b17058 100644
--- a/plugins/extract/_extract
+++ b/plugins/extract/_extract
@@ -3,5 +3,5 @@
_arguments \
'(-r --remove)'{-r,--remove}'[Remove archive.]' \
- "*::archive file:_files -g '(#i)*.(7z|Z|apk|aar|bz2|cab|cpio|deb|ear|gz|ipa|ipsw|jar|lrz|lz4|lzma|rar|rpm|sublime-package|tar|tar.bz2|tar.gz|tar.lrz|tar.lz|tar.lz4|tar.xz|tar.zma|tar.zst|tbz|tbz2|tgz|tlz|txz|tzst|war|whl|xpi|xz|zip|zst)(-.)'" \
+ "*::archive file:_files -g '(#i)*.(7z|Z|apk|aar|bz2|cab|cpio|deb|ear|gz|ipa|ipsw|jar|lrz|lz4|lzma|obscpio|rar|rpm|sublime-package|tar|tar.bz2|tar.gz|tar.lrz|tar.lz|tar.lz4|tar.xz|tar.zma|tar.zst|tbz|tbz2|tgz|tlz|txz|tzst|war|whl|xpi|xz|zip|zst|zpaq)(-.)'" \
&& return 0
diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh
index 1112dd52..88d8b074 100644
--- a/plugins/extract/extract.plugin.zsh
+++ b/plugins/extract/extract.plugin.zsh
@@ -27,59 +27,111 @@ EOF
fi
local success=0
- local extract_dir="${1:t:r}"
local file="$1" full_path="${1:A}"
+ local extract_dir="${1:t:r}"
+
+ # Remove the .tar extension if the file name is .tar.*
+ if [[ $extract_dir =~ '\.tar$' ]]; then
+ extract_dir="${extract_dir:r}"
+ fi
+
+ # If there's a file or directory with the same name as the archive
+ # add a random string to the end of the extract directory
+ if [[ -e "$extract_dir" ]]; then
+ local rnd="${(L)"${$(( [##36]$RANDOM*$RANDOM ))}":1:5}"
+ extract_dir="${extract_dir}-${rnd}"
+ fi
+
+ # Create an extraction directory based on the file name
+ command mkdir -p "$extract_dir"
+ builtin cd -q "$extract_dir"
+ echo "extract: extracting to $extract_dir" >&2
+
case "${file:l}" in
- (*.tar.gz|*.tgz) (( $+commands[pigz] )) && { pigz -dc "$file" | tar xv } || tar zxvf "$file" ;;
- (*.tar.bz2|*.tbz|*.tbz2) tar xvjf "$file" ;;
+ (*.tar.gz|*.tgz)
+ (( $+commands[pigz] )) && { tar -I pigz -xvf "$full_path" } || tar zxvf "$full_path" ;;
+ (*.tar.bz2|*.tbz|*.tbz2)
+ (( $+commands[pbzip2] )) && { tar -I pbzip2 -xvf "$full_path" } || tar xvjf "$full_path" ;;
(*.tar.xz|*.txz)
+ (( $+commands[pixz] )) && { tar -I pixz -xvf "$full_path" } || {
tar --xz --help &> /dev/null \
- && tar --xz -xvf "$file" \
- || xzcat "$file" | tar xvf - ;;
+ && tar --xz -xvf "$full_path" \
+ || xzcat "$full_path" | tar xvf - } ;;
(*.tar.zma|*.tlz)
tar --lzma --help &> /dev/null \
- && tar --lzma -xvf "$file" \
- || lzcat "$file" | tar xvf - ;;
+ && tar --lzma -xvf "$full_path" \
+ || lzcat "$full_path" | tar xvf - ;;
(*.tar.zst|*.tzst)
tar --zstd --help &> /dev/null \
- && tar --zstd -xvf "$file" \
- || zstdcat "$file" | tar xvf - ;;
- (*.tar) tar xvf "$file" ;;
- (*.tar.lz) (( $+commands[lzip] )) && tar xvf "$file" ;;
- (*.tar.lz4) lz4 -c -d "$file" | tar xvf - ;;
- (*.tar.lrz) (( $+commands[lrzuntar] )) && lrzuntar "$file" ;;
- (*.gz) (( $+commands[pigz] )) && pigz -dk "$file" || gunzip -k "$file" ;;
- (*.bz2) bunzip2 "$file" ;;
- (*.xz) unxz "$file" ;;
- (*.lrz) (( $+commands[lrunzip] )) && lrunzip "$file" ;;
- (*.lz4) lz4 -d "$file" ;;
- (*.lzma) unlzma "$file" ;;
- (*.z) uncompress "$file" ;;
- (*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl) unzip "$file" -d "$extract_dir" ;;
- (*.rar) unrar x -ad "$file" ;;
+ && tar --zstd -xvf "$full_path" \
+ || zstdcat "$full_path" | tar xvf - ;;
+ (*.tar) tar xvf "$full_path" ;;
+ (*.tar.lz) (( $+commands[lzip] )) && tar xvf "$full_path" ;;
+ (*.tar.lz4) lz4 -c -d "$full_path" | tar xvf - ;;
+ (*.tar.lrz) (( $+commands[lrzuntar] )) && lrzuntar "$full_path" ;;
+ (*.gz) (( $+commands[pigz] )) && pigz -cdk "$full_path" > "${file:t:r}" || gunzip -ck "$full_path" > "${file:t:r}" ;;
+ (*.bz2) bunzip2 "$full_path" ;;
+ (*.xz) unxz "$full_path" ;;
+ (*.lrz) (( $+commands[lrunzip] )) && lrunzip "$full_path" ;;
+ (*.lz4) lz4 -d "$full_path" ;;
+ (*.lzma) unlzma "$full_path" ;;
+ (*.z) uncompress "$full_path" ;;
+ (*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl) unzip "$full_path" ;;
+ (*.rar) unrar x -ad "$full_path" ;;
(*.rpm)
- command mkdir -p "$extract_dir" && builtin cd -q "$extract_dir" \
- && rpm2cpio "$full_path" | cpio --quiet -id ;;
- (*.7z) 7za x "$file" ;;
+ rpm2cpio "$full_path" | cpio --quiet -id ;;
+ (*.7z) 7za x "$full_path" ;;
(*.deb)
- command mkdir -p "$extract_dir/control" "$extract_dir/data"
- builtin cd -q "$extract_dir"; ar vx "$full_path" > /dev/null
+ command mkdir -p "control" "data"
+ ar vx "$full_path" > /dev/null
builtin cd -q control; extract ../control.tar.*
builtin cd -q ../data; extract ../data.tar.*
builtin cd -q ..; command rm *.tar.* debian-binary ;;
- (*.zst) unzstd "$file" ;;
- (*.cab) cabextract -d "$extract_dir" "$file" ;;
- (*.cpio) cpio -idmvF "$file" ;;
+ (*.zst) unzstd "$full_path" ;;
+ (*.cab|*.exe) cabextract "$full_path" ;;
+ (*.cpio|*.obscpio) cpio -idmvF "$full_path" ;;
+ (*.zpaq) zpaq x "$full_path" ;;
+ (*.zlib) zlib-flate -uncompress < "$full_path" > "${file:r}" ;;
(*)
echo "extract: '$file' cannot be extracted" >&2
success=1 ;;
esac
(( success = success > 0 ? success : $? ))
- (( success == 0 && remove_archive == 0 )) && rm "$full_path"
+ (( success == 0 && remove_archive == 0 )) && command rm "$full_path"
shift
- # Go back to original working directory in case we ran cd previously
+ # Go back to original working directory
builtin cd -q "$pwd"
+
+ # If content of extract dir is a single directory, move its contents up
+ # Glob flags:
+ # - D: include files starting with .
+ # - N: no error if directory is empty
+ # - Y2: at most give 2 files
+ local -a content
+ content=("${extract_dir}"/*(DNY2))
+ if [[ ${#content} -eq 1 && -e "${content[1]}" ]]; then
+ # The extracted file/folder (${content[1]}) may have the same name as $extract_dir
+ # If so, we need to rename it to avoid conflicts in a 3-step process
+ #
+ # 1. Move and rename the extracted file/folder to a temporary random name
+ # 2. Delete the empty folder
+ # 3. Rename the extracted file/folder to the original name
+ if [[ "${content[1]:t}" == "$extract_dir" ]]; then
+ # =(:) gives /tmp/zsh, with :t it gives zsh
+ local tmp_name==(:); tmp_name="${tmp_name:t}"
+ command mv "${content[1]}" "$tmp_name" \
+ && command rmdir "$extract_dir" \
+ && command mv "$tmp_name" "$extract_dir"
+ # Otherwise, if the extracted folder name already exists in the current
+ # directory (because of a previous file / folder), keep the extract_dir
+ elif [[ ! -e "${content[1]:t}" ]]; then
+ command mv "${content[1]}" . \
+ && command rmdir "$extract_dir"
+ fi
+ elif [[ ${#content} -eq 0 ]]; then
+ command rmdir "$extract_dir"
+ fi
done
}
diff --git a/plugins/fasd/README.md b/plugins/fasd/README.md
index a5c74e5b..7c44ac84 100644
--- a/plugins/fasd/README.md
+++ b/plugins/fasd/README.md
@@ -10,7 +10,7 @@ plugins=(... fasd)
## Installation
-Please find detailed installation guide [`here`](https://github.com/clvv/fasd#install)
+Please find detailed installation guide [`here`](https://github.com/whjvenyl/fasd#install)
## Aliases
diff --git a/plugins/fluxcd/README.md b/plugins/fluxcd/README.md
new file mode 100644
index 00000000..9723fcc6
--- /dev/null
+++ b/plugins/fluxcd/README.md
@@ -0,0 +1,9 @@
+# FluxCD plugin
+
+This plugin adds completion for [FluxCD](https://fluxcd.io), an open and extensible continuous delivery solution for Kubernetes. Powered by GitOps Toolkit.
+
+To use it, add `fluxcd` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... fluxcd)
+```
diff --git a/plugins/fluxcd/fluxcd.plugin.zsh b/plugins/fluxcd/fluxcd.plugin.zsh
new file mode 100644
index 00000000..d30866a0
--- /dev/null
+++ b/plugins/fluxcd/fluxcd.plugin.zsh
@@ -0,0 +1,14 @@
+# Autocompletion for the FluxCD CLI (flux).
+if (( ! $+commands[flux] )); then
+ return
+fi
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `flux`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_flux" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _flux
+ _comps[flux]=_flux
+fi
+
+flux completion zsh >| "$ZSH_CACHE_DIR/completions/_flux" &|
diff --git a/plugins/fzf/fzf.plugin.zsh b/plugins/fzf/fzf.plugin.zsh
index 60ae0c76..b253a23d 100644
--- a/plugins/fzf/fzf.plugin.zsh
+++ b/plugins/fzf/fzf.plugin.zsh
@@ -9,6 +9,7 @@ function fzf_setup_using_base_dir() {
"${HOME}/.nix-profile/share/fzf"
"${XDG_DATA_HOME:-$HOME/.local/share}/fzf"
"/usr/local/opt/fzf"
+ "/opt/homebrew/opt/fzf"
"/usr/share/fzf"
"/usr/local/share/examples/fzf"
)
@@ -59,8 +60,8 @@ function fzf_setup_using_base_dir() {
function fzf_setup_using_debian() {
- if (( ! $+commands[dpkg] )) || ! dpkg -s fzf &>/dev/null; then
- # Either not a debian based distro, or no fzf installed
+ if (( ! $+commands[apt] && ! $+commands[apt-get] )); then
+ # Not a debian based distro
return 1
fi
@@ -71,11 +72,19 @@ function fzf_setup_using_debian() {
case $PREFIX in
*com.termux*)
+ if [[ ! -f "${PREFIX}/bin/fzf" ]]; then
+ # fzf not installed
+ return 1
+ fi
# Support Termux package
completions="${PREFIX}/share/fzf/completion.zsh"
key_bindings="${PREFIX}/share/fzf/key-bindings.zsh"
;;
*)
+ if [[ ! -d /usr/share/doc/fzf/examples ]]; then
+ # fzf not installed
+ return 1
+ fi
# Determine completion file path: first bullseye/sid, then buster/stretch
completions="/usr/share/doc/fzf/examples/completion.zsh"
[[ -f "$completions" ]] || completions="/usr/share/zsh/vendor-completions/_fzf"
diff --git a/plugins/gas/README.md b/plugins/gas/README.md
index 47b3fb9d..a0a7a568 100644
--- a/plugins/gas/README.md
+++ b/plugins/gas/README.md
@@ -1,6 +1,6 @@
# Gas plugin
-This plugin adds autocompletion for the [gas](http://walle.github.com/gas) command,
+This plugin adds autocompletion for the [gas](http://ramblingsby.me/gas/) command,
a utility to manage Git authors.
To use it, add `gas` to the plugins array of your zshrc file:
diff --git a/plugins/gcloud/gcloud.plugin.zsh b/plugins/gcloud/gcloud.plugin.zsh
index 9be9d68a..9a4213aa 100644
--- a/plugins/gcloud/gcloud.plugin.zsh
+++ b/plugins/gcloud/gcloud.plugin.zsh
@@ -6,13 +6,16 @@
if [[ -z "${CLOUDSDK_HOME}" ]]; then
search_locations=(
"$HOME/google-cloud-sdk"
+ "/usr/local/share/google-cloud-sdk"
"/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk"
"/opt/homebrew/Caskroom/google-cloud-sdk/latest/google-cloud-sdk"
"/usr/share/google-cloud-sdk"
"/snap/google-cloud-sdk/current"
+ "/snap/google-cloud-cli/current"
"/usr/lib/google-cloud-sdk"
"/usr/lib64/google-cloud-sdk"
"/opt/google-cloud-sdk"
+ "/opt/google-cloud-cli"
"/opt/local/libexec/google-cloud-sdk"
)
@@ -26,11 +29,9 @@ if [[ -z "${CLOUDSDK_HOME}" ]]; then
fi
if (( ${+CLOUDSDK_HOME} )); then
- # Only source this if gcloud isn't already on the path
- if (( ! $+commands[gcloud] )); then
- if [[ -f "${CLOUDSDK_HOME}/path.zsh.inc" ]]; then
- source "${CLOUDSDK_HOME}/path.zsh.inc"
- fi
+ # Source path file
+ if [[ -f "${CLOUDSDK_HOME}/path.zsh.inc" ]]; then
+ source "${CLOUDSDK_HOME}/path.zsh.inc"
fi
# Look for completion file in different paths
diff --git a/plugins/git-commit/README.md b/plugins/git-commit/README.md
new file mode 100644
index 00000000..dc10d8ad
--- /dev/null
+++ b/plugins/git-commit/README.md
@@ -0,0 +1,36 @@
+# git-commit plugin
+
+The git-commit plugin adds several [git aliases](https://www.git-scm.com/docs/git-config#Documentation/git-config.txt-alias) for [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/#summary) messages.
+
+To use it, add `git-commit` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... git-commit)
+```
+
+## Syntax
+
+```zshrc
+git [(-s, --scope) ""] ""
+```
+
+> ⚠️ Single/Double quotes around the scope and message are required
+
+Where `type` is one of the following:
+
+- `build`
+- `chore`
+- `ci`
+- `docs`
+- `feat`
+- `fix`
+- `perf`
+- `refactor`
+- `revert`
+- `style`
+- `test`
+
+## Examples
+
+`git style "remove trailing whitespace"` -> `git commit -m "style: remove trailing whitespace"`
+`git fix -s "router" "correct redirect link"` -> `git commit -m "fix(router): correct redirect link"`
diff --git a/plugins/git-commit/git-commit.plugin.zsh b/plugins/git-commit/git-commit.plugin.zsh
new file mode 100644
index 00000000..4ad4c017
--- /dev/null
+++ b/plugins/git-commit/git-commit.plugin.zsh
@@ -0,0 +1,27 @@
+function _git_commit_register {
+ if ! git config --global --get-all alias.$1 >/dev/null 2>&1; then
+ git config --global alias.$1 '!a() { if [ "$1" = "-s" ] || [ "$1" = "--scope" ]; then local scope="$2"; shift 2; git commit -m "'$1'(${scope}): ${@}"; else git commit -m "'$1': ${@}"; fi }; a'
+ fi
+}
+
+local -a _git_commit_aliases
+_git_commit_aliases=(
+ 'build'
+ 'chore'
+ 'ci'
+ 'docs'
+ 'feat'
+ 'fix'
+ 'perf'
+ 'refactor'
+ 'revert'
+ 'style'
+ 'test'
+)
+
+for _alias in "${_git_commit_aliases[@]}"; do
+ _git_commit_register $_alias
+done
+
+unfunction _git_commit_register
+unset _alias
diff --git a/plugins/git-extras/README.md b/plugins/git-extras/README.md
index 2adc9d47..7eb53fcf 100644
--- a/plugins/git-extras/README.md
+++ b/plugins/git-extras/README.md
@@ -1,6 +1,6 @@
# git-extras
-This plugin provides completion definitions for some of the commands defined by [git-extras](https://github.com/tj/git-extras).
+This plugin provides completion definitions for some of the commands defined by [git-extras](https://github.com/tj/git-extras), which must already be installed.
To use it, add `git-extras` to the plugins array in your zshrc file:
diff --git a/plugins/git-extras/git-extras.plugin.zsh b/plugins/git-extras/git-extras.plugin.zsh
index b86d7c5b..f5fd387d 100644
--- a/plugins/git-extras/git-extras.plugin.zsh
+++ b/plugins/git-extras/git-extras.plugin.zsh
@@ -51,7 +51,7 @@ __gitex_remote_names() {
local expl
declare -a remote_names
remote_names=(${(f)"$(_call_program remotes git remote 2>/dev/null)"})
- __git_command_successful || return
+ __gitex_command_successful || return
_wanted remote-names expl remote-name compadd $* - $remote_names
}
@@ -59,7 +59,7 @@ __gitex_tag_names() {
local expl
declare -a tag_names
tag_names=(${${(f)"$(_call_program tags git for-each-ref --format='"%(refname)"' refs/tags 2>/dev/null)"}#refs/tags/})
- __git_command_successful || return
+ __gitex_command_successful || return
_wanted tag-names expl tag-name compadd $* - $tag_names
}
@@ -68,7 +68,7 @@ __gitex_branch_names() {
local expl
declare -a branch_names
branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads 2>/dev/null)"}#refs/heads/})
- __git_command_successful || return
+ __gitex_command_successful || return
_wanted branch-names expl branch-name compadd $* - $branch_names
}
@@ -76,31 +76,19 @@ __gitex_specific_branch_names() {
local expl
declare -a branch_names
branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/"$1" 2>/dev/null)"}#refs/heads/$1/})
- __git_command_successful || return
+ __gitex_command_successful || return
_wanted branch-names expl branch-name compadd - $branch_names
}
-__gitex_chore_branch_names() {
- __gitex_specific_branch_names 'chore'
-}
-
__gitex_feature_branch_names() {
__gitex_specific_branch_names 'feature'
}
-__gitex_refactor_branch_names() {
- __gitex_specific_branch_names 'refactor'
-}
-
-__gitex_bug_branch_names() {
- __gitex_specific_branch_names 'bug'
-}
-
__gitex_submodule_names() {
local expl
declare -a submodule_names
submodule_names=(${(f)"$(_call_program branchrefs git submodule status | awk '{print $2}')"}) # '
- __git_command_successful || return
+ __gitex_command_successful || return
_wanted submodule-names expl submodule-name compadd $* - $submodule_names
}
@@ -109,93 +97,34 @@ __gitex_author_names() {
local expl
declare -a author_names
author_names=(${(f)"$(_call_program branchrefs git log --format='%aN' | sort -u)"})
- __git_command_successful || return
+ __gitex_command_successful || return
_wanted author-names expl author-name compadd $* - $author_names
}
# subcommands
+# new subcommand should be added in alphabetical order
_git-authors() {
_arguments -C \
'(--list -l)'{--list,-l}'[show authors]' \
'--no-email[without email]' \
}
-_git-bug() {
- local curcontext=$curcontext state line ret=1
- declare -A opt_args
-
- _arguments -C \
- ': :->command' \
- '*:: :->option-or-argument' && ret=0
-
- case $state in
- (command)
- declare -a commands
- commands=(
- 'finish:merge bug into the current branch'
- )
- _describe -t commands command commands && ret=0
- ;;
- (option-or-argument)
- curcontext=${curcontext%:*}-$line[1]:
- case $line[1] in
- (finish)
- _arguments -C \
- ':branch-name:__gitex_bug_branch_names'
- ;;
- -r|--remote )
- _arguments -C \
- ':remote-name:__gitex_remote_names'
- ;;
- esac
- return 0
- esac
-
- _arguments \
- '(--remote -r)'{--remote,-r}'[setup remote tracking branch]'
-}
-
-
_git-changelog() {
_arguments \
'(-l --list)'{-l,--list}'[list commits]' \
}
-_git-chore() {
- local curcontext=$curcontext state line ret=1
- declare -A opt_args
-
- _arguments -C \
- ': :->command' \
- '*:: :->option-or-argument' && ret=0
-
- case $state in
- (command)
- declare -a commands
- commands=(
- 'finish:merge and delete the chore branch'
- )
- _describe -t commands command commands && ret=0
- ;;
- (option-or-argument)
- curcontext=${curcontext%:*}-$line[1]:
- case $line[1] in
- (finish)
- _arguments -C \
- ':branch-name:__gitex_chore_branch_names'
- ;;
- -r|--remote )
- _arguments -C \
- ':remote-name:__gitex_remote_names'
- ;;
- esac
- return 0
- esac
-
+_git-clear() {
_arguments \
- '(--remote -r)'{--remote,-r}'[setup remote tracking branch]'
+ '(-f --force)'{-f,--force}'[force clear]' \
+ '(-h --help)'{-h,--help}'[help message]' \
}
+_git-coauthor() {
+ _arguments \
+ ':co-author[co-author to add]' \
+ ':co-author-email[email address of co-author to add]'
+}
_git-contrib() {
_arguments \
@@ -235,6 +164,11 @@ _git-delete-branch() {
':branch-name:__gitex_branch_names'
}
+_git-delete-squashed-branches() {
+ _arguments \
+ ':branch-name:__gitex_branch_names'
+}
+
_git-delete-submodule() {
_arguments \
@@ -298,6 +232,7 @@ _git-feature() {
case $line[1] in
(finish)
_arguments -C \
+ '--squash[Use squash merge]' \
':branch-name:__gitex_feature_branch_names'
;;
-r|--remote )
@@ -327,20 +262,17 @@ _git-guilt() {
}
_git-ignore() {
- _arguments -C \
+ _arguments -C \
'(--local -l)'{--local,-l}'[show local gitignore]' \
'(--global -g)'{--global,-g}'[show global gitignore]' \
'(--private -p)'{--private,-p}'[show repo gitignore]'
}
-_git-ignore() {
- _arguments -C \
- '(--append -a)'{--append,-a}'[append .gitignore]' \
- '(--replace -r)'{--replace,-r}'[replace .gitignore]' \
- '(--list-in-table -l)'{--list-in-table,-l}'[print available types in table format]' \
- '(--list-alphabetically -L)'{--list-alphabetically,-L}'[print available types in alphabetical order]' \
- '(--search -s)'{--search,-s}'[search word in available types]'
+_git-info() {
+ _arguments -C \
+ '(--color -c)'{--color,-c}'[use color for information titles]' \
+ '--no-config[do not show list all variables set in config file, along with their values]'
}
@@ -357,50 +289,27 @@ _git-missing() {
':second-branch-name:__gitex_branch_names'
}
-
-_git-refactor() {
- local curcontext=$curcontext state line ret=1
- declare -A opt_args
-
+_git-release() {
_arguments -C \
- ': :->command' \
- '*:: :->option-or-argument' && ret=0
-
- case $state in
- (command)
- declare -a commands
- commands=(
- 'finish:merge refactor into the current branch'
- )
- _describe -t commands command commands && ret=0
- ;;
- (option-or-argument)
- curcontext=${curcontext%:*}-$line[1]:
- case $line[1] in
- (finish)
- _arguments -C \
- ':branch-name:__gitex_refactor_branch_names'
- ;;
- -r|--remote )
- _arguments -C \
- ':remote-name:__gitex_remote_names'
- ;;
- esac
- return 0
- esac
-
- _arguments \
- '(--remote -r)'{--remote,-r}'[setup remote tracking branch]'
+ '-c[Generates/populates the changelog with all commit message since the last tag.]' \
+ '-r[The "remote" repository that is destination of a push operation.]' \
+ '-m[use the custom commit information instead of the default message.]' \
+ '-s[Create a signed and annotated tag.]' \
+ '-u[Create a tag, annotated and signed with the given key.]' \
+ '--semver[If the latest tag in your repo matches the semver format requirement, you could increase part of it as the new release tag.]' \
+ '--prefix[Add a prefix string to semver to allow more complex tags.]' \
+ '--no-empty-commit[Avoid creating empty commit if nothing could be committed.]' \
+ '--[The arguments listed after "--" separator will be passed to pre/post-release hook.]'
}
-
_git-squash() {
+ _arguments '--squash-msg[commit with the squashed commit messages]'
_arguments \
':branch-name:__gitex_branch_names'
}
_git-stamp() {
- _arguments -C \
+ _arguments -C \
'(--replace -r)'{--replace,-r}'[replace stamps with same id]'
}
@@ -413,17 +322,19 @@ _git-standup() {
'-g[Display GPG signed info]' \
'-h[Display help message]' \
'-L[Enable the inclusion of symbolic links]' \
- '-m[The depth of recursive directory search]'
+ '-m[The depth of recursive directory search]' \
+ '-B[Display the commits in branch groups]'
}
_git-summary() {
_arguments '--line[summarize with lines rather than commits]'
+ _arguments '--dedup-by-email[remove duplicate users by the email address]'
+ _arguments '--no-merges[exclude merge commits]'
__gitex_commits
}
-
_git-undo(){
- _arguments -C \
+ _arguments -C \
'(--soft -s)'{--soft,-s}'[only rolls back the commit but changes remain un-staged]' \
'(--hard -h)'{--hard,-h}'[wipes your commit(s)]'
}
@@ -432,21 +343,26 @@ zstyle -g existing_user_commands ':completion:*:*:git:*' user-commands
zstyle ':completion:*:*:git:*' user-commands $existing_user_commands \
alias:'define, search and show aliases' \
+ abort:'abort current revert, merge, rebase, or cherry-pick process' \
archive-file:'export the current head of the git repository to an archive' \
authors:'generate authors report' \
- back:'undo and stage latest commits' \
+ browse:'open repo website in browser' \
+ browse-ci:'open repo CI page in browser' \
bug:'create bug branch' \
bulk:'run bulk commands' \
+ brv:'list branches sorted by their last commit date'\
changelog:'generate a changelog report' \
chore:'create chore branch' \
clear-soft:'soft clean up a repository' \
clear:'rigorously clean up a repository' \
+ coauthor:'add a co-author to the last commit' \
commits-since:'show commit logs since some date' \
contrib:'show user contributions' \
count:'show commit count' \
create-branch:'create branches' \
delete-branch:'delete branches' \
delete-merged-branches:'delete merged branches' \
+ delete-squashed-branches:'delete squashed branches' \
delete-submodule:'delete submodules' \
delete-tag:'delete tags' \
delta:'lists changed files' \
@@ -465,11 +381,13 @@ zstyle ':completion:*:*:git:*' user-commands $existing_user_commands \
local-commits:'list local commits' \
lock:'lock a file excluded from version control' \
locked:'ls files that have been locked' \
+ magic:'commits everything with a generated message' \
merge-into:'merge one branch into another' \
merge-repo:'merge two repo histories' \
missing:'show commits missing from another branch' \
mr:'checks out a merge request locally' \
obliterate:'rewrite past commits to remove some files' \
+ paste:'send patches to pastebin sites' \
pr:'checks out a pull request locally' \
psykorebase:'rebase a branch with a merge commit' \
pull-request:'create pull request to GitHub project' \
@@ -479,6 +397,7 @@ zstyle ':completion:*:*:git:*' user-commands $existing_user_commands \
release:'commit, tag and push changes to the repository' \
rename-branch:'rename a branch' \
rename-tag:'rename a tag' \
+ rename-remote:'rename a remote' \
repl:'git read-eval-print-loop' \
reset-file:'reset one file' \
root:'show path of root' \
@@ -495,4 +414,5 @@ zstyle ':completion:*:*:git:*' user-commands $existing_user_commands \
sync:'sync local branch with remote branch' \
touch:'touch and add file to the index' \
undo:'remove latest commits' \
- unlock:'unlock a file excluded from version control'
+ unlock:'unlock a file excluded from version control' \
+ utimes:'change files modification time to their last commit date'
diff --git a/plugins/git-prompt/README.md b/plugins/git-prompt/README.md
index 8775af89..05208d72 100644
--- a/plugins/git-prompt/README.md
+++ b/plugins/git-prompt/README.md
@@ -45,6 +45,7 @@ The symbols are as follows:
| ●n | there are `n` staged files |
| ✖n | there are `n` unmerged files |
| ✚n | there are `n` unstaged files |
+| -n | there are `n` deleted files |
| ⚑n | there are `n` stashed changes |
| … | there are some untracked files |
@@ -59,6 +60,7 @@ The symbols are as follows:
## Customisation
- Set the variable `ZSH_THEME_GIT_PROMPT_CACHE` to any value in order to enable caching.
+- Set the variable `ZSH_THEME_GIT_SHOW_UPSTREAM` to any value to display the upstream branch.
- You may also change a number of variables (whose name start with `ZSH_THEME_GIT_PROMPT_`)
to change the appearance of the prompt. Take a look at the bottom of the [plugin file](git-prompt.plugin.zsh)`
to see what variables are available.
diff --git a/plugins/git-prompt/git-prompt.plugin.zsh b/plugins/git-prompt/git-prompt.plugin.zsh
index dcda418c..48733202 100644
--- a/plugins/git-prompt/git-prompt.plugin.zsh
+++ b/plugins/git-prompt/git-prompt.plugin.zsh
@@ -48,12 +48,18 @@ function update_current_git_vars() {
GIT_STASHED=$__CURRENT_GIT_STATUS[8]
GIT_CLEAN=$__CURRENT_GIT_STATUS[9]
GIT_DELETED=$__CURRENT_GIT_STATUS[10]
+
+ if [ -z ${ZSH_THEME_GIT_SHOW_UPSTREAM+x} ]; then
+ GIT_UPSTREAM=
+ else
+ GIT_UPSTREAM=$(git rev-parse --abbrev-ref --symbolic-full-name "@{upstream}" 2>/dev/null) && GIT_UPSTREAM="${ZSH_THEME_GIT_PROMPT_UPSTREAM_SEPARATOR}${GIT_UPSTREAM}"
+ fi
}
git_super_status() {
precmd_update_git_vars
if [ -n "$__CURRENT_GIT_STATUS" ]; then
- STATUS="$ZSH_THEME_GIT_PROMPT_PREFIX$ZSH_THEME_GIT_PROMPT_BRANCH$GIT_BRANCH%{${reset_color}%}"
+ STATUS="$ZSH_THEME_GIT_PROMPT_PREFIX$ZSH_THEME_GIT_PROMPT_BRANCH$GIT_BRANCH$GIT_UPSTREAM%{${reset_color}%}"
if [ "$GIT_BEHIND" -ne "0" ]; then
STATUS="$STATUS$ZSH_THEME_GIT_PROMPT_BEHIND$GIT_BEHIND%{${reset_color}%}"
fi
@@ -101,6 +107,7 @@ ZSH_THEME_GIT_PROMPT_AHEAD="%{↑%G%}"
ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg[cyan]%}%{…%G%}"
ZSH_THEME_GIT_PROMPT_STASHED="%{$fg_bold[blue]%}%{⚑%G%}"
ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg_bold[green]%}%{✔%G%}"
+ZSH_THEME_GIT_PROMPT_UPSTREAM_SEPARATOR="->"
# Set the prompt.
RPROMPT='$(git_super_status)'
diff --git a/plugins/git/README.md b/plugins/git/README.md
index f1c8b81c..a4e9f4c4 100644
--- a/plugins/git/README.md
+++ b/plugins/git/README.md
@@ -10,244 +10,264 @@ plugins=(... git)
## Aliases
-| Alias | Command |
-|:---------------------|:---------------------------------------------------------------------------------------------------------------------------------|
-| g | git |
-| ga | git add |
-| gaa | git add --all |
-| gapa | git add --patch |
-| gau | git add --update |
-| gav | git add --verbose |
-| gap | git apply |
-| gapt | git apply --3way |
-| gb | git branch |
-| gba | git branch -a |
-| gbd | git branch -d |
-| gbda | git branch --no-color --merged \| grep -vE "^([+*]\|\s*($(git_main_branch)\|$(git_develop_branch))\s*$)" \| xargs git branch -d 2>/dev/null |
-| gbD | git branch -D |
-| gbl | git blame -b -w |
-| gbnm | git branch --no-merged |
-| gbr | git branch --remote |
-| gbs | git bisect |
-| gbsb | git bisect bad |
-| gbsg | git bisect good |
-| gbsr | git bisect reset |
-| gbss | git bisect start |
-| gc | git commit -v |
-| gc! | git commit -v --amend |
-| gcn! | git commit -v --no-edit --amend |
-| gca | git commit -v -a |
-| gca! | git commit -v -a --amend |
-| gcan! | git commit -v -a --no-edit --amend |
-| gcans! | git commit -v -a -s --no-edit --amend |
-| gcam | git commit -a -m |
-| gcas | git commit -a -s |
-| gcasm | git commit -a -s -m |
-| gcsm | git commit -s -m |
-| gcb | git checkout -b |
-| gcf | git config --list |
-| gcl | git clone --recurse-submodules |
-| gccd | git clone --recurse-submodules "$@" && cd "$(basename $_ .git)" |
-| gclean | git clean -id |
-| gpristine | git reset --hard && git clean -dffx |
-| gcm | git checkout $(git_main_branch) |
-| gcd | git checkout $(git_develop_branch) |
-| gcmsg | git commit -m |
-| gco | git checkout |
-| gcor | git checkout --recurse-submodules |
-| gcount | git shortlog -sn |
-| gcp | git cherry-pick |
-| gcpa | git cherry-pick --abort |
-| gcpc | git cherry-pick --continue |
-| gcs | git commit -S |
-| gd | git diff |
-| gdca | git diff --cached |
-| gdcw | git diff --cached --word-diff |
-| gdct | git describe --tags $(git rev-list --tags --max-count=1) |
-| gds | git diff --staged |
-| gdt | git diff-tree --no-commit-id --name-only -r |
-| gdnolock | git diff $@ ":(exclude)package-lock.json" ":(exclude)*.lock" |
-| gdup | git diff @{upstream} |
-| gdv | git diff -w $@ \| view - |
-| gdw | git diff --word-diff |
-| gf | git fetch |
-| gfa | git fetch --all --prune |
-| gfg | git ls-files \| grep |
-| gfo | git fetch origin |
-| gg | git gui citool |
-| gga | git gui citool --amend |
-| ggf | git push --force origin $(current_branch) |
-| ggfl | git push --force-with-lease origin $(current_branch) |
-| ggl | git pull origin $(current_branch) |
-| ggp | git push origin $(current_branch) |
-| ggpnp | ggl && ggp |
-| ggpull | git pull origin "$(git_current_branch)" |
-| ggpur | ggu |
-| ggpush | git push origin "$(git_current_branch)" |
-| ggsup | git branch --set-upstream-to=origin/$(git_current_branch) |
-| ggu | git pull --rebase origin $(current_branch) |
-| gpsup | git push --set-upstream origin $(git_current_branch) |
-| ghh | git help |
-| gignore | git update-index --assume-unchanged |
-| gignored | git ls-files -v \| grep "^[[:lower:]]" |
-| git-svn-dcommit-push | git svn dcommit && git push github $(git_main_branch):svntrunk |
-| gk | gitk --all --branches &! |
-| gke | gitk --all $(git log -g --pretty=%h) &! |
-| gl | git pull |
-| glg | git log --stat |
-| glgp | git log --stat -p |
-| glgg | git log --graph |
-| glgga | git log --graph --decorate --all |
-| glgm | git log --graph --max-count=10 |
-| glo | git log --oneline --decorate |
-| glol | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' |
-| glols | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat |
-| glod | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' |
-| glods | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short |
-| glola | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all |
-| glog | git log --oneline --decorate --graph |
-| gloga | git log --oneline --decorate --graph --all |
-| glp | git log --pretty=\ |
-| gm | git merge |
-| gmom | git merge origin/$(git_main_branch) |
-| gmtl | git mergetool --no-prompt |
-| gmtlvim | git mergetool --no-prompt --tool=vimdiff |
-| gmum | git merge upstream/$(git_main_branch) |
-| gma | git merge --abort |
-| gp | git push |
-| gpd | git push --dry-run |
-| gpf | git push --force-with-lease |
-| gpf! | git push --force |
-| gpoat | git push origin --all && git push origin --tags |
-| gpr | git pull --rebase |
-| gpu | git push upstream |
-| gpv | git push -v |
-| gr | git remote |
-| gra | git remote add |
-| grb | git rebase |
-| grba | git rebase --abort |
-| grbc | git rebase --continue |
-| grbd | git rebase $(git_develop_branch) |
-| grbi | git rebase -i |
-| grbm | git rebase $(git_main_branch) |
-| grbom | git rebase origin/$(git_main_branch) |
-| grbo | git rebase --onto |
-| grbs | git rebase --skip |
-| grev | git revert |
-| grh | git reset |
-| grhh | git reset --hard |
-| groh | git reset origin/$(git_current_branch) --hard |
-| grm | git rm |
-| grmc | git rm --cached |
-| grmv | git remote rename |
-| grrm | git remote remove |
-| grs | git restore |
-| grset | git remote set-url |
-| grss | git restore --source |
-| grst | git restore --staged |
-| grt | cd "$(git rev-parse --show-toplevel \|\| echo .)" |
-| gru | git reset -- |
-| grup | git remote update |
-| grv | git remote -v |
-| gsb | git status -sb |
-| gsd | git svn dcommit |
-| gsh | git show |
-| gsi | git submodule init |
-| gsps | git show --pretty=short --show-signature |
-| gsr | git svn rebase |
-| gss | git status -s |
-| gst | git status |
-| gsta | git stash push |
-| gsta | git stash save |
-| gstaa | git stash apply |
-| gstc | git stash clear |
-| gstd | git stash drop |
-| gstl | git stash list |
-| gstp | git stash pop |
-| gsts | git stash show --text |
-| gstu | git stash --include-untracked |
-| gstall | git stash --all |
-| gsu | git submodule update |
-| gsw | git switch |
-| gswc | git switch -c |
-| gswm | git switch $(git_main_branch) |
-| gswd | git switch $(git_develop_branch) |
-| gts | git tag -s |
-| gtv | git tag \| sort -V |
-| gtl | gtl(){ git tag --sort=-v:refname -n -l ${1}* }; noglob gtl |
-| gunignore | git update-index --no-assume-unchanged |
-| gunwip | git log -n 1 \| grep -q -c "\-\-wip\-\-" && git reset HEAD~1 |
-| gup | git pull --rebase |
-| gupv | git pull --rebase -v |
-| gupa | git pull --rebase --autostash |
-| gupav | git pull --rebase --autostash -v |
-| gupom | git pull --rebase origin $(git_main_branch) |
-| gupomi | git pull --rebase=interactive origin $(git_main_branch) |
-| glum | git pull upstream $(git_main_branch) |
-| gluc | git pull upstream $(git_current_branch) |
-| gwch | git whatchanged -p --abbrev-commit --pretty=medium |
-| gwip | git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]" |
-| gam | git am |
-| gamc | git am --continue |
-| gams | git am --skip |
-| gama | git am --abort |
-| gamscp | git am --show-current-patch |
-| gwt | git worktree |
-| gwta | git worktree add |
-| gwtls | git worktree list |
-| gwtmv | git worktree move |
-| gwtrm | git worktree remove |
+| Alias | Command |
+| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `grt` | `cd "$(git rev-parse --show-toplevel \|\| echo .)"` |
+| `ggpnp` | `ggl && ggp` |
+| `ggpur` | `ggu` |
+| `g` | `git` |
+| `ga` | `git add` |
+| `gaa` | `git add --all` |
+| `gapa` | `git add --patch` |
+| `gau` | `git add --update` |
+| `gav` | `git add --verbose` |
+| `gwip` | `git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign --message "--wip-- [skip ci]"` |
+| `gam` | `git am` |
+| `gama` | `git am --abort` |
+| `gamc` | `git am --continue` |
+| `gamscp` | `git am --show-current-patch` |
+| `gams` | `git am --skip` |
+| `gap` | `git apply` |
+| `gapt` | `git apply --3way` |
+| `gbs` | `git bisect` |
+| `gbsb` | `git bisect bad` |
+| `gbsg` | `git bisect good` |
+| `gbsn` | `git bisect new` |
+| `gbso` | `git bisect old` |
+| `gbsr` | `git bisect reset` |
+| `gbss` | `git bisect start` |
+| `gbl` | `git blame -w` |
+| `gb` | `git branch` |
+| `gba` | `git branch --all` |
+| `gbd` | `git branch --delete` |
+| `gbD` | `git branch --delete --force` |
+| `gbgd` | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| awk '"'"'{print $1}'"'"' \| xargs git branch -d` |
+| `gbgD` | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| awk '"'"'{print $1}'"'"' \| xargs git branch -D` |
+| `gbm` | `git branch --move` |
+| `gbnm` | `git branch --no-merged` |
+| `gbr` | `git branch --remote` |
+| `ggsup` | `git branch --set-upstream-to=origin/$(git_current_branch)` |
+| `gbg` | `LANG=C git branch -vv \| grep ": gone\]"` |
+| `gco` | `git checkout` |
+| `gcor` | `git checkout --recurse-submodules` |
+| `gcb` | `git checkout -b` |
+| `gcd` | `git checkout $(git_develop_branch)` |
+| `gcm` | `git checkout $(git_main_branch)` |
+| `gcp` | `git cherry-pick` |
+| `gcpa` | `git cherry-pick --abort` |
+| `gcpc` | `git cherry-pick --continue` |
+| `gclean` | `git clean --interactive -d` |
+| `gcl` | `git clone --recurse-submodules` |
+| `gccd` | `git clone --recurse-submodules "$@" && cd "$(basename $\_ .git)"` |
+| `gcam` | `git commit --all --message` |
+| `gcas` | `git commit --all --signoff` |
+| `gcasm` | `git commit --all --signoff --message` |
+| `gcmsg` | `git commit --message` |
+| `gcsm` | `git commit --signoff --message` |
+| `gc` | `git commit --verbose` |
+| `gca` | `git commit --verbose --all` |
+| `gca!` | `git commit --verbose --all --amend` |
+| `gcan!` | `git commit --verbose --all --no-edit --amend` |
+| `gcans!` | `git commit --verbose --all --signoff --no-edit --amend` |
+| `gc!` | `git commit --verbose --amend` |
+| `gcn!` | `git commit --verbose --no-edit --amend` |
+| `gcs` | `git commit -S` |
+| `gcss` | `git commit -S -s` |
+| `gcssm` | `git commit -S -s -m` |
+| `gcf` | `git config --list` |
+| `gdct` | `git describe --tags $(git rev-list --tags --max-count=1)` |
+| `gd` | `git diff` |
+| `gdca` | `git diff --cached` |
+| `gdcw` | `git diff --cached --word-diff` |
+| `gds` | `git diff --staged` |
+| `gdw` | `git diff --word-diff` |
+| `gdv` | `git diff -w "$@" \| view -` |
+| `gdup` | `git diff @{upstream}` |
+| `gdnolock` | `git diff $@ ":(exclude)package-lock.json" ":(exclude)\*.lock"` |
+| `gdt` | `git diff-tree --no-commit-id --name-only -r` |
+| `gf` | `git fetch` |
+| `gfa` | `git fetch --all --prune` |
+| `gfo` | `git fetch origin` |
+| `gg` | `git gui citool` |
+| `gga` | `git gui citool --amend` |
+| `ghh` | `git help` |
+| `glgg` | `git log --graph` |
+| `glgga` | `git log --graph --decorate --all` |
+| `glgm` | `git log --graph --max-count=10` |
+| `glod` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset'` |
+| `glods` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short` |
+| `glol` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'` |
+| `glola` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all` |
+| `glols` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat` |
+| `glo` | `git log --oneline --decorate` |
+| `glog` | `git log --oneline --decorate --graph` |
+| `gloga` | `git log --oneline --decorate --graph --all` |
+| `glp` | `git log --pretty=` |
+| `glg` | `git log --stat` |
+| `glgp` | `git log --stat --patch` |
+| `gignored` | `git ls-files -v \| grep "^[[:lower:]]"` |
+| `gfg` | `git ls-files \| grep` |
+| `gm` | `git merge` |
+| `gma` | `git merge --abort` |
+| `gms` | `git merge --squash` |
+| `gmom` | `git merge origin/$(git_main_branch)` |
+| `gmum` | `git merge upstream/$(git_main_branch)` |
+| `gmtl` | `git mergetool --no-prompt` |
+| `gmtlvim` | `git mergetool --no-prompt --tool=vimdiff` |
+| `gl` | `git pull` |
+| `gpr` | `git pull --rebase` |
+| `gup` | `git pull --rebase` |
+| `gupa` | `git pull --rebase --autostash` |
+| `gupav` | `git pull --rebase --autostash --verbose` |
+| `gupv` | `git pull --rebase --verbose` |
+| `ggu` | `git pull --rebase origin $(current_branch)` |
+| `gupom` | `git pull --rebase origin $(git_main_branch)` |
+| `gupomi` | `git pull --rebase=interactive origin $(git_main_branch)` |
+| `ggpull` | `git pull origin "$(git_current_branch)"` |
+| `ggl` | `git pull origin $(current_branch)` |
+| `gluc` | `git pull upstream $(git_current_branch)` |
+| `glum` | `git pull upstream $(git_main_branch)` |
+| `gp` | `git push` |
+| `gpd` | `git push --dry-run` |
+| `gpf!` | `git push --force` |
+| `ggf` | `git push --force origin $(current_branch)` |
+| `gpf` | On Git >= 2.30: `git push --force-with-lease --force-if-includes` |
+| `gpf` | On Git < 2.30: `git push --force-with-lease` |
+| `ggfl` | `git push --force-with-lease origin $(current_branch)` |
+| `gpsup` | `git push --set-upstream origin $(git_current_branch)` |
+| `gpsupf` | On Git >= 2.30: `git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes` |
+| `gpsupf` | On Git < 2.30: `git push --set-upstream origin $(git_current_branch) --force-with-lease` |
+| `gpv` | `git push --verbose` |
+| `gpoat` | `git push origin --all && git push origin --tags` |
+| `gpod` | `git push origin --delete` |
+| `ggpush` | `git push origin "$(git_current_branch)"` |
+| `ggp` | `git push origin $(current_branch)` |
+| `gpu` | `git push upstream` |
+| `grb` | `git rebase` |
+| `grba` | `git rebase --abort` |
+| `grbc` | `git rebase --continue` |
+| `grbi` | `git rebase --interactive` |
+| `grbo` | `git rebase --onto` |
+| `grbs` | `git rebase --skip` |
+| `grbd` | `git rebase $(git_develop_branch)` |
+| `grbm` | `git rebase $(git_main_branch)` |
+| `grbom` | `git rebase origin/$(git_main_branch)` |
+| `gr` | `git remote` |
+| `grv` | `git remote --verbose` |
+| `gra` | `git remote add` |
+| `grrm` | `git remote remove` |
+| `grmv` | `git remote rename` |
+| `grset` | `git remote set-url` |
+| `grup` | `git remote update` |
+| `grh` | `git reset` |
+| `gru` | `git reset --` |
+| `grhh` | `git reset --hard` |
+| `grhk` | `git reset --keep` |
+| `grhs` | `git reset --soft` |
+| `gpristine` | `git reset --hard && git clean -dffx` |
+| `groh` | `git reset origin/$(git_current_branch) --hard` |
+| `grs` | `git restore` |
+| `grss` | `git restore --source` |
+| `grst` | `git restore --staged` |
+| `gunwip` | `git rev-list --max-count=1 --format="%s" HEAD \| grep -q "--wip--" && git reset HEAD~1` |
+| `grev` | `git revert` |
+| `grm` | `git rm` |
+| `grmc` | `git rm --cached` |
+| `gcount` | `git shortlog --summary -n` |
+| `gsh` | `git show` |
+| `gsps` | `git show --pretty=short --show-signature` |
+| `gstall` | `git stash --all` |
+| `gstu` | `git stash --include-untracked` |
+| `gstaa` | `git stash apply` |
+| `gstc` | `git stash clear` |
+| `gstd` | `git stash drop` |
+| `gstl` | `git stash list` |
+| `gstp` | `git stash pop` |
+| `gsta` | On Git >= 2.13: `git stash push` |
+| `gsta` | On Git < 2.13: `git stash save` |
+| `gsts` | `git stash show --patch` |
+| `gst` | `git status` |
+| `gss` | `git status --short` |
+| `gsb` | `git status --short -b` |
+| `gsi` | `git submodule init` |
+| `gsu` | `git submodule update` |
+| `gsd` | `git svn dcommit` |
+| `git-svn-dcommit-push` | `git svn dcommit && git push github $(git_main_branch):svntrunk` |
+| `gsr` | `git svn rebase` |
+| `gsw` | `git switch` |
+| `gswc` | `git switch -c` |
+| `gswd` | `git switch $(git_develop_branch)` |
+| `gswm` | `git switch $(git_main_branch)` |
+| `gta` | `git tag --annotate` |
+| `gts` | `git tag -s` |
+| `gtv` | `git tag \| sort -V` |
+| `gignore` | `git update-index --assume-unchanged` |
+| `gunignore` | `git update-index --no-assume-unchanged` |
+| `gwch` | `git whatchanged -p --abbrev-commit --pretty=medium` |
+| `gwt` | `git worktree` |
+| `gwtls` | `git worktree list` |
+| `gwtmv` | `git worktree move` |
+| `gwtrm` | `git worktree remove` |
+| `gk` | `gitk --all --branches &!` |
+| `gke` | `gitk --all $(git log --walk-reflogs --pretty=%h) &!` |
+| `gtl` | `gtl(){ git tag --sort=-v:refname -n --list ${1}\* }; noglob gtl` |
### Main branch preference
-Following the recent push for removing racially-charged words from our technical vocabulary, the git plugin favors using
-a branch name other than `master`. In this case, we favor the shorter, neutral and descriptive term `main`. This means
-that any aliases and functions that previously used `master`, will use `main` if that branch exists. We do this via the
-function `git_main_branch`.
+Following the recent push for removing racially-charged words from our technical vocabulary, the git plugin
+favors using a branch name other than `master`. In this case, we favor the shorter, neutral and descriptive
+term `main`. This means that any aliases and functions that previously used `master`, will use `main` if that
+branch exists. We do this via the function `git_main_branch`.
### Deprecated aliases
-These are aliases that have been removed, renamed, or otherwise modified in a way that may, or may not, receive further support.
+These are aliases that have been removed, renamed, or otherwise modified in a way that may, or may not,
+receive further support.
-| Alias | Command | Modification |
-| :----- | :----------------------------------------------------- | :----------------------------------------------------- |
-| gap | `git add --patch` | new alias `gapa` |
-| gcl | `git config --list` | new alias `gcf` |
-| gdc | `git diff --cached` | new alias `gdca` |
-| gdt | `git difftool` | no replacement |
-| ggpull | `git pull origin $(current_branch)` | new alias `ggl` (`ggpull` still exists for now though) |
-| ggpur | `git pull --rebase origin $(current_branch)` | new alias `ggu` (`ggpur` still exists for now though) |
-| ggpush | `git push origin $(current_branch)` | new alias `ggp` (`ggpush` still exists for now though) |
-| gk | `gitk --all --branches` | now aliased to `gitk --all --branches` |
-| glg | `git log --stat --max-count = 10` | now aliased to `git log --stat --color` |
-| glgg | `git log --graph --max-count = 10` | now aliased to `git log --graph --color` |
-| gwc | `git whatchanged -p --abbrev-commit --pretty = medium` | new alias `gwch` |
+| Alias | Command | Modification |
+| :------- | :----------------------------------------------------- | :-------------------------------------------------------- |
+| `gap` | `git add --patch` | New alias: `gapa`. |
+| `gcl` | `git config --list` | New alias: `gcf`. |
+| `gdc` | `git diff --cached` | New alias: `gdca`. |
+| `gdt` | `git difftool` | No replacement. |
+| `ggpull` | `git pull origin $(current_branch)` | New alias: `ggl`. (`ggpull` still exists for now though.) |
+| `ggpur` | `git pull --rebase origin $(current_branch)` | New alias: `ggu`. (`ggpur` still exists for now though.) |
+| `ggpush` | `git push origin $(current_branch)` | New alias: `ggp`. (`ggpush` still exists for now though.) |
+| `gk` | `gitk --all --branches` | Now aliased to `gitk --all --branches`. |
+| `glg` | `git log --stat --max-count=10` | Now aliased to `git log --stat --color`. |
+| `glgg` | `git log --graph --max-count=10` | Now aliased to `git log --graph --color`. |
+| `gwc` | `git whatchanged -p --abbrev-commit --pretty = medium` | New alias: `gwch`. |
## Functions
### Current
-| Command | Description |
-|:-----------------------|:---------------------------------------------------------------------------------------------------------|
-| `grename ` | Rename `old` branch to `new`, including in origin remote |
-| current_branch | Return the name of the current branch |
-| git_current_user_name | Returns the `user.name` config value |
-| git_current_user_email | Returns the `user.email` config value |
-| git_main_branch | Returns the name of the main branch: `main` if it exists, `master` otherwise |
-| git_develop_branch | Returns the name of the develop branch: `dev`, `devel`, `development` if they exist, `develop` otherwise |
+| Command | Description |
+| :----------------------- | :-------------------------------------------------------------------------------------------------------------- |
+| `current_branch` | Returns the name of the current branch. |
+| `git_current_user_email` | Returns the `user.email` config value. (Lives in `lib/git.zsh`.) |
+| `git_current_user_name` | Returns the `user.name` config value. (Lives in `lib/git.zsh`.) |
+| `git_develop_branch` | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise. |
+| `git_main_branch` | Returns the name of the main branch: `main` if it exists, `master` otherwise. |
+| `grename ` | Renames branch `` to ``, including on the origin remote. |
+| `gbda` | Deletes all merged and squash-merged branches |
### Work in Progress (WIP)
-These features allow to pause a branch development and switch to another one (_"Work in Progress"_, or wip). When you want to go back to work, just unwip it.
+These features allow you to pause developing one branch and switch to another one (_"Work in Progress"_, or
+“wip”). When you want to go back to work, just “unwip” it.
-| Command | Description |
-|:-----------------|:------------------------------------------------|
-| work_in_progress | Echoes a warning if the current branch is a wip |
-| gwip | Commit wip branch |
-| gunwip | Uncommit wip branch |
+| Command | Description |
+| :----------------- | :---------------------------------------------- |
+| `gwip` | Commit wip branch |
+| `gunwip` | Uncommit wip branch |
+| `gunwipall` | Uncommit all recent `--wip--` commits |
+| `work_in_progress` | Echoes a warning if the current branch is a wip |
+
+Note that `gwip` and `gunwip` are aliases, but are also documented here to group all related WIP features.
### Deprecated functions
-| Command | Description | Reason |
-|:-----------------------|:----------------------------------------|:----------------------------------------------------------------|
-| current_repository | Return the names of the current remotes | Didn't work properly. Use `git remote -v` instead (`grv` alias) |
+| Command | Description | Reason |
+| :------------------- | :-------------------------------------- | :--------------------------------------------------------------- |
+| `current_repository` | Return the names of the current remotes | Didn't work properly. Use `git remote -v` instead (`grv` alias). |
diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh
index 26f4beeb..d053a763 100644
--- a/plugins/git/git.plugin.zsh
+++ b/plugins/git/git.plugin.zsh
@@ -3,7 +3,9 @@ autoload -Uz is-at-least
git_version="${${(As: :)$(git version 2>/dev/null)}[3]}"
#
-# Functions
+# Functions Current
+# (sorted alphabetically by function name)
+# (order should follow README)
#
# The name of the current branch
@@ -14,319 +16,37 @@ function current_branch() {
git_current_branch
}
-# Pretty log messages
-function _git_log_prettily(){
- if ! [ -z $1 ]; then
- git log --pretty=$1
- fi
-}
-compdef _git _git_log_prettily=git-log
+# Check for develop and similarly named branches
+function git_develop_branch() {
+ command git rev-parse --git-dir &>/dev/null || return
+ local branch
+ for branch in dev devel develop development; do
+ if command git show-ref -q --verify refs/heads/$branch; then
+ echo $branch
+ return 0
+ fi
+ done
-# Warn if the current branch is a WIP
-function work_in_progress() {
- command git -c log.showSignature=false log -n 1 2>/dev/null | grep -q -- "--wip--" && echo "WIP!!"
+ echo develop
+ return 1
}
# Check if main exists and use instead of master
function git_main_branch() {
command git rev-parse --git-dir &>/dev/null || return
local ref
- for ref in refs/{heads,remotes/{origin,upstream}}/{main,trunk}; do
+ for ref in refs/{heads,remotes/{origin,upstream}}/{main,trunk,mainline,default,master}; do
if command git show-ref -q --verify $ref; then
echo ${ref:t}
- return
+ return 0
fi
done
+
+ # If no main branch was found, fall back to master but return error
echo master
+ return 1
}
-# Check for develop and similarly named branches
-function git_develop_branch() {
- command git rev-parse --git-dir &>/dev/null || return
- local branch
- for branch in dev devel development; do
- if command git show-ref -q --verify refs/heads/$branch; then
- echo $branch
- return
- fi
- done
- echo develop
-}
-
-#
-# Aliases
-# (sorted alphabetically)
-#
-
-alias g='git'
-
-alias ga='git add'
-alias gaa='git add --all'
-alias gapa='git add --patch'
-alias gau='git add --update'
-alias gav='git add --verbose'
-alias gap='git apply'
-alias gapt='git apply --3way'
-
-alias gb='git branch'
-alias gba='git branch -a'
-alias gbd='git branch -d'
-alias gbda='git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch -d 2>/dev/null'
-alias gbD='git branch -D'
-alias gbl='git blame -b -w'
-alias gbnm='git branch --no-merged'
-alias gbr='git branch --remote'
-alias gbs='git bisect'
-alias gbsb='git bisect bad'
-alias gbsg='git bisect good'
-alias gbsr='git bisect reset'
-alias gbss='git bisect start'
-
-alias gc='git commit -v'
-alias gc!='git commit -v --amend'
-alias gcn!='git commit -v --no-edit --amend'
-alias gca='git commit -v -a'
-alias gca!='git commit -v -a --amend'
-alias gcan!='git commit -v -a --no-edit --amend'
-alias gcans!='git commit -v -a -s --no-edit --amend'
-alias gcam='git commit -a -m'
-alias gcsm='git commit -s -m'
-alias gcas='git commit -a -s'
-alias gcasm='git commit -a -s -m'
-alias gcb='git checkout -b'
-alias gcf='git config --list'
-
-function gccd() {
- command git clone --recurse-submodules "$@"
- [[ -d "$_" ]] && cd "$_" || cd "${${_:t}%.git}"
-}
-compdef _git gccd=git-clone
-
-alias gcl='git clone --recurse-submodules'
-alias gclean='git clean -id'
-alias gpristine='git reset --hard && git clean -dffx'
-alias gcm='git checkout $(git_main_branch)'
-alias gcd='git checkout $(git_develop_branch)'
-alias gcmsg='git commit -m'
-alias gco='git checkout'
-alias gcor='git checkout --recurse-submodules'
-alias gcount='git shortlog -sn'
-alias gcp='git cherry-pick'
-alias gcpa='git cherry-pick --abort'
-alias gcpc='git cherry-pick --continue'
-alias gcs='git commit -S'
-alias gcss='git commit -S -s'
-alias gcssm='git commit -S -s -m'
-
-alias gd='git diff'
-alias gdca='git diff --cached'
-alias gdcw='git diff --cached --word-diff'
-alias gdct='git describe --tags $(git rev-list --tags --max-count=1)'
-alias gds='git diff --staged'
-alias gdt='git diff-tree --no-commit-id --name-only -r'
-alias gdup='git diff @{upstream}'
-alias gdw='git diff --word-diff'
-
-function gdnolock() {
- git diff "$@" ":(exclude)package-lock.json" ":(exclude)*.lock"
-}
-compdef _git gdnolock=git-diff
-
-function gdv() { git diff -w "$@" | view - }
-compdef _git gdv=git-diff
-
-alias gf='git fetch'
-# --jobs= was added in git 2.8
-is-at-least 2.8 "$git_version" \
- && alias gfa='git fetch --all --prune --jobs=10' \
- || alias gfa='git fetch --all --prune'
-alias gfo='git fetch origin'
-
-alias gfg='git ls-files | grep'
-
-alias gg='git gui citool'
-alias gga='git gui citool --amend'
-
-function ggf() {
- [[ "$#" != 1 ]] && local b="$(git_current_branch)"
- git push --force origin "${b:=$1}"
-}
-compdef _git ggf=git-checkout
-function ggfl() {
- [[ "$#" != 1 ]] && local b="$(git_current_branch)"
- git push --force-with-lease origin "${b:=$1}"
-}
-compdef _git ggfl=git-checkout
-
-function ggl() {
- if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then
- git pull origin "${*}"
- else
- [[ "$#" == 0 ]] && local b="$(git_current_branch)"
- git pull origin "${b:=$1}"
- fi
-}
-compdef _git ggl=git-checkout
-
-function ggp() {
- if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then
- git push origin "${*}"
- else
- [[ "$#" == 0 ]] && local b="$(git_current_branch)"
- git push origin "${b:=$1}"
- fi
-}
-compdef _git ggp=git-checkout
-
-function ggpnp() {
- if [[ "$#" == 0 ]]; then
- ggl && ggp
- else
- ggl "${*}" && ggp "${*}"
- fi
-}
-compdef _git ggpnp=git-checkout
-
-function ggu() {
- [[ "$#" != 1 ]] && local b="$(git_current_branch)"
- git pull --rebase origin "${b:=$1}"
-}
-compdef _git ggu=git-checkout
-
-alias ggpur='ggu'
-alias ggpull='git pull origin "$(git_current_branch)"'
-alias ggpush='git push origin "$(git_current_branch)"'
-
-alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)'
-alias gpsup='git push --set-upstream origin $(git_current_branch)'
-
-alias ghh='git help'
-
-alias gignore='git update-index --assume-unchanged'
-alias gignored='git ls-files -v | grep "^[[:lower:]]"'
-alias git-svn-dcommit-push='git svn dcommit && git push github $(git_main_branch):svntrunk'
-
-alias gk='\gitk --all --branches &!'
-alias gke='\gitk --all $(git log -g --pretty=%h) &!'
-
-alias gl='git pull'
-alias glg='git log --stat'
-alias glgp='git log --stat -p'
-alias glgg='git log --graph'
-alias glgga='git log --graph --decorate --all'
-alias glgm='git log --graph --max-count=10'
-alias glo='git log --oneline --decorate'
-alias glol="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'"
-alias glols="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat"
-alias glod="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset'"
-alias glods="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short"
-alias glola="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all"
-alias glog='git log --oneline --decorate --graph'
-alias gloga='git log --oneline --decorate --graph --all'
-alias glp="_git_log_prettily"
-
-alias gm='git merge'
-alias gmom='git merge origin/$(git_main_branch)'
-alias gmtl='git mergetool --no-prompt'
-alias gmtlvim='git mergetool --no-prompt --tool=vimdiff'
-alias gmum='git merge upstream/$(git_main_branch)'
-alias gma='git merge --abort'
-
-alias gp='git push'
-alias gpd='git push --dry-run'
-alias gpf='git push --force-with-lease'
-alias gpf!='git push --force'
-alias gpoat='git push origin --all && git push origin --tags'
-alias gpr='git pull --rebase'
-alias gpu='git push upstream'
-alias gpv='git push -v'
-
-alias gr='git remote'
-alias gra='git remote add'
-alias grb='git rebase'
-alias grba='git rebase --abort'
-alias grbc='git rebase --continue'
-alias grbd='git rebase $(git_develop_branch)'
-alias grbi='git rebase -i'
-alias grbm='git rebase $(git_main_branch)'
-alias grbom='git rebase origin/$(git_main_branch)'
-alias grbo='git rebase --onto'
-alias grbs='git rebase --skip'
-alias grev='git revert'
-alias grh='git reset'
-alias grhh='git reset --hard'
-alias groh='git reset origin/$(git_current_branch) --hard'
-alias grm='git rm'
-alias grmc='git rm --cached'
-alias grmv='git remote rename'
-alias grrm='git remote remove'
-alias grs='git restore'
-alias grset='git remote set-url'
-alias grss='git restore --source'
-alias grst='git restore --staged'
-alias grt='cd "$(git rev-parse --show-toplevel || echo .)"'
-alias gru='git reset --'
-alias grup='git remote update'
-alias grv='git remote -v'
-
-alias gsb='git status -sb'
-alias gsd='git svn dcommit'
-alias gsh='git show'
-alias gsi='git submodule init'
-alias gsps='git show --pretty=short --show-signature'
-alias gsr='git svn rebase'
-alias gss='git status -s'
-alias gst='git status'
-
-# use the default stash push on git 2.13 and newer
-is-at-least 2.13 "$git_version" \
- && alias gsta='git stash push' \
- || alias gsta='git stash save'
-
-alias gstaa='git stash apply'
-alias gstc='git stash clear'
-alias gstd='git stash drop'
-alias gstl='git stash list'
-alias gstp='git stash pop'
-alias gsts='git stash show --text'
-alias gstu='gsta --include-untracked'
-alias gstall='git stash --all'
-alias gsu='git submodule update'
-alias gsw='git switch'
-alias gswc='git switch -c'
-alias gswm='git switch $(git_main_branch)'
-alias gswd='git switch $(git_develop_branch)'
-
-alias gts='git tag -s'
-alias gtv='git tag | sort -V'
-alias gtl='gtl(){ git tag --sort=-v:refname -n -l "${1}*" }; noglob gtl'
-
-alias gunignore='git update-index --no-assume-unchanged'
-alias gunwip='git log -n 1 | grep -q -c "\--wip--" && git reset HEAD~1'
-alias gup='git pull --rebase'
-alias gupv='git pull --rebase -v'
-alias gupa='git pull --rebase --autostash'
-alias gupav='git pull --rebase --autostash -v'
-alias gupom='git pull --rebase origin $(git_main_branch)'
-alias gupomi='git pull --rebase=interactive origin $(git_main_branch)'
-alias glum='git pull upstream $(git_main_branch)'
-alias gluc='git pull upstream $(git_current_branch)'
-
-alias gwch='git whatchanged -p --abbrev-commit --pretty=medium'
-alias gwip='git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]"'
-
-alias gwt='git worktree'
-alias gwta='git worktree add'
-alias gwtls='git worktree list'
-alias gwtmv='git worktree move'
-alias gwtrm='git worktree remove'
-
-alias gam='git am'
-alias gamc='git am --continue'
-alias gams='git am --skip'
-alias gama='git am --abort'
-alias gamscp='git am --show-current-patch'
-
function grename() {
if [[ -z "$1" || -z "$2" ]]; then
echo "Usage: $0 old_branch new_branch"
@@ -341,4 +61,328 @@ function grename() {
fi
}
+#
+# Functions Work in Progress (WIP)
+# (sorted alphabetically by function name)
+# (order should follow README)
+#
+
+# Similar to `gunwip` but recursive "Unwips" all recent `--wip--` commits not just the last one
+function gunwipall() {
+ local _commit=$(git log --grep='--wip--' --invert-grep --max-count=1 --format=format:%H)
+
+ # Check if a commit without "--wip--" was found and it's not the same as HEAD
+ if [[ "$_commit" != "$(git rev-parse HEAD)" ]]; then
+ git reset $_commit || return 1
+ fi
+}
+
+# Warn if the current branch is a WIP
+function work_in_progress() {
+ command git -c log.showSignature=false log -n 1 2>/dev/null | grep -q -- "--wip--" && echo "WIP!!"
+}
+
+#
+# Aliases
+# (sorted alphabetically by command)
+# (order should follow README)
+# (in some cases force the alisas order to match README, like for example gke and gk)
+#
+
+alias grt='cd "$(git rev-parse --show-toplevel || echo .)"'
+
+function ggpnp() {
+ if [[ "$#" == 0 ]]; then
+ ggl && ggp
+ else
+ ggl "${*}" && ggp "${*}"
+ fi
+}
+compdef _git ggpnp=git-checkout
+
+alias ggpur='ggu'
+alias g='git'
+alias ga='git add'
+alias gaa='git add --all'
+alias gapa='git add --patch'
+alias gau='git add --update'
+alias gav='git add --verbose'
+alias gwip='git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign --message "--wip-- [skip ci]"'
+alias gam='git am'
+alias gama='git am --abort'
+alias gamc='git am --continue'
+alias gamscp='git am --show-current-patch'
+alias gams='git am --skip'
+alias gap='git apply'
+alias gapt='git apply --3way'
+alias gbs='git bisect'
+alias gbsb='git bisect bad'
+alias gbsg='git bisect good'
+alias gbsn='git bisect new'
+alias gbso='git bisect old'
+alias gbsr='git bisect reset'
+alias gbss='git bisect start'
+alias gbl='git blame -w'
+alias gb='git branch'
+alias gba='git branch --all'
+alias gbd='git branch --delete'
+alias gbD='git branch --delete --force'
+
+# Copied and modified from James Roeder (jmaroeder) under MIT License
+# https://github.com/jmaroeder/plugin-git/blob/216723ef4f9e8dde399661c39c80bdf73f4076c4/functions/gbda.fish
+function gbda() {
+ git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch --delete 2>/dev/null
+
+ local default_branch=$(git_main_branch)
+ (( ! $? )) || default_branch=$(git_develop_branch)
+
+ git for-each-ref refs/heads/ "--format=%(refname:short)" | \
+ while read branch; do
+ local merge_base=$(git merge-base $default_branch $branch)
+ if [[ '-*' == $(git cherry $default_branch $(git commit-tree $(git rev-parse $branch\^{tree}) -p $merge_base -m _)) ]]; then
+ git branch -D $branch
+ fi
+ done
+}
+
+alias gbgd='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d'
+alias gbgD='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D'
+alias gbm='git branch --move'
+alias gbnm='git branch --no-merged'
+alias gbr='git branch --remote'
+alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)'
+alias gbg='LANG=C git branch -vv | grep ": gone\]"'
+alias gco='git checkout'
+alias gcor='git checkout --recurse-submodules'
+alias gcb='git checkout -b'
+alias gcd='git checkout $(git_develop_branch)'
+alias gcm='git checkout $(git_main_branch)'
+alias gcp='git cherry-pick'
+alias gcpa='git cherry-pick --abort'
+alias gcpc='git cherry-pick --continue'
+alias gclean='git clean --interactive -d'
+alias gcl='git clone --recurse-submodules'
+
+function gccd() {
+ command git clone --recurse-submodules "$@"
+ [[ -d "$_" ]] && cd "$_" || cd "${${_:t}%.git}"
+}
+compdef _git gccd=git-clone
+
+alias gcam='git commit --all --message'
+alias gcas='git commit --all --signoff'
+alias gcasm='git commit --all --signoff --message'
+alias gcs='git commit --gpg-sign'
+alias gcss='git commit --gpg-sign --signoff'
+alias gcssm='git commit --gpg-sign --signoff --message'
+alias gcmsg='git commit --message'
+alias gcsm='git commit --signoff --message'
+alias gc='git commit --verbose'
+alias gca='git commit --verbose --all'
+alias gca!='git commit --verbose --all --amend'
+alias gcan!='git commit --verbose --all --no-edit --amend'
+alias gcans!='git commit --verbose --all --signoff --no-edit --amend'
+alias gc!='git commit --verbose --amend'
+alias gcn!='git commit --verbose --no-edit --amend'
+alias gcf='git config --list'
+alias gdct='git describe --tags $(git rev-list --tags --max-count=1)'
+alias gd='git diff'
+alias gdca='git diff --cached'
+alias gdcw='git diff --cached --word-diff'
+alias gds='git diff --staged'
+alias gdw='git diff --word-diff'
+
+function gdv() { git diff -w "$@" | view - }
+compdef _git gdv=git-diff
+
+alias gdup='git diff @{upstream}'
+
+function gdnolock() {
+ git diff "$@" ":(exclude)package-lock.json" ":(exclude)*.lock"
+}
+compdef _git gdnolock=git-diff
+
+alias gdt='git diff-tree --no-commit-id --name-only -r'
+alias gf='git fetch'
+# --jobs= was added in git 2.8
+is-at-least 2.8 "$git_version" \
+ && alias gfa='git fetch --all --prune --jobs=10' \
+ || alias gfa='git fetch --all --prune'
+alias gfo='git fetch origin'
+alias gg='git gui citool'
+alias gga='git gui citool --amend'
+alias ghh='git help'
+alias glgg='git log --graph'
+alias glgga='git log --graph --decorate --all'
+alias glgm='git log --graph --max-count=10'
+alias glods='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset" --date=short'
+alias glod='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset"'
+alias glola='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --all'
+alias glols='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --stat'
+alias glol='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset"'
+alias glo='git log --oneline --decorate'
+alias glog='git log --oneline --decorate --graph'
+alias gloga='git log --oneline --decorate --graph --all'
+
+# Pretty log messages
+function _git_log_prettily(){
+ if ! [ -z $1 ]; then
+ git log --pretty=$1
+ fi
+}
+compdef _git _git_log_prettily=git-log
+
+alias glp='_git_log_prettily'
+alias glg='git log --stat'
+alias glgp='git log --stat --patch'
+alias gignored='git ls-files -v | grep "^[[:lower:]]"'
+alias gfg='git ls-files | grep'
+alias gm='git merge'
+alias gma='git merge --abort'
+alias gms="git merge --squash"
+alias gmom='git merge origin/$(git_main_branch)'
+alias gmum='git merge upstream/$(git_main_branch)'
+alias gmtl='git mergetool --no-prompt'
+alias gmtlvim='git mergetool --no-prompt --tool=vimdiff'
+alias gl='git pull'
+alias gpr='git pull --rebase'
+alias gup='git pull --rebase'
+alias gupa='git pull --rebase --autostash'
+alias gupav='git pull --rebase --autostash --verbose'
+alias gupv='git pull --rebase --verbose'
+
+function ggu() {
+ [[ "$#" != 1 ]] && local b="$(git_current_branch)"
+ git pull --rebase origin "${b:=$1}"
+}
+compdef _git ggu=git-checkout
+
+alias gupom='git pull --rebase origin $(git_main_branch)'
+alias gupomi='git pull --rebase=interactive origin $(git_main_branch)'
+alias ggpull='git pull origin "$(git_current_branch)"'
+
+function ggl() {
+ if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then
+ git pull origin "${*}"
+ else
+ [[ "$#" == 0 ]] && local b="$(git_current_branch)"
+ git pull origin "${b:=$1}"
+ fi
+}
+compdef _git ggl=git-checkout
+
+alias gluc='git pull upstream $(git_current_branch)'
+alias glum='git pull upstream $(git_main_branch)'
+alias gp='git push'
+alias gpd='git push --dry-run'
+
+function ggf() {
+ [[ "$#" != 1 ]] && local b="$(git_current_branch)"
+ git push --force origin "${b:=$1}"
+}
+compdef _git ggf=git-checkout
+
+alias gpf!='git push --force'
+is-at-least 2.30 "$git_version" \
+ && alias gpf='git push --force-with-lease --force-if-includes' \
+ || alias gpf='git push --force-with-lease'
+
+function ggfl() {
+ [[ "$#" != 1 ]] && local b="$(git_current_branch)"
+ git push --force-with-lease origin "${b:=$1}"
+}
+compdef _git ggfl=git-checkout
+
+alias gpsup='git push --set-upstream origin $(git_current_branch)'
+is-at-least 2.30 "$git_version" \
+ && alias gpsupf='git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes' \
+ || alias gpsupf='git push --set-upstream origin $(git_current_branch) --force-with-lease'
+alias gpv='git push --verbose'
+alias gpoat='git push origin --all && git push origin --tags'
+alias gpod='git push origin --delete'
+alias ggpush='git push origin "$(git_current_branch)"'
+
+function ggp() {
+ if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then
+ git push origin "${*}"
+ else
+ [[ "$#" == 0 ]] && local b="$(git_current_branch)"
+ git push origin "${b:=$1}"
+ fi
+}
+compdef _git ggp=git-checkout
+
+alias gpu='git push upstream'
+alias grb='git rebase'
+alias grba='git rebase --abort'
+alias grbc='git rebase --continue'
+alias grbi='git rebase --interactive'
+alias grbo='git rebase --onto'
+alias grbs='git rebase --skip'
+alias grbd='git rebase $(git_develop_branch)'
+alias grbm='git rebase $(git_main_branch)'
+alias grbom='git rebase origin/$(git_main_branch)'
+alias gr='git remote'
+alias grv='git remote --verbose'
+alias gra='git remote add'
+alias grrm='git remote remove'
+alias grmv='git remote rename'
+alias grset='git remote set-url'
+alias grup='git remote update'
+alias grh='git reset'
+alias gru='git reset --'
+alias grhh='git reset --hard'
+alias grhk='git reset --keep'
+alias grhs='git reset --soft'
+alias gpristine='git reset --hard && git clean --force -dfx'
+alias groh='git reset origin/$(git_current_branch) --hard'
+alias grs='git restore'
+alias grss='git restore --source'
+alias grst='git restore --staged'
+alias gunwip='git rev-list --max-count=1 --format="%s" HEAD | grep -q "\--wip--" && git reset HEAD~1'
+alias grev='git revert'
+alias grm='git rm'
+alias grmc='git rm --cached'
+alias gcount='git shortlog --summary --numbered'
+alias gsh='git show'
+alias gsps='git show --pretty=short --show-signature'
+alias gstall='git stash --all'
+alias gstaa='git stash apply'
+alias gstc='git stash clear'
+alias gstd='git stash drop'
+alias gstl='git stash list'
+alias gstp='git stash pop'
+# use the default stash push on git 2.13 and newer
+is-at-least 2.13 "$git_version" \
+ && alias gsta='git stash push' \
+ || alias gsta='git stash save'
+alias gsts='git stash show --patch'
+alias gst='git status'
+alias gss='git status --short'
+alias gsb='git status --short --branch'
+alias gsi='git submodule init'
+alias gsu='git submodule update'
+alias gsd='git svn dcommit'
+alias git-svn-dcommit-push='git svn dcommit && git push github $(git_main_branch):svntrunk'
+alias gsr='git svn rebase'
+alias gsw='git switch'
+alias gswc='git switch --create'
+alias gswd='git switch $(git_develop_branch)'
+alias gswm='git switch $(git_main_branch)'
+alias gta='git tag --annotate'
+alias gts='git tag --sign'
+alias gtv='git tag | sort -V'
+alias gignore='git update-index --assume-unchanged'
+alias gunignore='git update-index --no-assume-unchanged'
+alias gwch='git whatchanged -p --abbrev-commit --pretty=medium'
+alias gwt='git worktree'
+alias gwta='git worktree add'
+alias gwtls='git worktree list'
+alias gwtmv='git worktree move'
+alias gwtrm='git worktree remove'
+alias gstu='gsta --include-untracked'
+alias gtl='gtl(){ git tag --sort=-v:refname -n --list "${1}*" }; noglob gtl'
+alias gk='\gitk --all --branches &!'
+alias gke='\gitk --all $(git log --walk-reflogs --pretty=%h) &!'
+
unset git_version
diff --git a/plugins/gitignore/README.md b/plugins/gitignore/README.md
index 753dd31f..23c7887c 100644
--- a/plugins/gitignore/README.md
+++ b/plugins/gitignore/README.md
@@ -1,6 +1,6 @@
# gitignore
-This plugin enables you the use of [gitignore.io](https://www.gitignore.io/) from the command line. You need an active internet connection.
+This plugin enables you the use of [gitignore.io](https://www.toptal.com/developers/gitignore) from the command line. You need an active internet connection.
To use it, add `gitignore` to the plugins array in your zshrc file:
diff --git a/plugins/gitignore/gitignore.plugin.zsh b/plugins/gitignore/gitignore.plugin.zsh
index a687f5cc..3271d61a 100644
--- a/plugins/gitignore/gitignore.plugin.zsh
+++ b/plugins/gitignore/gitignore.plugin.zsh
@@ -1,7 +1,7 @@
-function gi() { curl -fLw '\n' https://www.gitignore.io/api/"${(j:,:)@}" }
+function gi() { curl -fLw '\n' https://www.toptal.com/developers/gitignore/api/"${(j:,:)@}" }
_gitignoreio_get_command_list() {
- curl -sfL https://www.gitignore.io/api/list | tr "," "\n"
+ curl -sfL https://www.toptal.com/developers/gitignore/api/list | tr "," "\n"
}
_gitignoreio () {
diff --git a/plugins/gnu-utils/gnu-utils.plugin.zsh b/plugins/gnu-utils/gnu-utils.plugin.zsh
index 9419127d..6023bf2b 100644
--- a/plugins/gnu-utils/gnu-utils.plugin.zsh
+++ b/plugins/gnu-utils/gnu-utils.plugin.zsh
@@ -19,7 +19,7 @@ __gnu_utils() {
'gchown' 'gchroot' 'gcksum' 'gcomm' 'gcp' 'gcsplit' 'gcut' 'gdate'
'gdd' 'gdf' 'gdir' 'gdircolors' 'gdirname' 'gdu' 'gecho' 'genv' 'gexpand'
'gexpr' 'gfactor' 'gfalse' 'gfmt' 'gfold' 'ggroups' 'ghead' 'ghostid'
- 'gid' 'ginstall' 'gjoin' 'gkill' 'glink' 'gln' 'glogname' 'gls' 'gmd5sum'
+ 'gid' 'gindent' 'ginstall' 'gjoin' 'gkill' 'glink' 'gln' 'glogname' 'gls' 'gmd5sum'
'gmkdir' 'gmkfifo' 'gmknod' 'gmktemp' 'gmv' 'gnice' 'gnl' 'gnohup' 'gnproc'
'god' 'gpaste' 'gpathchk' 'gpinky' 'gpr' 'gprintenv' 'gprintf' 'gptx' 'gpwd'
'greadlink' 'grm' 'grmdir' 'gruncon' 'gseq' 'gsha1sum' 'gsha224sum'
@@ -61,3 +61,14 @@ __gnu_utils_preexec() {
autoload -Uz add-zsh-hook
add-zsh-hook preexec __gnu_utils_preexec
+
+# lib/theme-and-appearance.zsh sets the alias for ls not knowing that
+# we'll be using GNU ls. We'll reset this to use GNU ls --color.
+# See https://github.com/ohmyzsh/ohmyzsh/issues/11503
+#
+# The ls alias might look like:
+# - ls='ls -G'
+# - ls='gls --color=tty'
+if [[ -x "${commands[gls]}" && "${aliases[ls]}" = (*-G*|gls*) ]]; then
+ alias ls='ls --color=tty'
+fi
diff --git a/plugins/golang/README.md b/plugins/golang/README.md
index 3b7d1e19..128cc7fb 100644
--- a/plugins/golang/README.md
+++ b/plugins/golang/README.md
@@ -16,11 +16,12 @@ plugins=(... golang)
| gob | `go build` | Build your code |
| goc | `go clean` | Removes object files from package source directories |
| god | `go doc` | Prints documentation comments |
+| goe | `go env` | Prints Go environment information |
| gof | `go fmt` | Gofmt formats (aligns and indents) Go programs. |
| gofa | `go fmt ./...` | Run go fmt for all packages in current directory, recursively |
| gofx | `go fix` | Update packages to use a new API |
| gog | `go get` | Downloads packages and then installs them to $GOPATH |
-| gog | `go get ./...` | Installs all dependencies in current directory, recursively |
+| goga | `go get ./...` | Installs all dependencies in current directory, recursively |
| goi | `go install` | Compiles and installs packages to $GOPATH |
| gol | `go list` | Lists Go packages |
| gom | `go mod` | Access to operations on modules |
@@ -35,4 +36,5 @@ plugins=(... golang)
| gotod | `go tool dist` | Utility to bootstrap, build and test go runtime |
| gotofx | `go tool fix` | Fixes an application to use newer features |
| gov | `go vet` | Vet examines Go source code and reports suspicious constructs |
+| gove | `go version` | Prints Go version |
| gow | `go work` | Work provides access to operations on workspaces |
diff --git a/plugins/golang/golang.plugin.zsh b/plugins/golang/golang.plugin.zsh
index 0dbaab06..45ccd3a1 100644
--- a/plugins/golang/golang.plugin.zsh
+++ b/plugins/golang/golang.plugin.zsh
@@ -13,6 +13,7 @@ unset p
alias gob='go build'
alias goc='go clean'
alias god='go doc'
+alias goe='go env'
alias gof='go fmt'
alias gofa='go fmt ./...'
alias gofx='go fix'
@@ -32,4 +33,5 @@ alias gotoc='go tool compile'
alias gotod='go tool dist'
alias gotofx='go tool fix'
alias gov='go vet'
+alias gove='go version'
alias gow='go work'
diff --git a/plugins/gradle/_gradle b/plugins/gradle/_gradle
index 770723d8..f8df928b 100644
--- a/plugins/gradle/_gradle
+++ b/plugins/gradle/_gradle
@@ -1,4 +1,6 @@
#compdef gradle gradlew gw
+# THE LINE ABOVE MUST BE THE FIRST LINE OF THIS FILE IN ORDER FOR COMPLETION TO WORK
+
#
# Taken from https://github.com/gradle/gradle-completion
# Copyright (c) 2017 Eric Wendelin
@@ -96,7 +98,7 @@ __gradle-generate-script-cache() {
zle -R "Generating Gradle build script cache"
# Cache all Gradle scripts
local -a gradle_build_scripts
- gradle_build_scripts=( $(find $project_root_dir -type f -name "*.gradle" -o -name "*.gradle.kts" 2>/dev/null | grep -E -v "$script_exclude_pattern") )
+ gradle_build_scripts=( $(find $project_root_dir -type f -name "*.gradle" -o -name "*.gradle.kts" 2>/dev/null | egrep -v "$script_exclude_pattern") )
printf "%s\n" "${gradle_build_scripts[@]}" >| $cache_dir/$cache_name
fi
}
@@ -116,9 +118,9 @@ __gradle-generate-tasks-cache() {
# Reuse Gradle Daemon if IDLE but don't start a new one.
local gradle_tasks_output
if [[ ! -z "$($gradle_cmd --status 2>/dev/null | grep IDLE)" ]]; then
- gradle_tasks_output="$($gradle_cmd --daemon --build-file $gradle_build_file --console plain -q tasks --all 2>/dev/null)"
+ gradle_tasks_output="$($gradle_cmd --daemon --no-scan --build-file $gradle_build_file --console=plain -q tasks --all 2>/dev/null)"
else
- gradle_tasks_output="$($gradle_cmd --no-daemon --build-file $gradle_build_file --console plain -q tasks --all 2>/dev/null)"
+ gradle_tasks_output="$($gradle_cmd --no-daemon --no-scan --build-file $gradle_build_file --console=plain -q tasks --all 2>/dev/null)"
fi
local gradle_all_tasks="" root_tasks="" subproject_tasks="" output_line
local -a match
@@ -180,7 +182,7 @@ __gradle_tasks() {
local cached_checksum="$(cat $cache_dir/$cache_name.md5)"
local -a cached_tasks
if [[ -z $cur ]]; then
- cached_tasks=(${(f)"$(cat $cache_dir/$cached_checksum)"})
+ cached_tasks=(${(f)"$(grep -v "^\\\:" $cache_dir/$cached_checksum)"})
else
cached_tasks=(${(f)"$(grep "^${cur//:/\\\\:}" $cache_dir/$cached_checksum)"})
fi
@@ -191,7 +193,7 @@ __gradle_tasks() {
# Regenerate tasks cache in the background
if [[ $gradle_files_checksum != "$(cat $cache_dir/$cache_name.md5)" || ! -f $cache_dir/$gradle_files_checksum || $(wc -c < $cache_dir/$gradle_files_checksum) -le 1 ]]; then
- $(__gradle-generate-tasks-cache 1>&2 2>/dev/null &)
+ $(__gradle-generate-tasks-cache &> /dev/null &)
fi
else
_describe 'built-in tasks' '(
@@ -262,7 +264,10 @@ __gradle_subcommand() {
{-b,--build-file}'[Specifies the build file.]:build script:_files -g \*.gradle' \
{-C,--cache}'[Specifies how compiled build scripts should be cached.]:cache policy:(on rebuild)' \
{-c,--settings-file}'[Specifies the settings file.]:settings file:_files -g \*.gradle' \
+ '(--configuration-cache)--no-configuration-cache[Disables the configuration cache. Gradle will not reuse the build configuration from previous builds.]' \
+ '--configuration-cache-problems=[Configures how the configuration cache handles problems]:problem handling:(fail warn)' \
'(--no-configure-on-demand)--configure-on-demand[Only relevant projects are configured in this build run.]' \
+ '(--no-configuration-cache)--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \
'--console=[Specifies which type of console output to generate.]:console output type:(plain auto rich verbose)' \
'--continue[Continues task execution after a task failure.]' \
'-Dorg.gradle.cache.reserved.mb=[Reserve Gradle Daemon memory for operations.]' \
@@ -276,6 +281,7 @@ __gradle_subcommand() {
'-Dorg.gradle.logging.level=[Set default Gradle log level.]:log level:(quiet warn lifecycle info debug)' \
'-Dorg.gradle.parallel=[Set true to enable parallel project builds.]:enable parallel build:(true false)' \
'-Dorg.gradle.priority=[Set priority for Gradle worker processes.]:priority:(low normal)' \
+ '-Dorg.gradle.unsafe.watch-fs=[Set true to enable Gradle file watcher.]:enable watcher:(true false)' \
'-Dorg.gradle.warning.mode=[Set types of warnings to log.]:warning level:(all summary none)' \
'-Dorg.gradle.workers.max=[Set the number of workers Gradle is allowed to use.]' \
'(-i --info -w --warn -q --quiet)'{-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \
@@ -314,6 +320,7 @@ __gradle_subcommand() {
'(--write-locks)--update-locks[Perform a partial update of the dependency lock.]' \
'(-d --debug -q --quiet -i --info)'{-w,--warn}'[Log warnings and errors only.]' \
'--warning-mode=[Set types of warnings to log.]:warning mode:(all summary none)' \
+ '(--no-watch-fs)--watch-fs[Gradle watches filesystem for incremental builds.]' \
'(--update-locks)--write-locks[Persists dependency resolution for locked configurations.]' \
{-x,--exclude-task}'[Specify a task to be excluded from execution.]' && ret=0
;;
@@ -347,6 +354,9 @@ _gradle() {
{-b,--build-file}'[Specifies the build file.]:build script:_files -g \*.gradle' \
{-C,--cache}'[Specifies how compiled build scripts should be cached.]:cache policy:(on rebuild)' \
{-c,--settings-file}'[Specifies the settings file.]:settings file:_files -g \*.gradle:->argument-expected' \
+ '(--no-configuration-cache)--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \
+ '(--configuration-cache)--no-configuration-cache[Disables the configuration cache. Gradle will not reuse the build configuration from previous builds.]' \
+ '--configuration-cache-problems=[Configures how the configuration cache handles problems]:problem handling:(fail warn)' \
'(--no-configure-on-demand)--configure-on-demand[Only relevant projects are configured in this build run.]' \
'--console=[Specifies which type of console output to generate.]:console output type:(plain auto rich verbose)' \
'--continue[Continues task execution after a task failure.]' \
@@ -361,6 +371,7 @@ _gradle() {
'-Dorg.gradle.logging.level=[Set default Gradle log level.]:log level:(quiet warn lifecycle info debug)' \
'-Dorg.gradle.parallel=[Set true to enable parallel project builds.]:(true false)' \
'-Dorg.gradle.priority=[Set priority for Gradle worker processes.]:priority:(low normal)' \
+ '-Dorg.gradle.unsafe.watch-fs=[Set true to enable Gradle file watcher.]:enable watcher:(true false)' \
'-Dorg.gradle.warning.mode=[Set types of warnings to log.]:warning level:(all summary none)' \
'-Dorg.gradle.workers.max=[Set the number of workers Gradle is allowed to use.]' \
'(-i --info -w --warn -q --quiet)'{-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \
@@ -404,6 +415,7 @@ _gradle() {
'(-d --debug -q --quiet -i --info)'{-w,--warn}'[Log warnings and errors only.]' \
'--warning-mode=[Set types of warnings to log.]:warning mode:(all summary none)' \
'(--update-locks)--write-locks[Persists dependency resolution for locked configurations.]' \
+ '(--no-watch-fs)--watch-fs[Gradle watches filesystem for incremental builds.]' \
{-x,--exclude-task}'[Specify a task to be excluded from execution.]' \
'(-)*:: :->task-or-option' && ret=0
diff --git a/plugins/gradle/gradle.plugin.zsh b/plugins/gradle/gradle.plugin.zsh
index 5bca364d..dacc4647 100644
--- a/plugins/gradle/gradle.plugin.zsh
+++ b/plugins/gradle/gradle.plugin.zsh
@@ -6,7 +6,7 @@ function gradle-or-gradlew() {
# taken from https://github.com/gradle/gradle-completion
local dir="$PWD" project_root="$PWD"
while [[ "$dir" != / ]]; do
- if [[ -f "$dir/settings.gradle" || -f "$dir/settings.gradle.kts" || -f "$dir/gradlew" ]]; then
+ if [[ -x "$dir/gradlew" ]]; then
project_root="$dir"
break
fi
diff --git a/plugins/grc/grc.plugin.zsh b/plugins/grc/grc.plugin.zsh
index b709b9e0..e036b8d8 100644
--- a/plugins/grc/grc.plugin.zsh
+++ b/plugins/grc/grc.plugin.zsh
@@ -2,8 +2,9 @@
# common grc.zsh paths
files=(
- /etc/grc.zsh # default
- /usr/local/etc/grc.zsh # homebrew
+ /etc/grc.zsh # default
+ /usr/local/etc/grc.zsh # homebrew darwin-x64
+ /opt/homebrew/etc/grc.zsh # homebrew darwin-arm64
)
# verify the file is readable and source it
diff --git a/plugins/helm/README.md b/plugins/helm/README.md
index 49844c78..8be024bf 100644
--- a/plugins/helm/README.md
+++ b/plugins/helm/README.md
@@ -1,9 +1,18 @@
# Helm plugin
-This plugin adds completion for [Helm](https://helm.sh/), the Kubernetes package manager.
+This plugin adds completion and aliases for [Helm](https://helm.sh/), the Kubernetes package manager.
To use it, add `helm` to the plugins array in your zshrc file:
```zsh
plugins=(... helm)
```
+
+## Aliases
+
+| Alias | Full command |
+| ----- | ------------ |
+| h | helm |
+| hin | helm install |
+| hse | helm search |
+| hup | helm upgrade |
diff --git a/plugins/helm/helm.plugin.zsh b/plugins/helm/helm.plugin.zsh
index 151c43d8..7fc05be9 100644
--- a/plugins/helm/helm.plugin.zsh
+++ b/plugins/helm/helm.plugin.zsh
@@ -11,3 +11,8 @@ else
source "$ZSH_CACHE_DIR/completions/_helm"
helm completion zsh | tee "$ZSH_CACHE_DIR/completions/_helm" >/dev/null &|
fi
+
+alias h='helm'
+alias hin='helm install'
+alias hse='helm search'
+alias hup='helm upgrade'
diff --git a/plugins/heroku-alias/README.md b/plugins/heroku-alias/README.md
new file mode 100644
index 00000000..4b7b953f
--- /dev/null
+++ b/plugins/heroku-alias/README.md
@@ -0,0 +1,127 @@
+# heroku-alias
+🧬 Full alias for heroku cli
+
+|🚀 last maj|📡 source|
+|---|---|
+|02/06/2020|[heroku cli doc](https://devcenter.heroku.com/articles/heroku-cli-commands)|
+
+# Alias list
+
+## general
+| Alias | Command |
+| ------------- | ------------- |
+| h | heroku |
+| hauto | heroku autocomplete $(echo $SHELL) |
+| hl | heroku local |
+
+## config
+| Alias | Command |
+| ------------- | ------------- |
+| hc | heroku config |
+| hca | heroku config -a |
+| hcr | heroku config -r |
+| hcs | heroku config:set |
+| hcu | heroku config:unset |
+| hcfile | function hcfile bellow |
+
+```sh
+hcfile() {
+ echo " Which platform [-r/a name] ? "
+ read platform
+ echo " Which file ? "
+ read file
+ while read line;
+ do heroku config:set "$platform" "$line";
+ done < "$file"
+}
+```
+
+## apps and favorites
+| Alias | Command |
+| ------------- | ------------- |
+| ha | heroku apps |
+| hpop | heroku create |
+| hkill | heroku apps:destroy |
+| hlog | heroku apps:errors |
+| hfav | heroku apps:favorites |
+| hfava | heroku apps:favorites:add |
+| hfavr | heroku apps:favorites:remove |
+| hai | heroku apps:info |
+| hair | heroku apps:info -r |
+| haia | heroku apps:info -a |
+
+# auth
+| Alias | Command |
+| ------------- | ------------- |
+| h2fa | heroku auth:2fa |
+| h2far | heroku auth:2fa:disable |
+
+# access
+| Alias | Command |
+| ------------- | ------------- |
+| hac | heroku access |
+| hacr | heroku access -r |
+| haca | heroku access -a |
+| hadd | heroku access:add |
+| hdel | heroku access:remove |
+| hup | heroku access:update |
+
+## addons
+| Alias | Command |
+| ------------- | ------------- |
+| hads | heroku addons -A |
+| hada | heroku addons -a |
+| hadr | heroku addons -r |
+| hadat | heroku addons:attach |
+| hadc | heroku addons:create |
+| hadel | heroku addons:destroy |
+| hadde | heroku addons:detach |
+| hadoc | heroku addons:docs |
+
+## login
+| Alias | Command |
+| ------------- | ------------- |
+| hin | heroku login |
+| hout | heroku logout |
+| hi | heroku login -i |
+| hwho | heroku auth:whoami |
+
+## authorizations
+| Alias | Command |
+| ------------- | ------------- |
+| hth | heroku authorizations |
+| hthadd | heroku authorizations:create |
+| hthif | heroku authorizations:info |
+| hthdel | heroku authorizations:revoke |
+| hthrot | heroku authorizations:rotate |
+| hthup | heroku authorizations:update |
+
+## plugins
+| Alias | Command |
+| ------------- | ------------- |
+| hp | heroku plugins |
+
+# log
+| Alias | Command |
+| ------------- | ------------- |
+|hg | heroku logs|
+| hgt | heroku log tail |
+
+# database
+| Alias | Command |
+| ------------- | ------------- |
+| hpg | heroku pg |
+| hpsql | heroku pg:psql |
+| hpb | heroku pg:backups |
+| hpbc | heroku pg:backups:capture |
+| hpbd | heroku pg:backups:download |
+| hpbr | heroku pg:backups:restore |
+
+# certs
+| Alias | Command |
+| ------------- | ------------- |
+| hssl | heroku certs |
+| hssli | heroku certs:info |
+| hssla | heroku certs:add |
+| hsslu | heroku certs:update |
+| hsslr | heroku certs:remove |
diff --git a/plugins/heroku-alias/heroku.alias.sh b/plugins/heroku-alias/heroku.alias.sh
new file mode 100644
index 00000000..7daf715b
--- /dev/null
+++ b/plugins/heroku-alias/heroku.alias.sh
@@ -0,0 +1,92 @@
+# general
+alias h='heroku'
+alias hauto='heroku autocomplete $(echo $SHELL)'
+alias hl='heroku local'
+
+# log
+alias hg='heroku logs'
+alias hgt='heroku log tail'
+
+# database
+alias hpg='heroku pg'
+alias hpsql='heroku pg:psql'
+alias hpb='heroku pg:backups'
+alias hpbc='heroku pg:backups:capture'
+alias hpbd='heroku pg:backups:download'
+alias hpbr='heroku pg:backups:restore'
+
+# config
+alias hc='heroku config'
+alias hca='heroku config -a'
+alias hcr='heroku config -r'
+alias hcs='heroku config:set'
+alias hcu='heroku config:unset'
+
+# this function allow to load multi env set in a file
+hcfile() {
+ echo 'Which platform [-r/a name] ?'
+ read platform
+ echo 'Which file ?'
+ read file
+ while read line;
+ do heroku config:set "$platform" "$line";
+ done < "$file"
+}
+
+# apps and favorites
+alias ha='heroku apps'
+alias hpop='heroku create'
+alias hkill='heroku apps:destroy'
+alias hlog='heroku apps:errors'
+alias hfav='heroku apps:favorites'
+alias hfava='heroku apps:favorites:add'
+alias hfavr='heroku apps:favorites:remove'
+alias hai='heroku apps:info'
+alias hair='heroku apps:info -r'
+alias haia='heroku apps:info -a'
+
+# auth
+alias h2fa='heroku auth:2fa'
+alias h2far='heroku auth:2fa:disable'
+
+# access
+alias hac='heroku access'
+alias hacr='heroku access -r'
+alias haca='heroku access -a'
+alias hadd='heroku access:add'
+alias hdel='heroku access:remove'
+alias hup='heroku access:update'
+
+# addons
+alias hads='heroku addons -A'
+alias hada='heroku addons -a'
+alias hadr='heroku addons -r'
+alias hadat='heroku addons:attach'
+alias hadc='heroku addons:create'
+alias hadel='heroku addons:destroy'
+alias hadde='heroku addons:detach'
+alias hadoc='heroku addons:docs'
+
+# login
+alias hin='heroku login'
+alias hout='heroku logout'
+alias hi='heroku login -i'
+alias hwho='heroku auth:whoami'
+
+# authorizations
+alias hth='heroku authorizations'
+alias hthadd='heroku authorizations:create'
+alias hthif='heroku authorizations:info'
+alias hthdel='heroku authorizations:revoke'
+alias hthrot='heroku authorizations:rotate'
+alias hthup='heroku authorizations:update'
+
+# plugins
+alias hp='heroku plugins'
+
+# cert
+alias hssl='heroku certs'
+alias hssli='heroku certs:info'
+alias hssla='heroku certs:add'
+alias hsslu='heroku certs:update'
+alias hsslr='heroku certs:remove'
diff --git a/plugins/hitchhiker/fortunes/hitchhiker b/plugins/hitchhiker/fortunes/hitchhiker
index 825b86cd..94cc1c83 100644
--- a/plugins/hitchhiker/fortunes/hitchhiker
+++ b/plugins/hitchhiker/fortunes/hitchhiker
@@ -80,7 +80,7 @@
%
"The fronting for the eighty-yard-long marble-topped bar had been made by stitching together nearly twenty thousand Antarean Mosaic Lizard skins, despite the fact that the twenty thousand lizards concerned had needed them to keep their insides in."
-- The Book decribing Milliways' politically incorrect decor.
+- The Book describing Milliways' politically incorrect decor.
%
"`...and the Universe,' continued the waiter, determined not to be deflected on his home stretch, `will explode later for your pleasure.' Ford's head swivelled slowly towards him. He spoke with feeling. `Wow,' he said, `What sort of drinks do you serve in this place?' The waiter laughed a polite little waiter's laugh. `Ah,' he said, `I think sir has perhaps misunderstood me.' `Oh, I hope not,' breathed Ford."
@@ -104,7 +104,7 @@
%
"`The first ten million years were the worst,' said Marvin, `and the second ten million, they were the worst too. The third ten million I didn't enjoy at all. After that I went into a bit of a decline.'"
-- Marvin reflecting back on his 576,000,003,579 year career as Milliways' car park attendent.
+- Marvin reflecting back on his 576,000,003,579 year career as Milliways' car park attendant.
%
"`Incidentally,' he said, `what does teleport mean?' Another moment passed. Slowly, the others turned to face him. `Probably the wrong moment to ask,' said Arthur, `It's just I remember you use the word a short while ago and I only bring it up because...' `Where,' said Ford quietly, `does it say teleport?' `Well, just over here in fact,' said Arthur, pointing at a dark control box in the rear of the cabin, `Just under the word "emergency", above the word "system" and beside the sign saying "out of order".'"
@@ -122,7 +122,7 @@
- Ford "debating" what to do with fire with a marketing girl.
%
-"The story goes that I first had the idea for THHGTTG while lying drunk in a field in Innsbruck (or `Spain' as the BBC TV publicity department authoritatively has it, probably because it's easier to spell)." - Foreward by DNA.
+"The story goes that I first had the idea for THHGTTG while lying drunk in a field in Innsbruck (or `Spain' as the BBC TV publicity department authoritatively has it, probably because it's easier to spell)." - Foreword by DNA.
FORD Six pints of bitter. And quickly please, the world's about to end. BARMAN Oh yes, sir? Nice weather for it.
%
@@ -162,7 +162,7 @@ ARTHUR It probably seems a terrible thing to say, but you know what I sometimes
- Arthur discovering a way of coping with life on Prehistoric Earth.
%
-"`... then I decided that I was a lemon for a couple of weeks. I kept myself amused all that time jumping in and out of a gin and tonic.' Arthur cleared his throat, and then did it again. `Where,' he said, `did you...?' `Find a gin and tonic?' said Ford brightly. `I found a small lake that thought it was a gin and tonic, and jumped in and out of that. At least, I think it thought it was a gin and tonic.' `I may,' he addded with a grin which would have sent sane men scampering into the trees, `have been imagining it.'"
+"`... then I decided that I was a lemon for a couple of weeks. I kept myself amused all that time jumping in and out of a gin and tonic.' Arthur cleared his throat, and then did it again. `Where,' he said, `did you...?' `Find a gin and tonic?' said Ford brightly. `I found a small lake that thought it was a gin and tonic, and jumped in and out of that. At least, I think it thought it was a gin and tonic.' `I may,' he added with a grin which would have sent sane men scampering into the trees, `have been imagining it.'"
- Ford updating Arthur about what he's been doing for the past four years.
%
@@ -194,31 +194,31 @@ ARTHUR It probably seems a terrible thing to say, but you know what I sometimes
- One of the more preferable pieces of advice contained in the Guide.
%
-"His eyes seemed to be popping out of his head. He wasn't certain if this was because they were trying to see more clearly, or if they simply wanted to leave at this point."QUOTEHERESTRINGMAGIC1234- Arthur trying to see who had diverted him from going to a party.
+"His eyes seemed to be popping out of his head. He wasn't certain if this was because they were trying to see more clearly, or if they simply wanted to leave at this point." - Arthur trying to see who had diverted him from going to a party.
%
-"Arthur yawed wildly as his skin tried to jump one way and his skeleton the other, whilst his brain tried to work out which of his ears it most wanted to crawl out of. `Bet you weren't expecting to see me again,' said the monster, which Arthur couldn't help thinking was a strange remark for it to make, seeing as he had never met the creature before. He could tell that he hadn't met the creature before from the simple fact that he was able to sleep at nights."QUOTEHERESTRINGMAGIC1234- Arthur discovering who had diverted him from going to a party.
+"Arthur yawed wildly as his skin tried to jump one way and his skeleton the other, whilst his brain tried to work out which of his ears it most wanted to crawl out of. `Bet you weren't expecting to see me again,' said the monster, which Arthur couldn't help thinking was a strange remark for it to make, seeing as he had never met the creature before. He could tell that he hadn't met the creature before from the simple fact that he was able to sleep at nights." - Arthur discovering who had diverted him from going to a party.
%
-"`That young girl is one of the least benightedly unintelligent organic life forms it has been my profound lack of pleasure not to be able to avoid meeting.'"QUOTEHERESTRINGMAGIC1234- Marvin's first ever compliment about anybody.
+"`That young girl is one of the least benightedly unintelligent organic life forms it has been my profound lack of pleasure not to be able to avoid meeting.'" - Marvin's first ever compliment about anybody.
%
-"Arthur hoped and prayed that there wasn't an afterlife. Then he realised there was a contradiction there and merely hoped that there wasn't an afterlife."QUOTEHERESTRINGMAGIC1234- Arthur realising that he's in a certain death situation with a supernova bomb that is shaped like a cricket ball.
+"Arthur hoped and prayed that there wasn't an afterlife. Then he realised there was a contradiction there and merely hoped that there wasn't an afterlife." - Arthur realising that he's in a certain death situation with a supernova bomb that is shaped like a cricket ball.
%
-"`Credit?' he said. `Aaaargggh...' These two words are usually coupled together in the Old Pink Dog Bar."QUOTEHERESTRINGMAGIC1234- Ford in a spot of bother.
+"`Credit?' he said. `Aaaargggh...' These two words are usually coupled together in the Old Pink Dog Bar." - Ford in a spot of bother.
%
-"`...we might as well start with where your hand is now.' Arthur said, `So which way do I go?' `Down,' said Fenchurch, `on this occasion.' He moved his hand. `Down,' she said, `is in fact the other way.' `Oh yes.'"QUOTEHERESTRINGMAGIC1234- Arthur trying to discover which part of Fenchurch is wrong.
+"`...we might as well start with where your hand is now.' Arthur said, `So which way do I go?' `Down,' said Fenchurch, `on this occasion.' He moved his hand. `Down,' she said, `is in fact the other way.' `Oh yes.'" - Arthur trying to discover which part of Fenchurch is wrong.
%
-"There was a point to this story, but it has temporarily escaped the chronicler's mind."QUOTEHERESTRINGMAGIC1234- This line perhaps best sums up the whole book.
+"There was a point to this story, but it has temporarily escaped the chronicler's mind." - This line perhaps best sums up the whole book.
%
-"The last time anybody made a list of the top hundred character attributes of New Yorkers, common sense snuck in at number 79. .... When it's fall in New York, the air smells as if someone's been frying goats in it, and if you are keen to breathe the best plan is to open a window and stick your head in a building."QUOTEHERESTRINGMAGIC1234- Nuff said??
+"The last time anybody made a list of the top hundred character attributes of New Yorkers, common sense snuck in at number 79. .... When it's fall in New York, the air smells as if someone's been frying goats in it, and if you are keen to breathe the best plan is to open a window and stick your head in a building." - Nuff said??
%
-"`What's been happening here?' he demanded. `Oh just the nicest things, sir, just the nicest things. can I sit on your lap please?'" "`Colin, I am going to abandon you to your fate.' `I'm so happy.'" "`It will be very, very nasty for you, and that's just too bad. Got it?' `I gurgle with pleasure.'"QUOTEHERESTRINGMAGIC1234- Ford and Colin the robot.
+"`What's been happening here?' he demanded. `Oh just the nicest things, sir, just the nicest things. can I sit on your lap please?'" "`Colin, I am going to abandon you to your fate.' `I'm so happy.'" "`It will be very, very nasty for you, and that's just too bad. Got it?' `I gurgle with pleasure.'" - Ford and Colin the robot.
%
-"What the hell, he thought, you're only young once, and threw himself out of the window. That would at least keep the element of surprise on his side."QUOTEHERESTRINGMAGIC1234- Ford outwitting a Vogon with a rocket launcher by going into another certain death situation.
+"What the hell, he thought, you're only young once, and threw himself out of the window. That would at least keep the element of surprise on his side." - Ford outwitting a Vogon with a rocket launcher by going into another certain death situation.
%
-"The major difference between a thing that might go wrong and a thing that cannot possibly go wrong is that when a thing that cannot possibly go wrong goes wrong it usually turns out to be impossible to get at or repair."QUOTEHERESTRINGMAGIC1234- One of the laws of computers and programming revealed.
+"The major difference between a thing that might go wrong and a thing that cannot possibly go wrong is that when a thing that cannot possibly go wrong goes wrong it usually turns out to be impossible to get at or repair." - One of the laws of computers and programming revealed.
%
-"`You know they've reintroduced the death penalty for insurance company directors?' `Really?' said Arthur. `No I didn't. For what offence?' Trillian frowned. `What do you mean, offence?' `I see.'"QUOTEHERESTRINGMAGIC1234- Evidence that there will be some justice in the Universe eventually.
+"`You know they've reintroduced the death penalty for insurance company directors?' `Really?' said Arthur. `No I didn't. For what offence?' Trillian frowned. `What do you mean, offence?' `I see.'" - Evidence that there will be some justice in the Universe eventually.
%
-"`She hit me on the head with the rock again.' `I think I can confirm that that was my daughter.' `Sweet kid.' `You have to get to know her,' said Arthur. `She eases up does she?' `No,' said Arthur, `but you get a better sense of when to duck.'"QUOTEHERESTRINGMAGIC1234- Ford and Arthur on Random.
+"`She hit me on the head with the rock again.' `I think I can confirm that that was my daughter.' `Sweet kid.' `You have to get to know her,' said Arthur. `She eases up does she?' `No,' said Arthur, `but you get a better sense of when to duck.'" - Ford and Arthur on Random.
%
"Far out in the uncharted backwaters of the unfashionable end of the western spiral arm of the Galaxy lies a small unregarded yellow sun. "
%
diff --git a/plugins/iterm2/README.md b/plugins/iterm2/README.md
index 50cdebf5..3d11622d 100644
--- a/plugins/iterm2/README.md
+++ b/plugins/iterm2/README.md
@@ -2,11 +2,20 @@
This plugin adds a few functions that are useful when using [iTerm2](https://www.iterm2.com/).
+
To use it, add _iterm2_ to the plugins array of your zshrc file:
```
plugins=(... iterm2)
```
+Optionally, the plugin also applies the [Shell Integration Script for iTerm2](https://iterm2.com/documentation-shell-integration.html).
+You can enable the integration with zstyle. It's important to add this line
+before the line sourcing oh-my-zsh:
+
+```
+zstyle :omz:plugins:iterm2 shell-integration yes
+```
+
## Plugin commands
* `_iterm2_command `
@@ -24,6 +33,9 @@ plugins=(... iterm2)
* `iterm2_tab_color_reset`
resets the color of iTerm2's current tab back to default.
+
+For shell integration features see the [official documentation](https://iterm2.com/documentation-shell-integration.html).
+
## Contributors
- [Aviv Rosenberg](https://github.com/avivrosenberg)
diff --git a/plugins/iterm2/iterm2.plugin.zsh b/plugins/iterm2/iterm2.plugin.zsh
index 9d8e40bf..d00232a3 100644
--- a/plugins/iterm2/iterm2.plugin.zsh
+++ b/plugins/iterm2/iterm2.plugin.zsh
@@ -7,6 +7,17 @@
# This plugin is only relevant if the terminal is iTerm2 on OSX.
if [[ "$OSTYPE" == darwin* ]] && [[ -n "$ITERM_SESSION_ID" ]] ; then
+ # maybe make it the default in the future and allow opting out?
+ if zstyle -t ':omz:plugins:iterm2' shell-integration; then
+ # Handle $0 according to the standard:
+ # https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+ 0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+ 0="${${(M)0:#/*}:-$PWD/$0}"
+
+ # See official docs: https://iterm2.com/documentation-shell-integration.html
+ source "${0:A:h}/iterm2_shell_integration.zsh"
+ fi
+
###
# Executes an arbitrary iTerm2 command via an escape code sequence.
# See https://iterm2.com/documentation-escape-codes.html for all supported commands.
diff --git a/plugins/iterm2/iterm2_shell_integration.zsh b/plugins/iterm2/iterm2_shell_integration.zsh
new file mode 100644
index 00000000..7871ddde
--- /dev/null
+++ b/plugins/iterm2/iterm2_shell_integration.zsh
@@ -0,0 +1,178 @@
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+if [[ -o interactive ]]; then
+ if [ "${ITERM_ENABLE_SHELL_INTEGRATION_WITH_TMUX-}""$TERM" != "tmux-256color" -a "${ITERM_ENABLE_SHELL_INTEGRATION_WITH_TMUX-}""$TERM" != "screen" -a "${ITERM_SHELL_INTEGRATION_INSTALLED-}" = "" -a "$TERM" != linux -a "$TERM" != dumb ]; then
+ ITERM_SHELL_INTEGRATION_INSTALLED=Yes
+ ITERM2_SHOULD_DECORATE_PROMPT="1"
+ # Indicates start of command output. Runs just before command executes.
+ iterm2_before_cmd_executes() {
+ if [ "$TERM_PROGRAM" = "iTerm.app" ]; then
+ printf "\033]133;C;\r\007"
+ else
+ printf "\033]133;C;\007"
+ fi
+ }
+
+ iterm2_set_user_var() {
+ printf "\033]1337;SetUserVar=%s=%s\007" "$1" $(printf "%s" "$2" | base64 | tr -d '\n')
+ }
+
+ # Users can write their own version of this method. It should call
+ # iterm2_set_user_var but not produce any other output.
+ # e.g., iterm2_set_user_var currentDirectory $PWD
+ # Accessible in iTerm2 (in a badge now, elsewhere in the future) as
+ # \(user.currentDirectory).
+ whence -v iterm2_print_user_vars > /dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ iterm2_print_user_vars() {
+ true
+ }
+ fi
+
+ iterm2_print_state_data() {
+ local _iterm2_hostname="${iterm2_hostname-}"
+ if [ -z "${iterm2_hostname:-}" ]; then
+ _iterm2_hostname=$(hostname -f 2>/dev/null)
+ fi
+ printf "\033]1337;RemoteHost=%s@%s\007" "$USER" "${_iterm2_hostname-}"
+ printf "\033]1337;CurrentDir=%s\007" "$PWD"
+ iterm2_print_user_vars
+ }
+
+ # Report return code of command; runs after command finishes but before prompt
+ iterm2_after_cmd_executes() {
+ printf "\033]133;D;%s\007" "$STATUS"
+ iterm2_print_state_data
+ }
+
+ # Mark start of prompt
+ iterm2_prompt_mark() {
+ printf "\033]133;A\007"
+ }
+
+ # Mark end of prompt
+ iterm2_prompt_end() {
+ printf "\033]133;B\007"
+ }
+
+ # There are three possible paths in life.
+ #
+ # 1) A command is entered at the prompt and you press return.
+ # The following steps happen:
+ # * iterm2_preexec is invoked
+ # * PS1 is set to ITERM2_PRECMD_PS1
+ # * ITERM2_SHOULD_DECORATE_PROMPT is set to 1
+ # * The command executes (possibly reading or modifying PS1)
+ # * iterm2_precmd is invoked
+ # * ITERM2_PRECMD_PS1 is set to PS1 (as modified by command execution)
+ # * PS1 gets our escape sequences added to it
+ # * zsh displays your prompt
+ # * You start entering a command
+ #
+ # 2) You press ^C while entering a command at the prompt.
+ # The following steps happen:
+ # * (iterm2_preexec is NOT invoked)
+ # * iterm2_precmd is invoked
+ # * iterm2_before_cmd_executes is called since we detected that iterm2_preexec was not run
+ # * (ITERM2_PRECMD_PS1 and PS1 are not messed with, since PS1 already has our escape
+ # sequences and ITERM2_PRECMD_PS1 already has PS1's original value)
+ # * zsh displays your prompt
+ # * You start entering a command
+ #
+ # 3) A new shell is born.
+ # * PS1 has some initial value, either zsh's default or a value set before this script is sourced.
+ # * iterm2_precmd is invoked
+ # * ITERM2_SHOULD_DECORATE_PROMPT is initialized to 1
+ # * ITERM2_PRECMD_PS1 is set to the initial value of PS1
+ # * PS1 gets our escape sequences added to it
+ # * Your prompt is shown and you may begin entering a command.
+ #
+ # Invariants:
+ # * ITERM2_SHOULD_DECORATE_PROMPT is 1 during and just after command execution, and "" while the prompt is
+ # shown and until you enter a command and press return.
+ # * PS1 does not have our escape sequences during command execution
+ # * After the command executes but before a new one begins, PS1 has escape sequences and
+ # ITERM2_PRECMD_PS1 has PS1's original value.
+ iterm2_decorate_prompt() {
+ # This should be a raw PS1 without iTerm2's stuff. It could be changed during command
+ # execution.
+ ITERM2_PRECMD_PS1="$PS1"
+ ITERM2_SHOULD_DECORATE_PROMPT=""
+
+ # Add our escape sequences just before the prompt is shown.
+ # Use ITERM2_SQUELCH_MARK for people who can't mdoify PS1 directly, like powerlevel9k users.
+ # This is gross but I had a heck of a time writing a correct if statetment for zsh 5.0.2.
+ local PREFIX=""
+ if [[ $PS1 == *"$(iterm2_prompt_mark)"* ]]; then
+ PREFIX=""
+ elif [[ "${ITERM2_SQUELCH_MARK-}" != "" ]]; then
+ PREFIX=""
+ else
+ PREFIX="%{$(iterm2_prompt_mark)%}"
+ fi
+ PS1="$PREFIX$PS1%{$(iterm2_prompt_end)%}"
+ ITERM2_DECORATED_PS1="$PS1"
+ }
+
+ iterm2_precmd() {
+ local STATUS="$?"
+ if [ -z "${ITERM2_SHOULD_DECORATE_PROMPT-}" ]; then
+ # You pressed ^C while entering a command (iterm2_preexec did not run)
+ iterm2_before_cmd_executes
+ if [ "$PS1" != "${ITERM2_DECORATED_PS1-}" ]; then
+ # PS1 changed, perhaps in another precmd. See issue 9938.
+ ITERM2_SHOULD_DECORATE_PROMPT="1"
+ fi
+ fi
+
+ iterm2_after_cmd_executes "$STATUS"
+
+ if [ -n "$ITERM2_SHOULD_DECORATE_PROMPT" ]; then
+ iterm2_decorate_prompt
+ fi
+ }
+
+ # This is not run if you press ^C while entering a command.
+ iterm2_preexec() {
+ # Set PS1 back to its raw value prior to executing the command.
+ PS1="$ITERM2_PRECMD_PS1"
+ ITERM2_SHOULD_DECORATE_PROMPT="1"
+ iterm2_before_cmd_executes
+ }
+
+ # If hostname -f is slow on your system set iterm2_hostname prior to
+ # sourcing this script. We know it is fast on macOS so we don't cache
+ # it. That lets us handle the hostname changing like when you attach
+ # to a VPN.
+ if [ -z "${iterm2_hostname-}" ]; then
+ if [ "$(uname)" != "Darwin" ]; then
+ iterm2_hostname=`hostname -f 2>/dev/null`
+ # Some flavors of BSD (i.e. NetBSD and OpenBSD) don't have the -f option.
+ if [ $? -ne 0 ]; then
+ iterm2_hostname=`hostname`
+ fi
+ fi
+ fi
+
+ [[ -z ${precmd_functions-} ]] && precmd_functions=()
+ precmd_functions=($precmd_functions iterm2_precmd)
+
+ [[ -z ${preexec_functions-} ]] && preexec_functions=()
+ preexec_functions=($preexec_functions iterm2_preexec)
+
+ iterm2_print_state_data
+ printf "\033]1337;ShellIntegrationVersion=14;shell=zsh\007"
+ fi
+fi
diff --git a/plugins/iterm2/update b/plugins/iterm2/update
new file mode 100755
index 00000000..da8dae69
--- /dev/null
+++ b/plugins/iterm2/update
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+curl -s -L https://iterm2.com/shell_integration/zsh \
+ -o iterm2_shell_integration.zsh
diff --git a/plugins/jira/README.md b/plugins/jira/README.md
index a5633af7..d78ea15a 100644
--- a/plugins/jira/README.md
+++ b/plugins/jira/README.md
@@ -14,22 +14,31 @@ In this document, "JIRA" refers to the JIRA issue tracking server, and `jira` re
This plugin supplies one command, `jira`, through which all its features are exposed. Most forms of this command open a JIRA page in your web browser.
-```
-jira # performs the default action
+## Commands
+
+| Command | Description |
+| :------------ | :-------------------------------------------------------- |
+| `jira` | Performs the default action |
+| `jira new` | Opens a new Jira issue dialogue |
+| `jira ABC-123` | Opens an existing issue |
+| `jira ABC-123 m` | Opens an existing issue for adding a comment |
+| `jira dashboard [rapid_view]` | # opens your JIRA dashboard |
+| `jira mine` | Queries for your own issues |
+| `jira tempo` | Opens your JIRA Tempo |
+| `jira reported [username]` | Queries for issues reported by a user |
+| `jira assigned [username]` | Queries for issues assigned to a user |
+| `jira branch` | Opens an existing issue matching the current branch name |
+
+
+### Jira Branch usage notes
+
+The branch name may have prefixes ending in "/": "feature/MP-1234", and also suffixes
+starting with "_": "MP-1234_fix_dashboard". In both these cases, the issue opened will be "MP-1234"
+
+This is also checks if the prefix is in the name, and adds it if not, so: "MP-1234" opens the issue "MP-1234",
+"mp-1234" opens the issue "mp-1234", and "1234" opens the issue "MP-1234".
+
-jira new # opens a new issue
-jira dashboard # opens your JIRA dashboard
-jira tempo # opens your JIRA Tempo
-jira reported [username] # queries for issues reported by a user
-jira assigned [username] # queries for issues assigned to a user
-jira myissues # queries for you own issues
-jira branch # opens an existing issue matching the current branch name
- # The branch name may have prefixes ending in "/": "feature/MP-1234",
- # and also suffixes starting with "_": "MP-1234_fix_dashboard"
- # In both these cases, the issue opened will be "MP-1234"
-jira ABC-123 # opens an existing issue
-jira ABC-123 m # opens an existing issue for adding a comment
-```
#### Debugging usage ####
@@ -62,7 +71,9 @@ echo "https://jira.atlassian.com" >> .jira-url
* `$JIRA_NAME` - Your JIRA username; used as the default user for `assigned`/`reported` searches
* `$JIRA_PREFIX` - Prefix added to issue ID arguments
* `$JIRA_RAPID_BOARD` - Set to `true` if you use Rapid Board
+* `$JIRA_RAPID_VIEW` - Set the default rapid view; it doesn't work if `$JIRA_RAPID_BOARD` is set to false
* `$JIRA_DEFAULT_ACTION` - Action to do when `jira` is called with no arguments; defaults to "new"
+* `$JIRA_TEMPO_PATH` - Your JIRA tempo url path; defaults to "/secure/Tempo.jspa"
### Browser ###
diff --git a/plugins/jira/_jira b/plugins/jira/_jira
index 1ac3eeda..0e37b7e9 100644
--- a/plugins/jira/_jira
+++ b/plugins/jira/_jira
@@ -4,6 +4,7 @@
local -a _1st_arguments
_1st_arguments=(
'new:create a new issue'
+ 'mine:open my issues'
'dashboard:open the dashboard'
'tempo:open the tempo'
'reported:search for issues reported by a user'
diff --git a/plugins/jira/jira.plugin.zsh b/plugins/jira/jira.plugin.zsh
index 22807e0a..b6ee9f10 100644
--- a/plugins/jira/jira.plugin.zsh
+++ b/plugins/jira/jira.plugin.zsh
@@ -44,25 +44,31 @@ function jira() {
open_command "${jira_url}/secure/CreateIssue!default.jspa"
elif [[ "$action" == "assigned" || "$action" == "reported" ]]; then
_jira_query ${@:-$action}
- elif [[ "$action" == "myissues" ]]; then
+ elif [[ "$action" == "mine" ]]; then
echo "Opening my issues"
open_command "${jira_url}/issues/?filter=-1"
elif [[ "$action" == "dashboard" ]]; then
echo "Opening dashboard"
if [[ "$JIRA_RAPID_BOARD" == "true" ]]; then
- open_command "${jira_url}/secure/RapidBoard.jspa"
+ _jira_rapid_board ${@}
else
open_command "${jira_url}/secure/Dashboard.jspa"
fi
elif [[ "$action" == "tempo" ]]; then
echo "Opening tempo"
- open_command "${jira_url}/secure/Tempo.jspa"
+ if [[ -n "$JIRA_TEMPO_PATH" ]]; then
+ open_command "${jira_url}${JIRA_TEMPO_PATH}"
+ else
+ open_command "${jira_url}/secure/Tempo.jspa"
+ fi
elif [[ "$action" == "dumpconfig" ]]; then
echo "JIRA_URL=$jira_url"
echo "JIRA_PREFIX=$jira_prefix"
echo "JIRA_NAME=$JIRA_NAME"
+ echo "JIRA_RAPID_VIEW=$JIRA_RAPID_VIEW"
echo "JIRA_RAPID_BOARD=$JIRA_RAPID_BOARD"
echo "JIRA_DEFAULT_ACTION=$JIRA_DEFAULT_ACTION"
+ echo "JIRA_TEMPO_PATH=$JIRA_TEMPO_PATH"
else
# Anything that doesn't match a special action is considered an issue name
# but `branch` is a special case that will parse the current git branch
@@ -74,8 +80,14 @@ function jira() {
issue_arg=${issue_arg##*/}
# Strip suffixes starting with _
issue_arg=(${(s:_:)issue_arg})
- issue_arg=${issue_arg[1]}
- if [[ "$issue_arg" = ${jira_prefix}* ]]; then
+ # If there is only one part, it means that there is a different delimiter. Try with -
+ if [[ ${#issue_arg[@]} = 1 && ${issue_arg} == *-* ]]; then
+ issue_arg=(${(s:-:)issue_arg})
+ issue_arg="${issue_arg[1]}-${issue_arg[2]}"
+ else
+ issue_arg=${issue_arg[1]}
+ fi
+ if [[ "${issue_arg:l}" = ${jira_prefix:l}* ]]; then
issue="${issue_arg}"
else
issue="${jira_prefix}${issue_arg}"
@@ -107,6 +119,16 @@ Valid options, in order of precedence:
EOF
}
+function _jira_rapid_board() {
+ rapid_view=${2:=$JIRA_RAPID_VIEW}
+
+ if [[ -z $rapid_view ]]; then
+ open_command "${jira_url}/secure/RapidBoard.jspa"
+ else
+ open_command "${jira_url}/secure/RapidBoard.jspa?rapidView=$rapid_view"
+ fi
+}
+
function _jira_query() {
emulate -L zsh
local verb="$1"
diff --git a/plugins/juju/README.md b/plugins/juju/README.md
index f0c65309..6ee333f5 100644
--- a/plugins/juju/README.md
+++ b/plugins/juju/README.md
@@ -126,5 +126,7 @@ Naming convention:
- `jaddr [unit_num]`: display app or unit IP address.
- `jreld `: display app and unit relation data.
- `jclean`: destroy all controllers
+- `jcontroller`: display the controller your are connected to.
+- `jmodel`: display the model your are connected to.
- `wjst [interval_secs] [args_for_watch]`: watch juju status, with optional interval
(default: 5s); you may pass additional arguments to `watch`.
diff --git a/plugins/juju/juju.plugin.zsh b/plugins/juju/juju.plugin.zsh
index be8a2c7a..0c60e35c 100644
--- a/plugins/juju/juju.plugin.zsh
+++ b/plugins/juju/juju.plugin.zsh
@@ -163,10 +163,40 @@ jreld() {
juju run "relation-get -r $relid - $2" --unit $2/$3
}
+# Return Juju current controller
+jcontroller() {
+ local controller="$(awk '/current-controller/ {print $2}' ~/.local/share/juju/controllers.yaml)"
+ if [[ -z "$controller" ]]; then
+ return 1
+ fi
+
+ echo $controller
+ return 0
+}
+
+# Return Juju current model
+jmodel() {
+ local yqbin="$(whereis yq | awk '{print $2}')"
+
+ if [[ -z "$yqbin" ]]; then
+ echo "--"
+ return 1
+ fi
+
+ local model="$(yq e ".controllers.$(jcontroller).current-model" < ~/.local/share/juju/models.yaml | cut -d/ -f2)"
+
+ if [[ -z "$model" ]]; then
+ echo "--"
+ return 1
+ fi
+
+ echo $model
+ return 0
+}
+
# Watch juju status, with optional interval (default: 5 sec)
wjst() {
local interval="${1:-5}"
shift $(( $# > 0 ))
watch -n "$interval" --color juju status --relations --color "$@"
}
-
diff --git a/plugins/jump/jump.plugin.zsh b/plugins/jump/jump.plugin.zsh
index c2da1144..829c9d9c 100644
--- a/plugins/jump/jump.plugin.zsh
+++ b/plugins/jump/jump.plugin.zsh
@@ -35,12 +35,11 @@ marks() {
max=${#link:t}
fi
done
- local printf_markname_template="$(printf -- "%%%us " "$max")"
+ local printf_markname_template="$(printf -- "%%%us" "$max")"
for link in $MARKPATH/{,.}*(@N); do
- local markname="$fg[cyan]${link:t}$reset_color"
+ local markname="$fg[cyan]$(printf -- "$printf_markname_template" "${link:t}")$reset_color"
local markpath="$fg[blue]$(readlink $link)$reset_color"
- printf -- "$printf_markname_template" "$markname"
- printf -- "-> %s\n" "$markpath"
+ printf -- "%s -> %s\n" "$markname" "$markpath"
done
}
diff --git a/plugins/kind/README.md b/plugins/kind/README.md
new file mode 100644
index 00000000..49024648
--- /dev/null
+++ b/plugins/kind/README.md
@@ -0,0 +1,22 @@
+# Kind plugin
+
+This plugin adds completion for the [Kind](https://kind.sigs.k8s.io/) tool, as well
+as a few aliases for easier use.
+
+To use it, add `kind` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... kind)
+```
+
+## Aliases
+
+| Alias | Command |
+| ------- | ---------------------------- |
+| `kicc` | `kind create cluster` |
+| `kiccn` | `kind create cluster --name` |
+| `kigc` | `kind get clusters` |
+| `kidc` | `kind delete cluster` |
+| `kidcn` | `kind delete cluster --name` |
+| `kidca` | `kind delete clusters -A` |
+| `kigk` | `kind get kubeconfig` |
diff --git a/plugins/kind/kind.plugin.zsh b/plugins/kind/kind.plugin.zsh
new file mode 100644
index 00000000..183eb7bd
--- /dev/null
+++ b/plugins/kind/kind.plugin.zsh
@@ -0,0 +1,23 @@
+if (( ! $+commands[kind] )); then
+ return
+fi
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `kind`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_kind" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _kind
+ _comps[kind]=_kind
+fi
+
+# Generate and load kind completion
+kind completion zsh >! "$ZSH_CACHE_DIR/completions/_kind" &|
+
+# Register aliases
+alias kicc="kind create cluster"
+alias kiccn="kind create cluster --name"
+alias kigc="kind get clusters"
+alias kidc="kind delete cluster"
+alias kidcn="kind delete cluster --name"
+alias kidca="kind delete clusters -A"
+alias kigk="kind get kubeconfig"
diff --git a/plugins/kubectl/kubectl.plugin.zsh b/plugins/kubectl/kubectl.plugin.zsh
index 095d2b32..315d3ce9 100644
--- a/plugins/kubectl/kubectl.plugin.zsh
+++ b/plugins/kubectl/kubectl.plugin.zsh
@@ -1,15 +1,17 @@
-if (( $+commands[kubectl] )); then
- # If the completion file does not exist, generate it and then source it
- # Otherwise, source it and regenerate in the background
- if [[ ! -f "$ZSH_CACHE_DIR/completions/_kubectl" ]]; then
- kubectl completion zsh | tee "$ZSH_CACHE_DIR/completions/_kubectl" >/dev/null
- source "$ZSH_CACHE_DIR/completions/_kubectl"
- else
- source "$ZSH_CACHE_DIR/completions/_kubectl"
- kubectl completion zsh | tee "$ZSH_CACHE_DIR/completions/_kubectl" >/dev/null &|
- fi
+if (( ! $+commands[kubectl] )); then
+ return
fi
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `kubectl`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_kubectl" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _kubectl
+ _comps[kubectl]=_kubectl
+fi
+
+kubectl completion zsh 2> /dev/null >| "$ZSH_CACHE_DIR/completions/_kubectl" &|
+
# This command is used a LOT both below and in daily life
alias k=kubectl
diff --git a/plugins/lando/README.md b/plugins/lando/README.md
index 928a42bc..6daeae4e 100644
--- a/plugins/lando/README.md
+++ b/plugins/lando/README.md
@@ -17,6 +17,7 @@ plugins=(... lando)
| `drush` | `lando drush` |
| `gulp` | `lando gulp` |
| `npm` | `lando npm` |
+| `php` | `lando php` |
| `wp` | `lando wp` |
| `yarn` | `lando yarn` |
diff --git a/plugins/last-working-dir/last-working-dir.plugin.zsh b/plugins/last-working-dir/last-working-dir.plugin.zsh
index 905a02a7..684972cc 100644
--- a/plugins/last-working-dir/last-working-dir.plugin.zsh
+++ b/plugins/last-working-dir/last-working-dir.plugin.zsh
@@ -9,7 +9,7 @@ chpwd_last_working_dir() {
[[ "$ZSH_SUBSHELL" -eq 0 ]] || return 0
# Add ".$SSH_USER" suffix to cache file if $SSH_USER is set and non-empty
local cache_file="$ZSH_CACHE_DIR/last-working-dir${SSH_USER:+.$SSH_USER}"
- pwd >| "$cache_file"
+ builtin pwd >| "$cache_file"
}
# Changes directory to the last working directory
diff --git a/plugins/macos/README.md b/plugins/macos/README.md
index 1bc4244a..1cb9b395 100644
--- a/plugins/macos/README.md
+++ b/plugins/macos/README.md
@@ -25,7 +25,7 @@ Original author: [Sorin Ionescu](https://github.com/sorin-ionescu)
| `pxd` | Return the current Xcode project directory |
| `cdx` | `cd` to the current Xcode project directory |
| `quick-look` | Quick-Look a specified file |
-| `man-preview` | Open a specified man page in Preview app |
+| `man-preview` | Open man pages in Preview app |
| `showfiles` | Show hidden files in Finder |
| `hidefiles` | Hide the hidden files in Finder |
| `itunes` | _DEPRECATED_. Use `music` from macOS Catalina on |
diff --git a/plugins/macos/macos.plugin.zsh b/plugins/macos/macos.plugin.zsh
index b540eecb..e27d412c 100644
--- a/plugins/macos/macos.plugin.zsh
+++ b/plugins/macos/macos.plugin.zsh
@@ -224,8 +224,10 @@ function quick-look() {
}
function man-preview() {
- # Don't let Preview.app steal focus if the man page doesn't exist
- man -w "$@" &>/dev/null && man -t "$@" | open -f -a Preview || man "$@"
+ local page
+ for page in "${(@f)"$(man -w $@)"}"; do
+ command mandoc -Tpdf $page | open -f -a Preview
+ done
}
compdef _man man-preview
diff --git a/plugins/macos/spotify b/plugins/macos/spotify
index 491a6068..ae42db42 100644
--- a/plugins/macos/spotify
+++ b/plugins/macos/spotify
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
function spotify() {
-# Copyright (c) 2012--2019 Harish Narayanan
+# Copyright (c) 2012--2023 Harish Narayanan
#
# Contains numerous helpful contributions from Jorge Colindres, Thomas
# Pritchard, iLan Epstein, Gabriele Bonetti, Sean Heller, Eric Martin
@@ -35,6 +35,9 @@ if ! [[ -f "${USER_CONFIG_FILE}" ]]; then
fi
source "${USER_CONFIG_FILE}";
+# Set the percent change in volume for vol up and vol down
+VOL_INCREMENT=10
+
showAPIHelp() {
echo;
echo "Connecting to Spotify's API:";
@@ -43,7 +46,7 @@ showAPIHelp() {
echo " find music by name. It is very likely you want this feature!";
echo;
echo " To get this to work, you need to sign up (or in) and create an 'Application' at:";
- echo " https://developer.spotify.com/my-applications/#!/applications/create";
+ echo " https://developer.spotify.com/dashboard/create";
echo;
echo " Once you've created an application, find the 'Client ID' and 'Client Secret'";
echo " values, and enter them into your shpotify config file at '${USER_CONFIG_FILE}'";
@@ -170,12 +173,12 @@ while [ $# -gt 0 ]; do
if [ -z "${CLIENT_ID}" ]; then
cecho "Invalid Client ID, please update ${USER_CONFIG_FILE}";
showAPIHelp;
- return 1
+ return 1;
fi
if [ -z "${CLIENT_SECRET}" ]; then
cecho "Invalid Client Secret, please update ${USER_CONFIG_FILE}";
showAPIHelp;
- return 1
+ return 1;
fi
SHPOTIFY_CREDENTIALS=$(printf "${CLIENT_ID}:${CLIENT_SECRET}" | base64 | tr -d "\n"|tr -d '\r');
SPOTIFY_PLAY_URI="";
@@ -198,7 +201,7 @@ while [ $# -gt 0 ]; do
fi
SPOTIFY_ACCESS_TOKEN=$( \
printf "${SPOTIFY_TOKEN_RESPONSE_DATA}" \
- | grep -E -o '"access_token":".*",' \
+ | command grep -E -o '"access_token":".*",' \
| sed 's/"access_token"://g' \
| sed 's/"//g' \
| sed 's/,.*//g' \
@@ -219,9 +222,8 @@ while [ $# -gt 0 ]; do
-H "Accept: application/json" \
--data-urlencode "q=$Q" \
-d "type=$type&limit=1&offset=0" \
- | grep -E -o "spotify:$type:[a-zA-Z0-9]+" -m 1
+ | command grep -E -o "spotify:$type:[a-zA-Z0-9]+" -m 1
)
- echo "play uri: ${SPOTIFY_PLAY_URI}"
}
case $2 in
@@ -235,11 +237,11 @@ while [ $# -gt 0 ]; do
results=$( \
curl -s -G $SPOTIFY_SEARCH_API --data-urlencode "q=$Q" -d "type=playlist&limit=10&offset=0" -H "Accept: application/json" -H "Authorization: Bearer ${SPOTIFY_ACCESS_TOKEN}" \
- | grep -E -o "spotify:playlist:[a-zA-Z0-9]+" -m 10 \
+ | command grep -E -o "spotify:playlist:[a-zA-Z0-9]+" -m 10 \
)
count=$( \
- echo "$results" | grep -c "spotify:playlist" \
+ echo "$results" | command grep -c "spotify:playlist" \
)
if [ "$count" -gt 0 ]; then
@@ -333,16 +335,16 @@ while [ $# -gt 0 ]; do
cecho "Current Spotify volume level is $vol.";
break ;
elif [ "$2" = "up" ]; then
- if [ $vol -le 90 ]; then
- newvol=$(( vol+10 ));
+ if [ $vol -le $(( 100-$VOL_INCREMENT )) ]; then
+ newvol=$(( vol+$VOL_INCREMENT ));
cecho "Increasing Spotify volume to $newvol.";
else
newvol=100;
cecho "Spotify volume level is at max.";
fi
elif [ "$2" = "down" ]; then
- if [ $vol -ge 10 ]; then
- newvol=$(( vol-10 ));
+ if [ $vol -ge $(( $VOL_INCREMENT )) ]; then
+ newvol=$(( vol-$VOL_INCREMENT ));
cecho "Reducing Spotify volume to $newvol.";
else
newvol=0;
@@ -354,11 +356,11 @@ while [ $# -gt 0 ]; do
else
echo "Improper use of 'vol' command"
echo "The 'vol' command should be used as follows:"
- echo " vol up # Increases the volume by 10%.";
- echo " vol down # Decreases the volume by 10%.";
+ echo " vol up # Increases the volume by $VOL_INCREMENT%.";
+ echo " vol down # Decreases the volume by $VOL_INCREMENT%.";
echo " vol [amount] # Sets the volume to an amount between 0 and 100.";
echo " vol # Shows the current Spotify volume.";
- return 1
+ return 1;
fi
osascript -e "tell application \"Spotify\" to set sound volume to $newvol";
@@ -468,10 +470,9 @@ while [ $# -gt 0 ]; do
"help" )
showHelp;
break ;;
-
* )
showHelp;
- return 1 ;;
+ return 1;
esac
done
diff --git a/plugins/marked2/marked2.plugin.zsh b/plugins/marked2/marked2.plugin.zsh
index 56863ade..45f4b65c 100644
--- a/plugins/marked2/marked2.plugin.zsh
+++ b/plugins/marked2/marked2.plugin.zsh
@@ -3,10 +3,5 @@
# If marked is passed a file, open it in Marked
#
function marked() {
- if [ "$1" ]
- then
- open -a "marked 2.app" "$1"
- else
- open -a "marked 2.app"
- fi
+ open -a "marked 2.app" "$1"
}
diff --git a/plugins/marktext/README.md b/plugins/marktext/README.md
new file mode 100644
index 00000000..71d28745
--- /dev/null
+++ b/plugins/marktext/README.md
@@ -0,0 +1,17 @@
+## marktext
+
+Plugin for MarkText, a previewer for Markdown files on Mac OS X
+
+### Requirements
+
+ * [MarkText](https://github.com/marktext/marktext)
+
+### Usage
+
+ * If `marktext` is called without an argument, open MarkText
+
+ * If `marktext` is passed a file, open it in MarkText
+
+### Credits
+
+ * just copied from plugins/marked2, all credits to marked2 plugin author
diff --git a/plugins/marktext/marktext.plugin.zsh b/plugins/marktext/marktext.plugin.zsh
new file mode 100644
index 00000000..1da85bcc
--- /dev/null
+++ b/plugins/marktext/marktext.plugin.zsh
@@ -0,0 +1,7 @@
+#
+# If marktext is called without an argument, open MarkText
+# If marktext is passed a file, open it in MarkText
+#
+function marktext() {
+ open -a "MarkText.app" "$1"
+}
diff --git a/plugins/mongo-atlas/README.md b/plugins/mongo-atlas/README.md
new file mode 100644
index 00000000..ef1b5e0d
--- /dev/null
+++ b/plugins/mongo-atlas/README.md
@@ -0,0 +1,10 @@
+# MongoDB Atlas plugin
+
+This plugin adds completion for [Atlas](https://www.mongodb.com/docs/atlas/cli/stable/) a command line interface built specifically for
+MongoDB Atlas.
+
+To use it, add `mongo-atlas` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... mongo-atlas)
+```
diff --git a/plugins/mongo-atlas/mongo-atlas.plugin.zsh b/plugins/mongo-atlas/mongo-atlas.plugin.zsh
new file mode 100644
index 00000000..6762c909
--- /dev/null
+++ b/plugins/mongo-atlas/mongo-atlas.plugin.zsh
@@ -0,0 +1,14 @@
+# Autocompletion for the Mongo Atlas CLI (atlas).
+if (( ! $+commands[atlas] )); then
+ return
+fi
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `atlas`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_atlas" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _atlas
+ _comps[atlas]=_atlas
+fi
+
+atlas completion zsh >| "$ZSH_CACHE_DIR/completions/atlas" &|
diff --git a/plugins/mvn/README.md b/plugins/mvn/README.md
index 815dfd57..4181fedc 100644
--- a/plugins/mvn/README.md
+++ b/plugins/mvn/README.md
@@ -33,7 +33,7 @@ if it's found, or the mvn command otherwise.
| `mvnct` | `mvn clean test` |
| `mvncv` | `mvn clean verify` |
| `mvncvst` | `mvn clean verify -DskipTests` |
-| `mvnd` | `mvn deploy` |
+| `mvndp` | `mvn deploy` |
| `mvndocs` | `mvn dependency:resolve -Dclassifier=javadoc` |
| `mvndt` | `mvn dependency:tree` |
| `mvne` | `mvn eclipse:eclipse` |
diff --git a/plugins/mvn/mvn.plugin.zsh b/plugins/mvn/mvn.plugin.zsh
index 1b9141f2..a569a87f 100644
--- a/plugins/mvn/mvn.plugin.zsh
+++ b/plugins/mvn/mvn.plugin.zsh
@@ -62,7 +62,7 @@ alias mvncp='mvn clean package'
alias mvnct='mvn clean test'
alias mvncv='mvn clean verify'
alias mvncvst='mvn clean verify -DskipTests'
-alias mvnd='mvn deploy'
+alias mvndp='mvn deploy'
alias mvndocs='mvn dependency:resolve -Dclassifier=javadoc'
alias mvndt='mvn dependency:tree'
alias mvne='mvn eclipse:eclipse'
@@ -196,7 +196,7 @@ function listMavenCompletions {
# spring-boot
spring-boot:run spring-boot:repackage
# quarkus
- quarkus:dev quarkus:list-extensions quarkus:add-extension quarkus:add-extensions quarkus:generate-config quarkus:help
+ quarkus:dev quarkus:list-extensions quarkus:add-extension quarkus:add-extensions quarkus:remove-extension quarkus:remove-extensions quarkus:generate-config quarkus:help
# exec
exec:exec exec:java
# versions
@@ -283,9 +283,11 @@ function listMavenCompletions {
toolchain:toolchain
#liberty
liberty:clean-server liberty:compile-jsp liberty:configure-arquillian liberty:create-server liberty:debug liberty:debug-server liberty:deploy liberty:dev liberty:display-url liberty:dump-server liberty:install-apps liberty:install-feature liberty:install-server liberty:java-dump-server liberty:package-server liberty:run liberty:run-server liberty:server-status liberty:start liberty:start-server liberty:status liberty:stop liberty:stop-server liberty:test-start-server liberty:test-stop-server liberty:undeploy liberty:uninstall-feature
+ # vaadin
+ vaadin:prepare-frontend vaadin:build-frontend vaadin:clean-frontend vaadin:dance
# options
- "-Dmaven.test.skip=true" -DskipTests -DskipITs -Dmaven.surefire.debug -DenableCiProfile "-Dpmd.skip=true" "-Dcheckstyle.skip=true" "-Dtycho.mode=maven" "-Dmaven.test.failure.ignore=true" "-DgroupId=" "-DartifactId=" "-Dversion=" "-Dpackaging=jar" "-Dfile="
+ "-Dmaven.test.skip=true" -DskipTests -DskipITs -Dmaven.surefire.debug -DenableCiProfile "-Dpmd.skip=true" "-Dcheckstyle.skip=true" "-Dtycho.mode=maven" "-Dmaven.test.failure.ignore=true" "-DgroupId=" "-DartifactId=" "-Dversion=" "-Dpackaging=jar" "-Dfile=" "-Dextensions="
# arguments
-am --also-make
diff --git a/plugins/nats/README.md b/plugins/nats/README.md
new file mode 100644
index 00000000..0ea26fca
--- /dev/null
+++ b/plugins/nats/README.md
@@ -0,0 +1,14 @@
+# NATS plugin
+
+This plugin adds completion for several tools from [NATS](https://nats.io/).
+
+- [`nsc`](https://github.com/nats-io/nsc)
+- [`natscli`](https://github.com/nats-io/natscli)
+
+To use it, add `nats` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... nats)
+```
+
+This plugin does not add any aliases.
diff --git a/plugins/nats/nats.plugin.zsh b/plugins/nats/nats.plugin.zsh
new file mode 100644
index 00000000..8b95b07c
--- /dev/null
+++ b/plugins/nats/nats.plugin.zsh
@@ -0,0 +1,23 @@
+if (( $+commands[nsc] )); then
+ # If the completion file doesn't exist yet, we need to autoload it and
+ # bind it to `nsc`. Otherwise, compinit will have already done that.
+ if [[ ! -f "$ZSH_CACHE_DIR/completions/_nsc" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _nsc
+ _comps[nsc]=_nsc
+ fi
+
+ nsc completion zsh >| "$ZSH_CACHE_DIR/completions/_nsc" &|
+fi
+
+if (( $+commands[nats] )); then
+ # If the completion file doesn't exist yet, we need to autoload it and
+ # bind it to `nats`. Otherwise, compinit will have already done that.
+ if [[ ! -f "$ZSH_CACHE_DIR/completions/_nats" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _nats
+ _comps[nats]=_nats
+ fi
+
+ nats --completion-script-zsh >| "$ZSH_CACHE_DIR/completions/_nats" &|
+fi
diff --git a/plugins/nodenv/README.md b/plugins/nodenv/README.md
new file mode 100644
index 00000000..55059702
--- /dev/null
+++ b/plugins/nodenv/README.md
@@ -0,0 +1,20 @@
+# nodenv plugin
+
+The primary job of this plugin is to provide `nodenv_prompt_info` which can be added to your theme to include Node
+version information into your prompt.
+
+To use it, add `nodenv` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... nodenv)
+```
+
+## Functions
+
+* `nodenv_prompt_info`: displays the Node version in use by nodenv; or the global Node
+ version, if nodenv wasn't found. You can use this function in your prompt by adding
+ `$(nodenv_prompt_info)` to PROMPT or RPROMPT:
+
+ ```zsh
+ RPROMPT='$(nodenv_prompt_info)'
+ ```
diff --git a/plugins/nodenv/nodenv.plugin.zsh b/plugins/nodenv/nodenv.plugin.zsh
new file mode 100644
index 00000000..79a4ffbb
--- /dev/null
+++ b/plugins/nodenv/nodenv.plugin.zsh
@@ -0,0 +1,43 @@
+# This plugin loads nodenv into the current shell and provides prompt info via
+# the 'nodenv_prompt_info' function.
+
+FOUND_NODENV=${+commands[nodenv]}
+
+if [[ $FOUND_NODENV -ne 1 ]]; then
+ nodenvdirs=(
+ "$HOME/.nodenv"
+ "/usr/local/nodenv"
+ "/opt/nodenv"
+ "/usr/local/opt/nodenv"
+ )
+ for dir in $nodenvdirs; do
+ if [[ -d "${dir}/bin" ]]; then
+ export PATH="$PATH:${dir}/bin"
+ FOUND_NODENV=1
+ break
+ fi
+ done
+
+ if [[ $FOUND_NODENV -ne 1 ]]; then
+ if (( $+commands[brew] )) && dir=$(brew --prefix nodenv 2>/dev/null); then
+ if [[ -d "${dir}/bin" ]]; then
+ export PATH="$PATH:${dir}/bin"
+ FOUND_NODENV=1
+ fi
+ fi
+ fi
+fi
+
+if [[ $FOUND_NODENV -eq 1 ]]; then
+ eval "$(nodenv init --no-rehash - zsh)"
+ function nodenv_prompt_info() {
+ nodenv version-name 2>/dev/null
+ }
+else
+ # fallback to system node
+ function nodenv_prompt_info() {
+ echo "system: $(node -v 2>&1 | cut -c 2-)"
+ }
+fi
+
+unset FOUND_NODENV nodenvdirs dir
diff --git a/plugins/npm/README.md b/plugins/npm/README.md
index 8eafc6d6..420dd710 100644
--- a/plugins/npm/README.md
+++ b/plugins/npm/README.md
@@ -29,6 +29,7 @@ plugins=(... npm)
| `npmI` | `npm init` | Run npm init |
| `npmi` | `npm info` | Run npm info |
| `npmSe` | `npm search` | Run npm search |
+| `npmrd` | `npm run dev` | Run npm run dev |
## `npm install` / `npm uninstall` toggle
diff --git a/plugins/npm/npm.plugin.zsh b/plugins/npm/npm.plugin.zsh
index e0dcbf14..3cba18f6 100644
--- a/plugins/npm/npm.plugin.zsh
+++ b/plugins/npm/npm.plugin.zsh
@@ -70,6 +70,9 @@ alias npmi="npm info"
# Run npm search
alias npmSe="npm search"
+# Run npm run dev
+alias npmrd="npm run dev"
+
npm_toggle_install_uninstall() {
# Look up to the previous 2 history commands
local line
diff --git a/plugins/nvm/README.md b/plugins/nvm/README.md
index 1acf1205..b5ef221d 100644
--- a/plugins/nvm/README.md
+++ b/plugins/nvm/README.md
@@ -1,7 +1,7 @@
# nvm plugin
-This plugin adds autocompletions for [nvm](https://github.com/nvm-sh/nvm) — a Node.js version manager.
-It also automatically sources nvm, so you don't need to do it manually in your `.zshrc`.
+This plugin adds autocompletions for [nvm](https://github.com/nvm-sh/nvm) — a Node.js version manager. It also
+automatically sources nvm, so you don't need to do it manually in your `.zshrc`.
To use it, add `nvm` to the plugins array of your zshrc file:
@@ -21,14 +21,38 @@ These settings should go in your zshrc file, before Oh My Zsh is sourced:
[Homebrew is installed in `/opt/homebrew`](https://docs.brew.sh/Installation). To get the directory where
nvm has been installed, regardless of chip architecture, use `NVM_HOMEBREW=$(brew --prefix nvm)`.
-- **`NVM_LAZY`**: if you want the plugin to defer the load of nvm to speed-up the start of your zsh session,
- set `NVM_LAZY` to `1`. This will source nvm script only when using it, and will create a function for `node`,
- `npm`, `pnpm`, `yarn`, and the command(s) specified by `NVM_LAZY_CMD`, so when you call either of them,
- nvm will be loaded and run with default version.
+## Customization
-- **`NVM_LAZY_CMD`**: if you want additional command(s) to trigger lazy loading of nvm, set `NVM_LAZY_CMD` to
- the command or an array of the commands.
+#### Lazy startup
-- **`NVM_AUTOLOAD`**: if `NVM_AUTOLOAD` is set to `1`, the plugin will automatically load a node version when
- if finds a [`.nvmrc` file](https://github.com/nvm-sh/nvm#nvmrc) in the current working directory indicating
- which node version to load.
+This option will help you to defer nvm's load until you use it to speed-up your zsh startup. This will source
+nvm script only when using it, and will create a function for `node`, `npm`, `npx`, `pnpm`, `yarn`, and the
+command(s) specified by `lazy-cmd` option, so when you call either of them, nvm will be loaded and run with
+default version. To enable it, you can add this snippet to your zshrc, before Oh My Zsh is sourced:
+
+```zsh
+zstyle ':omz:plugins:nvm' lazy yes
+```
+
+Then, to define extra commands that will also trigger nvm load, you can use a similar syntax, adding as many
+as you want:
+
+```zsh
+zstyle ':omz:plugins:nvm' lazy-cmd eslint prettier typescript ...
+```
+
+#### `.nvmrc` autoload
+
+Note: _this option cannot be used at the same time as `lazy`. `autoload` will override it and load `nvm` at
+startup._
+
+If set, the plugin will automatically load a node version when if finds a
+[`.nvmrc` file](https://github.com/nvm-sh/nvm#nvmrc) in the current working directory indicating which node
+version to load. This can be done, similar as previous options, adding:
+
+```zsh
+zstyle ':omz:plugins:nvm' autoload yes
+zstyle ':omz:plugins:nvm' silent-autoload yes # optionally remove the output generated by NVM when autoloading
+```
+
+Note: _this will not remove regular `nvm` output_
diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh
index 1fb4d238..1badbeab 100644
--- a/plugins/nvm/nvm.plugin.zsh
+++ b/plugins/nvm/nvm.plugin.zsh
@@ -16,39 +16,50 @@ fi
# Note: nvm is a function so we need to use `which`
which nvm &>/dev/null && return
-if (( $+NVM_LAZY )); then
- # Call nvm when first using nvm, node, npm, pnpm, yarn or $NVM_LAZY_CMD
- function nvm node npm pnpm yarn $NVM_LAZY_CMD {
- unfunction nvm node npm pnpm yarn $NVM_LAZY_CMD
- # Load nvm if it exists in $NVM_DIR
- [[ -f "$NVM_DIR/nvm.sh" ]] && source "$NVM_DIR/nvm.sh"
- "$0" "$@"
- }
-elif [[ -f "$NVM_DIR/nvm.sh" ]]; then
- # Load nvm if it exists in $NVM_DIR
- source "$NVM_DIR/nvm.sh"
-else
+if [[ -z "$NVM_DIR" ]] || [[ ! -f "$NVM_DIR/nvm.sh" ]]; then
return
fi
+if zstyle -t ':omz:plugins:nvm' lazy && \
+ ! zstyle -t ':omz:plugins:nvm' autoload; then
+ # Call nvm when first using nvm, node, npm, pnpm, yarn or other commands in lazy-cmd
+ zstyle -a ':omz:plugins:nvm' lazy-cmd nvm_lazy_cmd
+ eval "
+ function nvm node npm npx pnpm yarn $nvm_lazy_cmd {
+ unfunction nvm node npm npx pnpm yarn $nvm_lazy_cmd
+ # Load nvm if it exists in \$NVM_DIR
+ [[ -f \"\$NVM_DIR/nvm.sh\" ]] && source \"\$NVM_DIR/nvm.sh\"
+ \"\$0\" \"\$@\"
+ }
+ "
+ unset nvm_lazy_cmd
+else
+ source "$NVM_DIR/nvm.sh"
+fi
+
# Autoload nvm when finding a .nvmrc file in the current directory
# Adapted from: https://github.com/nvm-sh/nvm#zsh
-if (( $+NVM_AUTOLOAD )); then
- load-nvmrc() {
+if zstyle -t ':omz:plugins:nvm' autoload; then
+ function load-nvmrc {
local node_version="$(nvm version)"
local nvmrc_path="$(nvm_find_nvmrc)"
+ local nvm_silent=""
+ zstyle -t ':omz:plugins:nvm' silent-autoload && nvm_silent="--silent"
if [[ -n "$nvmrc_path" ]]; then
- local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")
+ local nvmrc_node_version=$(nvm version $(cat "$nvmrc_path" | tr -dc '[:print:]'))
if [[ "$nvmrc_node_version" = "N/A" ]]; then
nvm install
elif [[ "$nvmrc_node_version" != "$node_version" ]]; then
- nvm use
+ nvm use $nvm_silent
fi
elif [[ "$node_version" != "$(nvm version default)" ]]; then
- echo "Reverting to nvm default version"
- nvm use default
+ if [[ -z $nvm_silent ]]; then
+ echo "Reverting to nvm default version"
+ fi
+
+ nvm use default $nvm_silent
fi
}
@@ -70,4 +81,4 @@ for nvm_completion in "$NVM_DIR/bash_completion" "$NVM_HOMEBREW/etc/bash_complet
fi
done
-unset NVM_HOMEBREW NVM_LAZY NVM_AUTOLOAD nvm_completion
+unset NVM_HOMEBREW nvm_completion
diff --git a/plugins/per-directory-history/per-directory-history.zsh b/plugins/per-directory-history/per-directory-history.zsh
index 7cd673cd..acbd6475 100644
--- a/plugins/per-directory-history/per-directory-history.zsh
+++ b/plugins/per-directory-history/per-directory-history.zsh
@@ -81,6 +81,7 @@ function per-directory-history-toggle-history() {
autoload per-directory-history-toggle-history
zle -N per-directory-history-toggle-history
bindkey $PER_DIRECTORY_HISTORY_TOGGLE per-directory-history-toggle-history
+bindkey -M vicmd $PER_DIRECTORY_HISTORY_TOGGLE per-directory-history-toggle-history
#-------------------------------------------------------------------------------
# implementation details
diff --git a/plugins/pip/README.md b/plugins/pip/README.md
index 88d88227..70d40c79 100644
--- a/plugins/pip/README.md
+++ b/plugins/pip/README.md
@@ -22,6 +22,14 @@ the next time you autocomplete `pip install`.
| Alias | Description |
| :------- | :-------------------------------------------- |
+| pipi | Install packages |
+| pipig | Install package from GitHub repository |
+| pipigb | Install package from GitHub branch |
+| pipigp | Install package from GitHub pull request |
+| pipu | Upgrade packages |
+| pipun | Uninstall packages |
+| pipgi | Grep through installed packages |
+| piplo | List outdated packages |
| pipreq | Create requirements file |
| pipir | Install packages from `requirements.txt` file |
| pipupall | Update all installed packages |
diff --git a/plugins/pip/pip.plugin.zsh b/plugins/pip/pip.plugin.zsh
index 90e39e11..bf1aafd4 100644
--- a/plugins/pip/pip.plugin.zsh
+++ b/plugins/pip/pip.plugin.zsh
@@ -88,6 +88,12 @@ else
alias pip="noglob pip"
fi
+alias pipi="pip install"
+alias pipu="pip install --upgrade"
+alias pipun="pip uninstall"
+alias pipgi="pip freeze | grep"
+alias piplo="pip list -o"
+
# Create requirements file
alias pipreq="pip freeze > requirements.txt"
@@ -102,10 +108,28 @@ function pipupall {
pip list --outdated | awk 'NR > 2 { print $1 }' | ${=xargs} pip install --upgrade
}
-# Uninstalled all installed packages
+# Uninstall all installed packages
function pipunall {
# non-GNU xargs does not support nor need `--no-run-if-empty`
local xargs="xargs --no-run-if-empty"
xargs --version 2>/dev/null | grep -q GNU || xargs="xargs"
pip list --format freeze | cut -d= -f1 | ${=xargs} pip uninstall
}
+
+# Install from GitHub repository
+function pipig {
+ pip install "git+https://github.com/$1.git"
+}
+compdef _pip pipig
+
+# Install from GitHub branch
+function pipigb {
+ pip install "git+https://github.com/$1.git@$2"
+}
+compdef _pip pipigb
+
+# Install from GitHub pull request
+function pipigp {
+ pip install "git+https://github.com/$1.git@refs/pull/$2/head"
+}
+compdef _pip pipigp
diff --git a/plugins/pipenv/README.md b/plugins/pipenv/README.md
index ab1c1e44..e78ef0e3 100644
--- a/plugins/pipenv/README.md
+++ b/plugins/pipenv/README.md
@@ -1,6 +1,7 @@
# Pipenv
## Installation
+
In your `.zshrc` file, add `pipenv` to the plugins section
```
@@ -8,7 +9,9 @@ plugins=(... pipenv ...)
```
## Features
-This plugin provides some features to simplify the use of Pipenv while working on ZSH.
+
+This plugin provides some features to simplify the use of Pipenv while working on ZSH.
+
- Adds completion for pipenv
- Auto activates and deactivates pipenv shell
- Adds short aliases for common pipenv commands
@@ -23,6 +26,17 @@ This plugin provides some features to simplify the use of Pipenv while working o
- `psh` is aliased to `pipenv shell`
- `psy` is aliased to `pipenv sync`
- `pu` is aliased to `pipenv uninstall`
+ - `pupd` is aliased to `pipenv update`
- `pwh` is aliased to `pipenv --where`
- `pvenv` is aliased to `pipenv --venv`
- `ppy` is aliased to `pipenv --py`
+
+## Configuration
+
+### Shell activation
+
+If you want to disable the shell activation and deactivation feature, add the following style to your `.zshrc` before sourcing `oh-my-zsh.sh`:
+
+```zsh
+zstyle ':omz:plugins:pipenv' auto-shell no
+```
diff --git a/plugins/pipenv/pipenv.plugin.zsh b/plugins/pipenv/pipenv.plugin.zsh
index 4be61a92..f81c266a 100644
--- a/plugins/pipenv/pipenv.plugin.zsh
+++ b/plugins/pipenv/pipenv.plugin.zsh
@@ -1,31 +1,41 @@
-# Pipenv completion
-_pipenv() {
- eval $(env COMMANDLINE="${words[1,$CURRENT]}" _PIPENV_COMPLETE=complete-zsh pipenv)
-}
-compdef _pipenv pipenv
+if (( ! $+commands[pipenv] )); then
+ return
+fi
-# Automatic pipenv shell activation/deactivation
-_togglePipenvShell() {
- # deactivate shell if Pipfile doesn't exist and not in a subdir
- if [[ ! -f "$PWD/Pipfile" ]]; then
- if [[ "$PIPENV_ACTIVE" == 1 ]]; then
- if [[ "$PWD" != "$pipfile_dir"* ]]; then
- exit
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `pipenv`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_pipenv" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _pipenv
+ _comps[pipenv]=_pipenv
+fi
+
+_PIPENV_COMPLETE=zsh_source pipenv >| "$ZSH_CACHE_DIR/completions/_pipenv" &|
+
+if zstyle -T ':omz:plugins:pipenv' auto-shell; then
+ # Automatic pipenv shell activation/deactivation
+ _togglePipenvShell() {
+ # deactivate shell if Pipfile doesn't exist and not in a subdir
+ if [[ ! -f "$PWD/Pipfile" ]]; then
+ if [[ "$PIPENV_ACTIVE" == 1 ]]; then
+ if [[ "$PWD" != "$pipfile_dir"* ]]; then
+ exit
+ fi
fi
fi
- fi
- # activate the shell if Pipfile exists
- if [[ "$PIPENV_ACTIVE" != 1 ]]; then
- if [[ -f "$PWD/Pipfile" ]]; then
- export pipfile_dir="$PWD"
- pipenv shell
+ # activate the shell if Pipfile exists
+ if [[ "$PIPENV_ACTIVE" != 1 ]]; then
+ if [[ -f "$PWD/Pipfile" ]]; then
+ export pipfile_dir="$PWD"
+ pipenv shell
+ fi
fi
- fi
-}
-autoload -U add-zsh-hook
-add-zsh-hook chpwd _togglePipenvShell
-_togglePipenvShell
+ }
+ autoload -U add-zsh-hook
+ add-zsh-hook chpwd _togglePipenvShell
+ _togglePipenvShell
+fi
# Aliases
alias pch="pipenv check"
@@ -39,6 +49,7 @@ alias prun="pipenv run"
alias psh="pipenv shell"
alias psy="pipenv sync"
alias pu="pipenv uninstall"
+alias pupd="pipenv update"
alias pwh="pipenv --where"
alias pvenv="pipenv --venv"
alias ppy="pipenv --py"
diff --git a/plugins/podman/README.md b/plugins/podman/README.md
new file mode 100644
index 00000000..99daa28c
--- /dev/null
+++ b/plugins/podman/README.md
@@ -0,0 +1,47 @@
+# Podman plugin
+
+This plugin adds auto-completion and aliases for [podman](https://podman.io/).
+
+To use it add `podman` to the plugins array in your zshrc file.
+
+```zsh
+plugins=(... podman)
+```
+
+## Aliases
+
+| Alias | Command | Description |
+| :------ | :-------------------------------------------- | :--------------------------------------------------------------------------------------- |
+| pbl | `podman build` | Build an image from a Dockerfile |
+| pcin | `podman container inspect` | Display detailed information on one or more containers |
+| pcls | `podman container ls` | List all the running podman containers |
+| pclsa | `podman container ls --all` | List all running and stopped containers |
+| pib | `podman image build` | Build an image from a Dockerfile (same as podman build) |
+| pii | `podman image inspect` | Display detailed information on one or more images |
+| pils | `podman image ls` | List podman images |
+| pipu | `podman image push` | Push an image or repository to a remote registry |
+| pirm | `podman image rm` | Remove one or more images |
+| pit | `podman image tag` | Add a name and tag to a particular image |
+| plo | `podman container logs` | Fetch the logs of a podman container |
+| pnc | `podman network create` | Create a new network |
+| pncn | `podman network connect` | Connect a container to a network |
+| pndcn | `podman network disconnect` | Disconnect a container from a network |
+| pni | `podman network inspect` | Return information about one or more networks |
+| pnls | `podman network ls` | List all networks the engine daemon knows about, including those spanning multiple hosts |
+| pnrm | `podman network rm` | Remove one or more networks |
+| ppo | `podman container port` | List port mappings or a specific mapping for the container |
+| ppu | `podman pull` | Pull an image or a repository from a registry |
+| pr | `podman container run` | Create a new container and start it using the specified command |
+| prit | `podman container run --interactive --tty` | Create a new container and start it in an interactive shell |
+| prm | `podman container rm` | Remove the specified container(s) |
+| prm! | `podman container rm --force` | Force the removal of a running container (uses SIGKILL) |
+| pst | `podman container start` | Start one or more stopped containers |
+| prs | `podman container restart` | Restart one or more containers |
+| psta | `podman stop $(podman ps -q)` | Stop all running containers |
+| pstp | `podman container stop` | Stop one or more running containers |
+| ptop | `podman top` | Display the running processes of a container |
+| pvi | `podman volume inspect` | Display detailed information about one or more volumes |
+| pvls | `podman volume ls` | List all the volumes known to podman |
+| pvprune | `podman volume prune` | Cleanup dangling volumes |
+| pxc | `podman container exec` | Run a new command in a running container |
+| pxcit | `podman container exec --interactive --tty` | Run a new command in a running container in an interactive shell |
diff --git a/plugins/podman/podman.plugin.zsh b/plugins/podman/podman.plugin.zsh
new file mode 100644
index 00000000..97cf92b2
--- /dev/null
+++ b/plugins/podman/podman.plugin.zsh
@@ -0,0 +1,47 @@
+if (( ! $+commands[podman] )); then
+ return
+fi
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `podman`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_podman" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _podman
+ _comps[podman]=_podman
+fi
+
+podman completion zsh 2> /dev/null >| "$ZSH_CACHE_DIR/completions/_podman" &|
+
+alias pbl='podman build'
+alias pcin='podman container inspect'
+alias pcls='podman container ls'
+alias pclsa='podman container ls --all'
+alias pib='podman image build'
+alias pii='podman image inspect'
+alias pils='podman image ls'
+alias pipu='podman image push'
+alias pirm='podman image rm'
+alias pit='podman image tag'
+alias plo='podman container logs'
+alias pnc='podman network create'
+alias pncn='podman network connect'
+alias pndcn='podman network disconnect'
+alias pni='podman network inspect'
+alias pnls='podman network ls'
+alias pnrm='podman network rm'
+alias ppo='podman container port'
+alias ppu='podman pull'
+alias pr='podman container run'
+alias prit='podman container run --interactive --tty'
+alias prm='podman container rm'
+alias 'prm!'='podman container rm --force'
+alias pst='podman container start'
+alias prs='podman container restart'
+alias psta='podman stop $(podman ps --quiet)'
+alias pstp='podman container stop'
+alias ptop='podman top'
+alias pvi='podman volume inspect'
+alias pvls='podman volume ls'
+alias pvprune='podman volume prune'
+alias pxc='podman container exec'
+alias pxcit='podman container exec --interactive --tty'
diff --git a/plugins/poetry-env/README.md b/plugins/poetry-env/README.md
new file mode 100644
index 00000000..a7d16563
--- /dev/null
+++ b/plugins/poetry-env/README.md
@@ -0,0 +1,10 @@
+# Poetry Environment Plugin
+
+This plugin automatically changes poetry environment when you cd into or out of the project directory.
+Note: Script looks for pyproject.toml file to determine poetry if its a poetry environment
+
+To use it, add `poetry-env` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... poetry-env)
+```
diff --git a/plugins/poetry-env/poetry-env.plugin.zsh b/plugins/poetry-env/poetry-env.plugin.zsh
new file mode 100644
index 00000000..86e5fad4
--- /dev/null
+++ b/plugins/poetry-env/poetry-env.plugin.zsh
@@ -0,0 +1,27 @@
+# Automatic poetry environment activation/deactivation
+_togglePoetryShell() {
+ # deactivate environment if pyproject.toml doesn't exist and not in a subdir
+ if [[ ! -f "$PWD/pyproject.toml" ]] ; then
+ if [[ "$poetry_active" == 1 ]]; then
+ if [[ "$PWD" != "$poetry_dir"* ]]; then
+ export poetry_active=0
+ deactivate
+ return
+ fi
+ fi
+ fi
+
+ # activate the environment if pyproject.toml exists
+ if [[ "$poetry_active" != 1 ]]; then
+ if [[ -f "$PWD/pyproject.toml" ]]; then
+ if grep -q 'tool.poetry' "$PWD/pyproject.toml"; then
+ export poetry_active=1
+ export poetry_dir="$PWD"
+ source "$(poetry env info --path)/bin/activate"
+ fi
+ fi
+ fi
+}
+autoload -U add-zsh-hook
+add-zsh-hook chpwd _togglePoetryShell
+_togglePoetryShell
diff --git a/plugins/postgres/README.md b/plugins/postgres/README.md
index 59445f31..3f59a8fe 100644
--- a/plugins/postgres/README.md
+++ b/plugins/postgres/README.md
@@ -19,4 +19,4 @@ plugins=(... postgres)
| stoppost | `pg_ctl -D /usr/local/var/postgres stop -s -m fast` | Stop postgres server |
| restartpost | `stoppost && sleep 1 && startpost` | Restart (calls stop, then start) |
| reloadpost | `pg_ctl reload -D /usr/local/var/postgres -s` | Reload postgres configuration (some setting require restart)|
-| statuspost | `pg_ctl status -D /usr/local/var/postgres -s` | Check startus of postgres server (running, stopped) |
+| statuspost | `pg_ctl status -D /usr/local/var/postgres -s` | Check status of postgres server (running, stopped) |
diff --git a/plugins/pre-commit/README.md b/plugins/pre-commit/README.md
new file mode 100644
index 00000000..e6d80d36
--- /dev/null
+++ b/plugins/pre-commit/README.md
@@ -0,0 +1,19 @@
+# Pre-commit plugin
+
+This plugin adds aliases for common commands of [pre-commit](https://pre-commit.com/).
+
+To use this plugin, add it to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... pre-commit)
+```
+
+## Aliases
+
+| Alias | Command | Description |
+| ------- | -------------------------------------- | ------------------------------------------------------ |
+| prc | `pre-commit` | The `pre-commit` command |
+| prcau | `pre-commit autoupdate` | Update hooks automatically |
+| prcr | `pre-commit run` | The `pre-commit run` command |
+| prcra | `pre-commit run --all-files` | Run pre-commit hooks on all files |
+| prcrf | `pre-commit run --files` | Run pre-commit hooks on a given list of files |
diff --git a/plugins/pre-commit/pre-commit.plugin.zsh b/plugins/pre-commit/pre-commit.plugin.zsh
new file mode 100644
index 00000000..c3d0c629
--- /dev/null
+++ b/plugins/pre-commit/pre-commit.plugin.zsh
@@ -0,0 +1,8 @@
+# Aliases for pre-commit
+alias prc='pre-commit'
+
+alias prcau='pre-commit autoupdate'
+
+alias prcr='pre-commit run'
+alias prcra='pre-commit run --all-files'
+alias prcrf='pre-commit run --files'
diff --git a/plugins/pyenv/README.md b/plugins/pyenv/README.md
index b9ee937b..f1ca3d28 100644
--- a/plugins/pyenv/README.md
+++ b/plugins/pyenv/README.md
@@ -10,6 +10,14 @@ To use it, add `pyenv` to the plugins array in your zshrc file:
plugins=(... pyenv)
```
+If you receive a `Found pyenv, but it is badly configured.` error on startup, you may need to ensure that `pyenv` is initialized before the oh-my-zsh pyenv plugin is loaded. This can be achived by adding the following earlier in the `.zshrc` file than the `plugins=(...)` line:
+
+```zsh
+export PYENV_ROOT="$HOME/.pyenv"
+export PATH="$PYENV_ROOT/bin:$PATH"
+eval "$(pyenv init --path)"
+```
+
## Settings
- `ZSH_PYENV_QUIET`: if set to `true`, the plugin will not print any messages if it
diff --git a/plugins/pyenv/pyenv.plugin.zsh b/plugins/pyenv/pyenv.plugin.zsh
index 7fbd1589..48c8ffaf 100644
--- a/plugins/pyenv/pyenv.plugin.zsh
+++ b/plugins/pyenv/pyenv.plugin.zsh
@@ -78,7 +78,7 @@ if [[ $FOUND_PYENV -eq 1 ]]; then
eval "$(pyenv init - --no-rehash zsh)"
# If pyenv-virtualenv exists, load it
- if [[ "$(pyenv commands)" =~ "virtualenv-init" && "$ZSH_PYENV_VIRTUALENV" != false ]]; then
+ if [[ "$ZSH_PYENV_VIRTUALENV" != false && "$(pyenv commands)" =~ "virtualenv-init" ]]; then
eval "$(pyenv virtualenv-init - zsh)"
fi
diff --git a/plugins/qodana/README.md b/plugins/qodana/README.md
new file mode 100644
index 00000000..0b68bdec
--- /dev/null
+++ b/plugins/qodana/README.md
@@ -0,0 +1,20 @@
+# JetBrains Qodana CLI plugin
+
+This plugin adds completion for the [JetBrains Qodana CLI](https://github.com/JetBrains/qodana-cli).
+
+To use it, add `qodana` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... qodana)
+```
+
+This plugin does not add any aliases.
+
+## Cache
+
+This plugin caches the completion script and is automatically updated when the
+plugin is loaded, which is usually when you start up a new terminal emulator.
+
+The cache is stored at:
+
+- `$ZSH_CACHE_DIR/completions/_qodana` completions script
diff --git a/plugins/qodana/qodana.plugin.zsh b/plugins/qodana/qodana.plugin.zsh
new file mode 100644
index 00000000..2b92a805
--- /dev/null
+++ b/plugins/qodana/qodana.plugin.zsh
@@ -0,0 +1,14 @@
+# Autocompletion for the JetBrains Qodana CLI (qodana).
+if (( ! $+commands[qodana] )); then
+ return
+fi
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `qodana`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_qodana" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _qodana
+ _comps[qodana]=_qodana
+fi
+
+qodana completion zsh >| "$ZSH_CACHE_DIR/completions/_qodana" &|
diff --git a/plugins/qrcode/README.md b/plugins/qrcode/README.md
new file mode 100644
index 00000000..44283894
--- /dev/null
+++ b/plugins/qrcode/README.md
@@ -0,0 +1,8 @@
+# QRCode plugin
+
+Generate a QR Code from the command line. Uses [QRcode.show](https://qrcode.show) via curl.
+
+alias | command
+--------------- | --------
+`qrcode [text]` | `curl -d "text" qrcode.show`
+`qrsvg [text]` | `curl -d "text" qrcode.show -H "Accept: image/svg+xml"`
diff --git a/plugins/qrcode/qrcode.plugin.zsh b/plugins/qrcode/qrcode.plugin.zsh
new file mode 100644
index 00000000..d757e135
--- /dev/null
+++ b/plugins/qrcode/qrcode.plugin.zsh
@@ -0,0 +1,17 @@
+# Imported and improved from https://qrcode.show/, section SHELL FUNCTIONS
+
+_qrcode_show_message() {
+ echo "Type or paste your text, add a new blank line, and press ^d"
+}
+
+qrcode () {
+ local input="$*"
+ [ -z "$input" ] && _qrcode_show_message && local input="@/dev/stdin"
+ curl -d "$input" https://qrcode.show
+}
+
+qrsvg () {
+ local input="$*"
+ [ -z "$input" ] && _qrcode_show_message && local input="@/dev/stdin"
+ curl -d "$input" https://qrcode.show -H "Accept: image/svg+xml"
+}
diff --git a/plugins/rails/README.md b/plugins/rails/README.md
index fa66750f..c0c37ff3 100644
--- a/plugins/rails/README.md
+++ b/plugins/rails/README.md
@@ -40,13 +40,17 @@ plugins=(... rails)
| `rn` | `rails notes` | Search for notes (`FIXME`, `TODO`) in code comments |
| `rp` | `rails plugin` | Run a Rails plugin command |
| `rr` | `rails routes` | List all defined routes |
-| `rrg` | `rails routes \| grep` | List and filter the defined routes |
+| `rrc` | `rails routes --controller` | List and filter routes mapped to specific controller |
+| `rre` | `rails routes --expanded` | List all defined routes in expanded table mode |
+| `rrg` | `rails routes --grep` | List and filter the defined routes |
+| `rru` | `rails routes --unused` | List unused routes |
| `rs` | `rails server` | Launch a web server |
| `rsb` | `rails server --bind` | Launch a web server binding it to a specific IP |
| `rsd` | `rails server --debugger` | Launch a web server with debugger |
| `rsp` | `rails server --port` | Launch a web server and specify the listening port |
| `rsts` | `rails stats` | Print code statistics |
| `rt` | `rails test` | Run Rails tests |
+| `rta` | `rails test:all` | Runs all Rails tests, including system tests |
| `ru` | `rails runner` | Run Ruby code in the context of Rails |
### Foreman
diff --git a/plugins/rails/rails.plugin.zsh b/plugins/rails/rails.plugin.zsh
index b11cbb5c..75dd9b0c 100644
--- a/plugins/rails/rails.plugin.zsh
+++ b/plugins/rails/rails.plugin.zsh
@@ -68,13 +68,17 @@ alias rmd='rails middleware'
alias rn='rails notes'
alias rp='rails plugin'
alias rr='rails routes'
-alias rrg='rails routes | grep'
+alias rrc='rails routes --controller'
+alias rre='rails routes --expanded'
+alias rrg='rails routes --grep'
+alias rru='rails routes --unused'
alias rs='rails server'
alias rsb='rails server --bind'
alias rsd='rails server --debugger'
alias rsp='rails server --port'
alias rsts='rails stats'
alias rt='rails test'
+alias rta='rails test:all'
alias ru='rails runner'
# Foreman aliases
diff --git a/plugins/rake-fast/rake-fast.plugin.zsh b/plugins/rake-fast/rake-fast.plugin.zsh
index 19dab154..86e5ed58 100644
--- a/plugins/rake-fast/rake-fast.plugin.zsh
+++ b/plugins/rake-fast/rake-fast.plugin.zsh
@@ -1,5 +1,28 @@
+# The version of the format of .rake_tasks. If the output of _rake_generate
+# changes, incrementing this number will force it to regenerate
+_rake_tasks_version=2
+
_rake_does_task_list_need_generating () {
- [[ ! -f .rake_tasks ]] || [[ Rakefile -nt .rake_tasks ]] || { _is_rails_app && _tasks_changed }
+ _rake_tasks_missing || _rake_tasks_version_changed || _rakefile_has_changes || { _is_rails_app && _tasks_changed }
+}
+
+_rake_tasks_missing () {
+ [[ ! -f .rake_tasks ]]
+}
+
+_rake_tasks_version_changed () {
+ local -a file_version
+ file_version=`head -n 1 .rake_tasks | sed "s/^version\://"`
+
+ if ! [[ $file_version =~ '^[0-9]*$' ]]; then
+ return true
+ fi
+
+ [[ $file_version -ne $_rake_tasks_version ]]
+}
+
+_rakefile_has_changes () {
+ [[ Rakefile -nt .rake_tasks ]]
}
_is_rails_app () {
@@ -20,7 +43,14 @@ _tasks_changed () {
}
_rake_generate () {
- rake --silent --tasks | cut -d " " -f 2 | sed 's/\[.*\]//g' > .rake_tasks
+ echo "version:$_rake_tasks_version" > .rake_tasks
+
+ rake --silent --tasks --all \
+ | sed "s/^rake //" | sed "s/\:/\\\:/g" \
+ | sed "s/\[[^]]*\]//g" \
+ | sed "s/ *# /\:/" \
+ | sed "s/\:$//" \
+ >> .rake_tasks
}
_rake () {
@@ -29,7 +59,10 @@ _rake () {
echo "\nGenerating .rake_tasks..." >&2
_rake_generate
fi
- compadd $(cat .rake_tasks)
+ local -a rake_options
+ rake_options=("${(@f)$(cat .rake_tasks)}")
+ shift rake_options
+ _describe 'rake tasks' rake_options
fi
}
compdef _rake rake
diff --git a/plugins/rtx/README.md b/plugins/rtx/README.md
new file mode 100644
index 00000000..c6436d3a
--- /dev/null
+++ b/plugins/rtx/README.md
@@ -0,0 +1,30 @@
+## rtx
+
+
+Adds integration with [rtx](https://github.com/jdx/rtx), a runtime executor compatible with npm, nodenv, pyenv, etc. rtx is written in rust and is very fast. 20x-200x faster than asdf. With that being said, rtx is compatible with asdf plugins and .tool-versions files. It can be used as a drop-in replacement.
+
+### Installation
+
+1. [Download & install rtx](https://github.com/jdx/rtx#installation) by running the following:
+
+ ```
+ curl https://rtx.pub/install.sh | sh
+ ```
+
+
+2. [Enable rtx](https://github.com/jdx/rtx#quickstart) by adding it to your `plugins` definition in `~/.zshrc`.
+
+ ```
+ plugins=(rtx)
+ ```
+
+### Usage
+
+See the [rtx readme](https://github.com/jdx/rtx#table-of-contents) for information on how to use rtx. Here are a few examples:
+
+```
+rtx install node Install the current version specified in .tool-versions/.rtx.toml
+rtx use -g node@system Use system node as global default
+rtx install node@20.0.0 Install a specific version number
+rtx use -g node@20 Use node-20.x as global default
+```
diff --git a/plugins/rtx/rtx.plugin.zsh b/plugins/rtx/rtx.plugin.zsh
new file mode 100644
index 00000000..a01828af
--- /dev/null
+++ b/plugins/rtx/rtx.plugin.zsh
@@ -0,0 +1,18 @@
+# rtx needs to be in $PATH
+if (( ! ${+commands[rtx]} )); then
+ return
+fi
+
+# Load rtx hooks
+eval "$(rtx activate zsh)"
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `rtx`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_rtx" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _rtx
+ _comps[rtx]=_rtx
+fi
+
+# Generate and load rtx completion
+rtx completion zsh >! "$ZSH_CACHE_DIR/completions/_rtx" &|
diff --git a/plugins/ruby/ruby.plugin.zsh b/plugins/ruby/ruby.plugin.zsh
index 40851211..e09b22c7 100644
--- a/plugins/ruby/ruby.plugin.zsh
+++ b/plugins/ruby/ruby.plugin.zsh
@@ -23,4 +23,4 @@ alias gel="gem lock"
alias geo="gem open"
alias geoe="gem open -e"
alias rrun="ruby -e"
-alias rserver="ruby -e httpd . -p 8080" # requires webrick
+alias rserver="ruby -run -e httpd . -p 8080" # requires webrick
diff --git a/plugins/rvm/README.md b/plugins/rvm/README.md
index 576b037b..410bd60c 100644
--- a/plugins/rvm/README.md
+++ b/plugins/rvm/README.md
@@ -24,6 +24,7 @@ plugins=(... rvm)
| `rb27` | `rvm use ruby-2.7` |
| `rb30` | `rvm use ruby-3.0` |
| `rb31` | `rvm use ruby-3.1` |
+| `rb32` | `rvm use ruby-3.2` |
| `rvm-update` | `rvm get head` |
| `gems` | `gem list` |
| `rvms` | `rvm gemset` |
diff --git a/plugins/rvm/rvm.plugin.zsh b/plugins/rvm/rvm.plugin.zsh
index 2a091d01..3ddf0417 100644
--- a/plugins/rvm/rvm.plugin.zsh
+++ b/plugins/rvm/rvm.plugin.zsh
@@ -27,6 +27,7 @@ rubies=(
27 'ruby-2.7'
30 'ruby-3.0'
31 'ruby-3.1'
+ 32 'ruby-3.2'
)
for v in ${(k)rubies}; do
diff --git a/plugins/shell-proxy/README.md b/plugins/shell-proxy/README.md
index b19888c5..102e46b6 100644
--- a/plugins/shell-proxy/README.md
+++ b/plugins/shell-proxy/README.md
@@ -23,6 +23,7 @@ Set `SHELLPROXY_URL` environment variable to the URL of the proxy server:
```sh
SHELLPROXY_URL="http://127.0.0.1:8123"
+SHELLPROXY_NO_PROXY="localhost,127.0.0.1"
proxy enable
```
@@ -36,11 +37,15 @@ Example:
```sh
#!/bin/bash
+# HTTP Proxy
if [[ "$(uname)" = Darwin ]]; then
echo "http://127.0.0.1:6152" # Surge Mac
else
echo "http://127.0.0.1:8123" # polipo
fi
+
+# No Proxy
+echo "localhost,127.0.0.1"
```
### Method 3
diff --git a/plugins/shell-proxy/proxy.py b/plugins/shell-proxy/proxy.py
index 14f2944c..8c2aaf9f 100755
--- a/plugins/shell-proxy/proxy.py
+++ b/plugins/shell-proxy/proxy.py
@@ -6,6 +6,7 @@ from subprocess import check_output, list2cmdline
cwd = os.path.dirname(__file__)
ssh_agent = os.path.join(cwd, "ssh-agent.py")
proxy_env = "SHELLPROXY_URL"
+no_proxy_env = "SHELLPROXY_NO_PROXY"
proxy_config = os.environ.get("SHELLPROXY_CONFIG") or os.path.expandvars("$HOME/.config/proxy")
usage="""shell-proxy: no proxy configuration found.
@@ -15,18 +16,30 @@ See the plugin README for more information.""".format(env=proxy_env, config=prox
def get_http_proxy():
default_proxy = os.environ.get(proxy_env)
- if default_proxy:
- return default_proxy
+ no_proxy = os.environ.get(no_proxy_env)
+ if default_proxy and no_proxy:
+ return default_proxy, no_proxy
+
if os.path.isfile(proxy_config):
- return check_output(proxy_config).decode("utf-8").strip()
+ proxy_configdata = [line.strip() for line in check_output(proxy_config).decode("utf-8").splitlines()]
+ if len(proxy_configdata) >= 1:
+ if not default_proxy:
+ default_proxy = proxy_configdata[0]
+ if len(proxy_configdata) == 2 and not no_proxy:
+ no_proxy = proxy_configdata[1]
+
+ if default_proxy:
+ return default_proxy, no_proxy
print(usage, file=sys.stderr)
sys.exit(1)
-def make_proxies(url: str):
+def make_proxies(url: str, no_proxy: str):
proxies = {"%s_PROXY" % _: url for _ in ("HTTP", "HTTPS", "FTP", "RSYNC", "ALL")}
proxies.update({name.lower(): value for (name, value) in proxies.items()})
proxies["GIT_SSH"] = ssh_agent
+ if no_proxy:
+ proxies.update({"NO_PROXY": no_proxy, "no_proxy": no_proxy})
return proxies
@@ -35,7 +48,7 @@ def merge(mapping: dict):
class CommandSet:
- proxies = make_proxies(get_http_proxy())
+ proxies = make_proxies(*get_http_proxy())
aliases = {
_: "env __SSH_PROGRAM_NAME__=%s %s" % (_, ssh_agent)
for _ in ("ssh", "sftp", "scp", "slogin", "ssh-copy-id")
diff --git a/plugins/shell-proxy/shell-proxy.plugin.zsh b/plugins/shell-proxy/shell-proxy.plugin.zsh
index 4fdbe932..f6c31da4 100644
--- a/plugins/shell-proxy/shell-proxy.plugin.zsh
+++ b/plugins/shell-proxy/shell-proxy.plugin.zsh
@@ -27,7 +27,7 @@ eval '
# capture the output of the proxy script and bail out if it fails
local output
- output="$(SHELLPROXY_URL="$SHELLPROXY_URL" SHELLPROXY_CONFIG="$SHELLPROXY_CONFIG" "$proxy" "$1")" ||
+ output="$(SHELLPROXY_URL="$SHELLPROXY_URL" SHELLPROXY_NO_PROXY="$SHELLPROXY_NO_PROXY" SHELLPROXY_CONFIG="$SHELLPROXY_CONFIG" "$proxy" "$1")" ||
return $?
# evaluate the output generated by the proxy script
diff --git a/plugins/skaffold/README.md b/plugins/skaffold/README.md
new file mode 100644
index 00000000..4ee12c66
--- /dev/null
+++ b/plugins/skaffold/README.md
@@ -0,0 +1,9 @@
+# Skaffold plugin (Autocompletion)
+
+This plugin adds completion for [Skaffold](https://skaffold.dev)
+
+To use it, add `skaffold` to the plugins array in your zshrc file:
+
+```zsh
+plugins=(... skaffold)
+```
diff --git a/plugins/skaffold/skaffold.plugin.zsh b/plugins/skaffold/skaffold.plugin.zsh
new file mode 100644
index 00000000..8296c450
--- /dev/null
+++ b/plugins/skaffold/skaffold.plugin.zsh
@@ -0,0 +1,14 @@
+# Autocompletion for skaffold
+if (( ! $+commands[skaffold] )); then
+ return
+fi
+
+# If the completion file doesn't exist yet, we need to autoload it and
+# bind it to `skaffold`. Otherwise, compinit will have already done that.
+if [[ ! -f "$ZSH_CACHE_DIR/completions/_skaffold" ]]; then
+ typeset -g -A _comps
+ autoload -Uz _skaffold
+ _comps[skaffold]=_skaffold
+fi
+
+skaffold completion zsh >| "$ZSH_CACHE_DIR/completions/_skaffold" &|
diff --git a/plugins/snap/README.md b/plugins/snap/README.md
new file mode 100644
index 00000000..75c5ec19
--- /dev/null
+++ b/plugins/snap/README.md
@@ -0,0 +1,18 @@
+# snap plugin
+
+This plugin sets up aliases for the common [snap](https://snapcraft.io/docs/getting-started) commands
+
+## Aliases
+
+| Alias | Full command |
+| --- | ---|
+| sv | snap version |
+| sf | snap find |
+| si | snap install |
+| sin | snap info |
+| sr | snap remove |
+| sref | snap refresh |
+| srev | snap revert |
+| sl | snap list |
+| sd | snap disable |
+| se | snap enable |
diff --git a/plugins/snap/snap.plugin.zsh b/plugins/snap/snap.plugin.zsh
new file mode 100644
index 00000000..af234697
--- /dev/null
+++ b/plugins/snap/snap.plugin.zsh
@@ -0,0 +1,10 @@
+alias sv="snap version"
+alias sf="snap find"
+alias si="snap install"
+alias sin="snap info"
+alias sr="snap remove"
+alias sref="snap refresh"
+alias srev="snap revert"
+alias sl="snap list"
+alias sd="snap disable"
+alias se="snap enable"
diff --git a/plugins/ssh-agent/README.md b/plugins/ssh-agent/README.md
index fa6a996d..8c118e65 100644
--- a/plugins/ssh-agent/README.md
+++ b/plugins/ssh-agent/README.md
@@ -99,6 +99,33 @@ ssh-add -K -c -a /run/user/1000/ssh-auth
For valid `ssh-add` arguments run `ssh-add --help` or `man ssh-add`.
+### Powerline 10k specific settings
+
+Powerline10k has an instant prompt setting that doesn't like when this plugin
+writes to the console. Consider using the following settings if you're using
+p10k (documented above):
+
+```
+zstyle :omz:plugins:ssh-agent quiet yes
+zstyle :omz:plugins:ssh-agent lazy yes
+```
+
+### macOS specific settings
+
+macOS supports using passphrases stored in the keychain when adding identities
+to the ssh-agent.
+
+```
+ssh-add --apple-use-keychain ~/.ssh/id_rsa ...
+```
+
+
+This plugin can be configured to use the keychain when loading using the following:
+
+```
+zstyle :omz:plugins:ssh-agent ssh-add-args --apple-load-keychain
+```
+
## Credits
Based on code from Joseph M. Reagle: https://www.cygwin.com/ml/cygwin/2001-06/msg00537.html
diff --git a/plugins/starship/README.md b/plugins/starship/README.md
new file mode 100644
index 00000000..0e66c529
--- /dev/null
+++ b/plugins/starship/README.md
@@ -0,0 +1,21 @@
+# starship plugin
+
+Initializes [starship prompt](https://starship.rs) - a minimal, blazing-fast and infinitely customizable cross-shell prompt.
+
+[Demo](https://user-images.githubusercontent.com/62098008/169764279-50b48262-9506-4651-ba89-f6611a88ebf0.mp4)
+
+[External repository](https://github.com/axieax/zsh-starship) for this zsh plugin.
+
+# Installation
+
+**Note:** you have to [install starship](https://starship.rs/guide/#%F0%9F%9A%80-installation) first.
+
+## [oh-my-zsh](https://github.com/ohmyzsh/ohmyzsh)
+
+Add `starship` to the plugins array in your `.zshrc` file:
+
+```zsh
+plugins=(... starship)
+```
+
+## ⚠️ ENABLING THIS PLUGIN WILL UNSET YOUR ZSH_THEME VARIABLE
diff --git a/plugins/starship/starship.plugin.zsh b/plugins/starship/starship.plugin.zsh
new file mode 100644
index 00000000..8c5d9135
--- /dev/null
+++ b/plugins/starship/starship.plugin.zsh
@@ -0,0 +1,8 @@
+# ignore oh-my-zsh theme
+unset ZSH_THEME
+
+if (( $+commands[starship] )); then
+ eval "$(starship init zsh)"
+else
+ echo '[oh-my-zsh] starship not found, please install it from https://starship.rs'
+fi
diff --git a/plugins/sudo/sudo.plugin.zsh b/plugins/sudo/sudo.plugin.zsh
index 2a0b3bfc..66b253fe 100644
--- a/plugins/sudo/sudo.plugin.zsh
+++ b/plugins/sudo/sudo.plugin.zsh
@@ -96,7 +96,7 @@ sudo-command-line() {
LBUFFER="${WHITESPACE}${LBUFFER}"
# Redisplay edit buffer (compatibility with zsh-syntax-highlighting)
- zle redisplay
+ zle && zle redisplay # only run redisplay if zle is enabled
}
}
diff --git a/plugins/systemadmin/systemadmin.plugin.zsh b/plugins/systemadmin/systemadmin.plugin.zsh
index 8e5e0af7..03dd995b 100644
--- a/plugins/systemadmin/systemadmin.plugin.zsh
+++ b/plugins/systemadmin/systemadmin.plugin.zsh
@@ -13,11 +13,11 @@
# ------------------------------------------------------------------------------
function retlog() {
- if [[ -z $1 ]];then
- echo '/var/log/nginx/access.log'
- else
- echo $1
- fi
+ if [[ -z $1 ]];then
+ echo '/var/log/nginx/access.log'
+ else
+ echo $1
+ fi
}
alias ping='ping -c 5'
@@ -28,128 +28,160 @@ alias mkdir='mkdir -pv'
alias psmem='ps -e -orss=,args= | sort -b -k1 -nr'
alias psmem10='ps -e -orss=,args= | sort -b -k1 -nr | head -n 10'
# get top process eating cpu if not work try execute : export LC_ALL='C'
-alias pscpu='ps -e -o pcpu,cpu,nice,state,cputime,args|sort -k1,1n -nr'
-alias pscpu10='ps -e -o pcpu,cpu,nice,state,cputime,args|sort -k1,1n -nr | head -n 10'
+alias pscpu='ps -e -o pcpu,cpu,nice,state,cputime,args | sort -k1,1n -nr'
+alias pscpu10='ps -e -o pcpu,cpu,nice,state,cputime,args | sort -k1,1n -nr | head -n 10'
# top10 of the history
alias hist10='print -l ${(o)history%% *} | uniq -c | sort -nr | head -n 10'
+function ip() {
+ if [ -t 1 ]; then
+ command ip -color "$@"
+ else
+ command ip "$@"
+ fi
+}
+
# directory LS
function dls() {
- print -l *(/)
+ print -l *(/)
}
function psgrep() {
- ps aux | grep "${1:-.}" | grep -v grep
+ ps aux | grep "${1:-.}" | grep -v grep
}
# Kills any process that matches a regexp passed to it
function killit() {
- ps aux | grep -v "grep" | grep "$@" | awk '{print $2}' | xargs sudo kill
+ ps aux | grep -v "grep" | grep "$@" | awk '{print $2}' | xargs sudo kill
}
# list contents of directories in a tree-like format
if ! (( $+commands[tree] )); then
- function tree() {
- find $@ -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
- }
+ function tree() {
+ find $@ -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
+ }
fi
# Sort connection state
function sortcons() {
- netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
+ {
+ LANG= ss -nat | awk 'NR > 1 {print $1}' \
+ || LANG= netstat -nat | awk 'NR > 2 {print $6}'
+ } | sort | uniq -c | sort -rn
}
# View all 80 Port Connections
function con80() {
- netstat -nat|grep -i ":80"|wc -l
+ {
+ LANG= ss -nat || LANG= netstat -nat
+ } | grep -E ":80[^0-9]" | wc -l
}
# On the connected IP sorted by the number of connections
function sortconip() {
- netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
+ {
+ LANG= ss -ntu | awk 'NR > 1 {print $6}' \
+ || LANG= netstat -ntu | awk 'NR > 2 {print $5}'
+ } | cut -d: -f1 | sort | uniq -c | sort -n
}
# top20 of Find the number of requests on 80 port
function req20() {
- netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20
+ {
+ LANG= ss -tn | awk '$4 ~ /:80$/ {print $5}' \
+ || LANG= netstat -tn | awk '$4 ~ /:80$/ {print $5}'
+ } | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -n 20
}
# top20 of Using tcpdump port 80 access to view
function http20() {
- sudo tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -n 20
+ sudo tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | head -n 20
}
# top20 of Find time_wait connection
function timewait20() {
- netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20
+ {
+ LANG= ss -nat | awk 'NR > 1 && /TIME-WAIT/ {print $5}' \
+ || LANG= netstat -nat | awk 'NR > 2 && /TIME_WAIT/ {print $5}'
+ } | sort | uniq -c | sort -rn | head -n 20
}
# top20 of Find SYN connection
function syn20() {
- netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr|head -n20
+ {
+ LANG= ss -an | awk '/SYN/ {print $5}' \
+ || LANG= netstat -an | awk '/SYN/ {print $5}'
+ } | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -n20
}
# Printing process according to the port number
function port_pro() {
- netstat -ntlp | grep "${1:-.}" | awk '{print $7}' | cut -d/ -f1
+ LANG= ss -ntlp | awk "NR > 1 && /:${1:-}/ {print \$6}" | sed 's/.*pid=\([^,]*\).*/\1/' \
+ || LANG= netstat -ntlp | awk "NR > 2 && /:${1:-}/ {print \$7}" | cut -d/ -f1
}
# top10 of gain access to the ip address
function accessip10() {
- awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}' "$(retlog)"
+ awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}' "$(retlog)"
}
# top20 of Most Visited file or page
function visitpage20() {
- awk '{print $11}' "$(retlog)"|sort|uniq -c|sort -nr|head -n 20
+ awk '{print $11}' "$(retlog)" | sort | uniq -c | sort -nr | head -n 20
}
# top100 of Page lists the most time-consuming (more than 60 seconds) as well as the corresponding page number of occurrences
function consume100() {
- awk '($NF > 60 && $7~/\.php/){print $7}' "$(retlog)" |sort -n|uniq -c|sort -nr|head -n 100
- # if django website or other website make by no suffix language
- # awk '{print $7}' "$(retlog)" |sort -n|uniq -c|sort -nr|head -n 100
+ awk '($NF > 60 && $7~/\.php/){print $7}' "$(retlog)" | sort -n | uniq -c | sort -nr | head -n 100
+ # if django website or other website make by no suffix language
+ # awk '{print $7}' "$(retlog)" | sort -n | uniq -c | sort -nr | head -n 100
}
# Website traffic statistics (G)
function webtraffic() {
- awk "{sum+=$10} END {print sum/1024/1024/1024}" "$(retlog)"
+ awk "{sum+=$10} END {print sum/1024/1024/1024}" "$(retlog)"
}
# Statistical connections 404
function c404() {
- awk '($9 ~/404/)' "$(retlog)" | awk '{print $9,$7}' | sort
+ awk '($9 ~ /404/)' "$(retlog)" | awk '{print $9,$7}' | sort
}
# Statistical http status.
function httpstatus() {
- awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}' "$(retlog)"
+ awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}' "$(retlog)"
}
# Delete 0 byte file
function d0() {
- find "${1:-.}" -type f -size 0 -exec rm -rf {} \;
+ find "${1:-.}" -type f -size 0 -exec rm -rf {} \;
}
# gather external ip address
function geteip() {
- curl -s -S -4 https://icanhazip.com
- curl -s -S -6 https://icanhazip.com
+ curl -s -S -4 https://icanhazip.com
+
+ # handle case when there is no IPv6 external IP, which shows error
+ # curl: (7) Couldn't connect to server
+ curl -s -S -6 https://icanhazip.com 2>/dev/null
+ local ret=$?
+ (( ret == 7 )) && print -P -u2 "%F{red}error: no IPv6 route to host%f"
+ return $ret
}
# determine local IP address(es)
function getip() {
- if (( ${+commands[ip]} )); then
- ip addr | awk '/inet /{print $2}' | command grep -v 127.0.0.1
- else
- ifconfig | awk '/inet /{print $2}' | command grep -v 127.0.0.1
- fi
+ if (( ${+commands[ip]} )); then
+ ip addr | awk '/inet /{print $2}' | command grep -v 127.0.0.1
+ else
+ ifconfig | awk '/inet /{print $2}' | command grep -v 127.0.0.1
+ fi
}
# Clear zombie processes
function clrz() {
- ps -eal | awk '{ if ($2 == "Z") {print $4}}' | kill -9
+ ps -eal | awk '{ if ($2 == "Z") {print $4}}' | kill -9
}
# Second concurrent
function conssec() {
- awk '{if($9~/200|30|404/)COUNT[$4]++}END{for( a in COUNT) print a,COUNT[a]}' "$(retlog)"|sort -k 2 -nr|head -n10
+ awk '{if($9~/200|30|404/)COUNT[$4]++}END{for( a in COUNT) print a,COUNT[a]}' "$(retlog)" | sort -k 2 -nr | head -n10
}
diff --git a/plugins/systemd/README.md b/plugins/systemd/README.md
index ffa0567a..755c649a 100644
--- a/plugins/systemd/README.md
+++ b/plugins/systemd/README.md
@@ -12,6 +12,7 @@ plugins=(... systemd)
| Alias | Command | Description |
|:-----------------------|:-----------------------------------|:-----------------------------------------------------------------|
+| `sc-failed` | `systemctl --failed` | List failed systemd units |
| `sc-list-units` | `systemctl list-units` | List all units systemd has in memory |
| `sc-is-active` | `systemctl is-active` | Show whether a unit is active |
| `sc-status` | `systemctl status` | Show terse runtime status information about one or more units |
diff --git a/plugins/systemd/systemd.plugin.zsh b/plugins/systemd/systemd.plugin.zsh
index 7afd2be5..382a57b2 100644
--- a/plugins/systemd/systemd.plugin.zsh
+++ b/plugins/systemd/systemd.plugin.zsh
@@ -93,6 +93,9 @@ alias scu-enable-now="scu-enable --now"
alias scu-disable-now="scu-disable --now"
alias scu-mask-now="scu-mask --now"
+# --failed commands
+alias scu-failed='systemctl --user --failed'
+alias sc-failed='systemctl --failed'
function systemd_prompt_info {
local unit
@@ -107,6 +110,8 @@ function systemd_prompt_info {
if systemctl is-active "$unit" &>/dev/null; then
echo -n "$ZSH_THEME_SYSTEMD_PROMPT_ACTIVE"
+ elif systemctl --user is-active "$unit" &>/dev/null; then
+ echo -n "$ZSH_THEME_SYSTEMD_PROMPT_ACTIVE"
else
echo -n "$ZSH_THEME_SYSTEMD_PROMPT_NOTACTIVE"
fi
diff --git a/plugins/term_tab/README b/plugins/term_tab/README
deleted file mode 100644
index 316062e7..00000000
--- a/plugins/term_tab/README
+++ /dev/null
@@ -1,16 +0,0 @@
-
-term_tab - 'cwd' for all open zsh sessions
-******************************************
-
-What it does:
-*************
-This plugin allows to complete the 'cwd' of other Zsh sessions. Sounds
-complicated but is rather simple. E.g. if you have three zsh sessions open, in
-each session you are in a different folder, you can hit Ctrl+v in one session
-to show you the current working directory of the other open zsh sessions.
-
-How it works:
-*************
-* It uses 'pidof zsh' to determine all zsh PIDs
-* It reads procfs to get the current working directory of this session
-* Everything is fed into zsh's completion magic
diff --git a/plugins/term_tab/README.md b/plugins/term_tab/README.md
new file mode 100644
index 00000000..59462a82
--- /dev/null
+++ b/plugins/term_tab/README.md
@@ -0,0 +1,18 @@
+# term_tab plugin
+
+This plugin only works for Solaris and linux.
+
+term_tab - `cwd` for all open zsh sessions
+
+## What it does:
+
+This plugin allows to complete the `cwd` of other Zsh sessions. Sounds
+complicated but is rather simple. E.g. if you have three zsh sessions open, in
+each session you are in a different folder, you can hit `Ctrl+V` in one session
+to show you the current working directory of the other open zsh sessions.
+
+## How it works:
+
+* It uses `pidof zsh` to determine all zsh PIDs
+* It reads procfs to get the current working directory of this session
+* Everything is fed into zsh's completion magic
diff --git a/plugins/term_tab/term_tab.plugin.zsh b/plugins/term_tab/term_tab.plugin.zsh
index 1b612df6..89acd910 100644
--- a/plugins/term_tab/term_tab.plugin.zsh
+++ b/plugins/term_tab/term_tab.plugin.zsh
@@ -28,6 +28,7 @@ function _term_list(){
case $OSTYPE in
solaris*) dirs=( ${(M)${${(f)"$(pgrep -U $UID -x zsh|xargs pwdx)"}:#$$:*}%%/*} ) ;;
linux*) dirs=( /proc/${^$(pidof zsh):#$$}/cwd(N:A) ) ;;
+ darwin*) dirs=( $( lsof -d cwd -c zsh -a -w -Fn | sed -n 's/^n//p' ) ) ;;
esac
dirs=( ${(D)dirs} )
diff --git a/plugins/terraform/README.md b/plugins/terraform/README.md
index 59c6e7f2..fc9a9f00 100644
--- a/plugins/terraform/README.md
+++ b/plugins/terraform/README.md
@@ -1,7 +1,7 @@
# Terraform plugin
-Plugin for Terraform, a tool from Hashicorp for managing infrastructure safely and efficiently.
-It adds completion for `terraform`, as well as aliases and a prompt function.
+Plugin for Terraform, a tool from Hashicorp for managing infrastructure safely and efficiently. It adds
+completion for `terraform`, as well as aliases and a prompt function.
To use it, add `terraform` to the plugins array of your `~/.zshrc` file:
@@ -11,7 +11,7 @@ plugins=(... terraform)
## Requirements
-* [Terraform](https://terraform.io/)
+- [Terraform](https://terraform.io/)
## Aliases
@@ -19,6 +19,7 @@ plugins=(... terraform)
| ----- | -------------------- |
| `tf` | `terraform` |
| `tfa` | `terraform apply` |
+| `tfc` | `terraform console` |
| `tfd` | `terraform destroy` |
| `tff` | `terraform fmt` |
| `tfi` | `terraform init` |
@@ -28,11 +29,12 @@ plugins=(... terraform)
## Prompt function
-You can add the current Terraform workspace in your prompt by adding `$(tf_prompt_info)`
-to your `PROMPT` or `RPROMPT` variable.
+You can add the current Terraform workspace in your prompt by adding `$(tf_prompt_info)`,
+`$(tf_version_prompt_info)` to your `PROMPT` or `RPROMPT` variable.
```sh
RPROMPT='$(tf_prompt_info)'
+RPROMPT='$(tf_version_prompt_info)'
```
You can also specify the PREFIX and SUFFIX for the workspace with the following variables:
@@ -40,4 +42,6 @@ You can also specify the PREFIX and SUFFIX for the workspace with the following
```sh
ZSH_THEME_TF_PROMPT_PREFIX="%{$fg[white]%}"
ZSH_THEME_TF_PROMPT_SUFFIX="%{$reset_color%}"
+ZSH_THEME_TF_VERSION_PROMPT_PREFIX="%{$fg[white]%}"
+ZSH_THEME_TF_VERSION_PROMPT_SUFFIX="%{$reset_color%}"
```
diff --git a/plugins/terraform/_terraform b/plugins/terraform/_terraform
new file mode 100644
index 00000000..62583456
--- /dev/null
+++ b/plugins/terraform/_terraform
@@ -0,0 +1,411 @@
+#compdef terraform
+
+local -a _terraform_cmds opt_args
+_terraform_cmds=(
+ 'apply:Builds or changes infrastructure'
+ 'console:Interactive console for Terraform interpolations'
+ 'destroy:Destroy Terraform-managed infrastructure'
+ 'fmt:Rewrites config files to canonical format'
+ 'force-unlock:Manually unlock the terraform state'
+ 'get:Download and install modules for the configuration'
+ 'graph:Create a visual graph of Terraform resources'
+ 'import:Import existing infrastructure into Terraform'
+ 'init:Initialize a Terraform working directory'
+ 'login:Obtain and save credentials for a remote host'
+ 'logout:Remove locally-stored credentials for a remote host'
+ 'output:Read an output from a state file'
+ 'plan:Generate and show an execution plan'
+ 'providers:Prints a tree of the providers used in the configuration'
+ 'refresh:Update local state file against real resources'
+ 'show:Inspect Terraform state or plan'
+ 'state:Advanced state management'
+ 'taint:Manually mark a resource for recreation'
+ 'untaint:Manually unmark a resource as tainted'
+ 'validate:Validates the Terraform files'
+ 'version:Prints the Terraform version'
+ 'workspace:Workspace management'
+ '0.12upgrade:Rewrites pre-0.12 module source code for v0.12'
+ '0.13upgrade:Rewrites pre-0.13 module source code for v0.13'
+)
+
+__012upgrade() {
+ _arguments \
+ '-yes[Skip the initial introduction messages and interactive confirmation. This can be used to run this command in batch from a script.]' \
+ '-force[ Override the heuristic that attempts to detect if a configuration is already written for v0.12 or later. Some of the transformations made by this command are not idempotent, so re-running against the same module may change the meanings expressions in the module.]'
+}
+
+__013upgrade() {
+ _arguments \
+ '-yes[Skip the initial introduction messages and interactive confirmation. This can be used to run this command in batch from a script.]'
+}
+
+__apply() {
+ _arguments \
+ '-auto-approve[Skip interactive approval of plan before applying.]' \
+ '-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \
+ '-compact-warnings[If Terraform produces any warnings that are not accompanied by errors, show them in a more compact form that includes only the summary messages.]' \
+ '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
+ '-lock-timeout=[(0s) Duration to retry a state lock.]' \
+ '-input=[(true) Ask for input for variables if not directly set.]' \
+ '-no-color[If specified, output will be colorless.]' \
+ '-parallelism=[(10) Limit the number of parallel resource operations.]' \
+ '-refresh=[(true) Update state prior to checking for differences. This has no effect if a plan file is given to apply.]' \
+ '-state=[(terraform.tfstate) Path to read and save state (unless state-out is specified).]:statefile:_files -g "*.tfstate"' \
+ '-state-out=[(path) Path to write state to that is different than "-state". This can be used to preserve the old state.]:statefile:_files -g "*.tfstate"' \
+ '*-target=[(resource) Resource to target. Operation will be limited to this resource and its dependencies. This flag can be used multiple times.]:target:__statelist' \
+ '*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \
+ '*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"'
+}
+
+__console() {
+ _arguments \
+ '-state=[(terraform.tfstate) Path to read state.]' \
+ '*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \
+ '*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"'
+}
+
+__destroy() {
+ _arguments \
+ '-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \
+ '-auto-approve[Skip interactive approval before destroying.]' \
+ '-force[Deprecated: same as auto-approve.]' \
+ '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
+ '-lock-timeout=[(0s) Duration to retry a state lock.]' \
+ '-no-color[If specified, output will contain no color.]' \
+ '-parallelism=[(10) Limit the number of concurrent operations.]' \
+ '-refresh=[(true) Update state prior to checking for differences. This has no effect if a plan file is given to apply.]' \
+ '-state=[(terraform.tfstate) Path to read and save state (unless state-out is specified).]:statefile:_files -g "*.tfstate"' \
+ '-state-out=[(path) Path to write state to that is different than "-state". This can be used to preserve the old state.]:statefile:_files -g "*.tfstate"' \
+ '*-target=[(resource) Resource to target. Operation will be limited to this resource and its dependencies. This flag can be used multiple times.]:target:__statelist' \
+ '*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \
+ '*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"'
+}
+
+__fmt() {
+ _arguments \
+ '-list=[(true) List files whose formatting differs (always false if using STDIN)]' \
+ '-write=[(true) Write result to source file instead of STDOUT (always false if using STDIN or -check)]' \
+ '-diff=[(false) Display diffs of formatting changes]' \
+ '-check=[(false) Check if the input is formatted. Exit status will be 0 if all input is properly formatted and non-zero otherwise.]' \
+ '-recursive=[(false) Also process files in subdirectories. By default, only the given directory (or current directory) is processed.]'
+}
+
+__force_unlock() {
+ _arguments \
+ "-force[Don't ask for input for unlock confirmation.]"
+}
+
+__get() {
+ _arguments \
+ '-update=[(false) If true, modules already downloaded will be checked for updates and updated if necessary.]' \
+ '-no-color[Disable text coloring in the output.]'
+}
+
+__graph() {
+ _arguments \
+ '-draw-cycles[Highlight any cycles in the graph with colored edges. This helps when diagnosing cycle errors.]' \
+ '-type=[(plan) Type of graph to output. Can be: plan, plan-destroy, apply, validate, input, refresh.]'
+}
+
+__import() {
+ _arguments \
+ '-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \
+ '-config=[(path) Path to a directory of Terraform configuration files to use to configure the provider. Defaults to pwd. If no config files are present, they must be provided via the input prompts or env vars.]' \
+ '-allow-missing-config[Allow import when no resource configuration block exists.]' \
+ '-input=[(true) Ask for input for variables if not directly set.]' \
+ '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
+ '-lock-timeout=[(0s) Duration to retry a state lock.]' \
+ '-no-color[If specified, output will contain no color.]' \
+ '-state=[(PATH) Path to the source state file. Defaults to the configured backend, or "terraform.tfstate"]:statefile:_files -g "*.tfstate"' \
+ '-state-out=[(PATH) Path to the destination state file to write to. If this is not specified, the source state file will be used. This can be a new or existing path.]:statefile:_files -g "*.tfstate"' \
+ '*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times. This is only useful with the "-config" flag.]' \
+ '*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"'
+}
+
+__init() {
+ _arguments \
+ '-backend=[(true) Configure the backend for this configuration.]' \
+ '-backend-config=[This can be either a path to an HCL file with key/value assignments (same format as terraform.tfvars) or a 'key=value' format. This is merged with what is in the configuration file. This can be specified multiple times. The backend type must be in the configuration itself.]' \
+ '-force-copy[Suppress prompts about copying state data. This is equivalent to providing a "yes" to all confirmation prompts.]' \
+ '-from-module=[(SOURCE) Copy the contents of the given module into the target directory before initialization.]' \
+ '-get=[(true) Download any modules for this configuration.]' \
+ '-get-plugins=[(true) Download any missing plugins for this configuration.]' \
+ '-input=[(true) Ask for input if necessary. If false, will error if input was required.]' \
+ '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
+ '-lock-timeout=[(0s) Duration to retry a state lock.]' \
+ '-no-color[If specified, output will contain no color.]' \
+ '-plugin-dir[Directory containing plugin binaries. This overrides all default search paths for plugins, and prevents the automatic installation of plugins. This flag can be used multiple times.]:plugin_dir:_files -/' \
+ '-reconfigure[Reconfigure the backend, ignoring any saved configuration.]' \
+ '-upgrade=[(false) If installing modules (-get) or plugins (-get-plugins), ignore previously-downloaded objects and install the latest version allowed within configured constraints.]' \
+ '-verify-plugins=[(true) Verify the authenticity and integrity of automatically downloaded plugins.]'
+}
+
+__login() {
+ _arguments \
+
+}
+
+__logout() {
+ _arguments \
+
+}
+
+__output() {
+ _arguments \
+ '-state=[(path) Path to the state file to read. Defaults to "terraform.tfstate".]:statefile:_files -g "*.tfstate"' \
+ '-no-color[If specified, output will contain no color.]' \
+ '-json[If specified, machine readable output will be printed in JSON format]'
+}
+
+__plan() {
+ _arguments \
+ '-compact-warnings[If Terraform produces any warnings that are not accompanied by errors, show them in a more compact form that includes only the summary messages.]' \
+ '-destroy[If set, a plan will be generated to destroy all resources managed by the given configuration and state.]' \
+ '-detailed-exitcode[() Return detailed exit codes when the command exits. This will change the meaning of exit codes to: 0 - Succeeded, diff is empty (no changes); 1 - Errored, 2 - Succeeded; there is a diff]' \
+ '-input=[(true) Ask for input for variables if not directly set.]' \
+ '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
+ '-lock-timeout=[(0s) Duration to retry a state lock.]' \
+ '-no-color[() If specified, output will contain no color.]' \
+ '-out=[(path) Write a plan file to the given path. This can be used as input to the "apply" command.]' \
+ '-parallelism=[(10) Limit the number of concurrent operations.]' \
+ '-refresh=[(true) Update state prior to checking for differences.]' \
+ '-state=[(statefile) Path to a Terraform state file to use to look up Terraform-managed resources. By default it will use the state "terraform.tfstate" if it exists.]:statefile:_files -g "*.tfstate"' \
+ '*-target=[(resource) Resource to target. Operation will be limited to this resource and its dependencies. This flag can be used multiple times.]:target:__statelist' \
+ '*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \
+ '*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"'
+}
+
+__providers() {
+ local -a __providers_cmds
+ __providers_cmds=(
+ 'mirror:Mirrors the provider plugins needed for the current configuration'
+ 'schema:Prints the schemas of the providers used in the configuration'
+ )
+ _describe -t providers "providers commands" __providers_cmds
+
+}
+
+__providers_mirror() {
+ _arguments \
+ '-platform=[(os_arch) Choose which target platform to build a mirror for.]' \
+ "*:target_dir:_files -/"
+}
+
+__providers_schema() {
+ _arguments \
+ '-json[]' \
+ '::'
+}
+
+__refresh() {
+ _arguments \
+ '-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]::backupfile:_files -g "*.backup"' \
+ '-compact-warnings[If Terraform produces any warnings that are not accompanied by errors, show them in a more compact form that includes only the summary messages.]' \
+ '-input=[(true) Ask for input for variables if not directly set.]' \
+ '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
+ '-lock-timeout=[(0s) Duration to retry a state lock.]' \
+ '-no-color[If specified, output will not contain any color.]' \
+ '-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -g "*.tfstate"' \
+ '-state-out=[(path) Path to write state to that is different than "-state". This can be used to preserve the old state.]:statefile:_files -g "*.tfstate"' \
+ '*-target=[(resource) A Resource Address to target. Operation will be limited to this resource and its dependencies. This flag can be used multiple times.]:target:__statelist' \
+ '*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \
+ '*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"'
+}
+
+__show() {
+ _arguments \
+ '-json[If specified, output the Terraform plan or state in a machine-readable form.]' \
+ '-no-color[If specified, output will not contain any color.]'
+}
+
+__state() {
+ local -a __state_cmds
+ __state_cmds=(
+ 'list:List resources in the state'
+ 'mv:Move an item in the state'
+ 'pull:Pull current state and output to stdout'
+ 'push:Update remote state from a local state file'
+ 'replace-provider:Replace provider for resources in the Terraform state'
+ 'rm:Remove instances from the state'
+ 'show:Show a resource in the state'
+ )
+ _describe -t state "state commands" __state_cmds
+}
+
+__state_list() {
+ _arguments \
+ '-state=[(statefile) Path to a Terraform state file to use to look up Terraform-managed resources. By default, Terraform will consult the state of the currently-selected workspace.]' \
+ '-id=[(id) Filters the results to include only instances whose resource types have an attribute named id whose value equals the given id string.]' \
+ "*:address:__statelist"
+}
+
+__state_mv() {
+ _arguments \
+ "-dry-run[If set, prints out what would've been moved but doesn't actually move anything.]" \
+ '-backup=[(PATH) Path where Terraform should write the backup for the original state. This can"t be disabled. If not set, Terraform will write it to the same path as the statefile with a ".backup" extension.]:backupfile:_files -g "*.backup"' \
+ '-backup-out=[(PATH) Path where Terraform should write the backup for the destination state. This can"t be disabled. If not set, Terraform will write it to the same path as the destination state file with a backup extension. This only needs to be specified if -state-out is set to a different path than -state.]:backupfile:_files -g "*.backup"' \
+ "-lock=[(true) Lock the state files when locking is supported.]:lock:(true false)" \
+ "-lock-timeout=[(0s) Duration to retry a state lock.]" \
+ '-state=[(path) Path to the source state file. Defaults to the configured backend, or "terraform.tfstate"]:statefile:_files -g "*.tfstate"' \
+ '-state-out=[(path) Path to the destination state file to write to. If this isn"t specified, the source state file will be used. This can be a new or existing path.]:statefile:_files -g "*.tfstate"' \
+ "::" \
+ ":source:__statelist" \
+ ":destination: "
+}
+
+__state_push() {
+ _arguments \
+ "-force[Write the state even if lineages don't match or the remote serial is higher.]" \
+ '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
+ "-lock-timeout=[(0s) Duration to retry a state lock.]" \
+ "::" \
+ ":destination:_files"
+}
+
+__state_replace_provider() {
+ _arguments \
+ '-auto-approve[Skip interactive approval.]' \
+ '-backup=[(PATH) Path where Terraform should write the backup for the state file. This can"t be disabled. If not set, Terraform will write it to the same path as the state file with a ".backup" extension.]:backupfile:_files -g "*.backup"' \
+ "-lock=[(true) Lock the state files when locking is supported.]:lock:(true false)" \
+ "-lock-timeout=[(0s) Duration to retry a state lock.]" \
+ '-state=[(PATH) Path to the source state file. Defaults to the configured backend, or "terraform.tfstate"]:statefile:_files -g "*.tfstate"' \
+ ":from_provider_fqn:" \
+ ":to_provider_fqn:"
+}
+
+__state_rm() {
+ _arguments \
+ "-dry-run[If set, prints out what would've been removed but doesn't actually remove anything.]" \
+ '-backup=[(PATH) Path where Terraform should write the backup for the original state.]::backupfile:_files -g "*.backup"' \
+ "-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)" \
+ "-lock-timeout=[(0s) Duration to retry a state lock.]" \
+ '-state=[(PATH) Path to the state file to update. Defaults to the current workspace state.]:statefile:_files -g "*.tfstate"' \
+ "*:address:__statelist"
+}
+
+
+__state_show() {
+ _arguments \
+ '-state=[(statefile) Path to a Terraform state file to use to look up Terraform-managed resources. By default it will use the state "terraform.tfstate" if it exists.]:statefile:_files -g "*.tfstate"' \
+ "*:address:__statelist"
+}
+
+__statelist() {
+ compadd $(terraform state list $opt_args[-state])
+}
+
+__taint() {
+ _arguments \
+ '-allow-missing[If specified, the command will succeed (exit code 0) even if the resource is missing.]' \
+ '-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \
+ '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
+ '-lock-timeout=[(0s) Duration to retry a state lock.]' \
+ '-module=[(path) The module path where the resource lives. By default this will be root. Child modules can be specified by names. Ex. "consul" or "consul.vpc" (nested modules).]' \
+ '-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -g "*.tfstate"' \
+ '-state-out=[(path) Path to write updated state file. By default, the "-state" path will be used.]:statefile:_files -g "*.tfstate"' \
+ "*:address:__statelist"
+}
+
+__untaint() {
+ _arguments \
+ '-allow-missing[If specified, the command will succeed (exit code 0) even if the resource is missing.]' \
+ '-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \
+ '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
+ '-lock-timeout=[(0s) Duration to retry a state lock.]' \
+ '-module=[(path) The module path where the resource lives. By default this will be root. Child modules can be specified by names. Ex. "consul" or "consul.vpc" (nested modules).]' \
+ '-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -g "*.tfstate"' \
+ '-state-out=[(path) Path to write updated state file. By default, the "-state" path will be used.]:statefile:_files -g "*.tfstate"'
+}
+
+__validate() {
+ _arguments \
+ '-no-color[If specified, output will not contain any color.]' \
+ '-json[Produce output in a machine-readable JSON format, suitable for use in text editor integrations and other automated systems.]' \
+ ':dir:_files -/'
+}
+
+__version() {
+ _arguments \
+ '-json[Output the version information as a JSON object.]'
+}
+
+__workspace() {
+ local -a __workspace_cmds
+ __workspace_cmds=(
+ 'delete:Delete a workspace'
+ 'list:List Workspaces'
+ 'new:Create a new workspace'
+ 'select:Select a workspace'
+ 'show:Show the name of the current workspace'
+ )
+ _describe -t workspace "workspace commands" __workspace_cmds
+}
+
+_arguments '*:: :->command'
+
+if (( CURRENT == 1 )); then
+ _describe -t commands "terraform command" _terraform_cmds
+ return
+fi
+
+local -a _command_args
+case "$words[1]" in
+ 0.12upgrade)
+ __012upgrade ;;
+ 0.13upgrade)
+ __013upgrade ;;
+ apply)
+ __apply ;;
+ console)
+ __console;;
+ destroy)
+ __destroy ;;
+ fmt)
+ __fmt;;
+ force-unlock)
+ __force_unlock;;
+ get)
+ __get ;;
+ graph)
+ __graph ;;
+ import)
+ __import;;
+ init)
+ __init ;;
+ login)
+ __login ;;
+ logout)
+ __logout ;;
+ output)
+ __output ;;
+ plan)
+ __plan ;;
+ providers)
+ test $CURRENT -lt 3 && __providers
+ [[ $words[2] = "mirror" ]] && __providers_mirror
+ [[ $words[2] = "schema" ]] && __providers_schema
+ ;;
+ refresh)
+ __refresh ;;
+ show)
+ __show ;;
+ state)
+ test $CURRENT -lt 3 && __state
+ [[ $words[2] = "list" ]] && __state_list
+ [[ $words[2] = "mv" ]] && __state_mv
+ [[ $words[2] = "push" ]] && __state_push
+ [[ $words[2] = "replace-provider" ]] && __state_replace_provider
+ [[ $words[2] = "rm" ]] && __state_rm
+ [[ $words[2] = "show" ]] && __state_show
+ ;;
+ taint)
+ __taint ;;
+ untaint)
+ __untaint ;;
+ validate)
+ __validate ;;
+ version)
+ __version ;;
+ workspace)
+ test $CURRENT -lt 3 && __workspace ;;
+esac
diff --git a/plugins/terraform/terraform.plugin.zsh b/plugins/terraform/terraform.plugin.zsh
index eaa1e2e8..ccca5468 100644
--- a/plugins/terraform/terraform.plugin.zsh
+++ b/plugins/terraform/terraform.plugin.zsh
@@ -8,16 +8,19 @@ function tf_prompt_info() {
echo "${ZSH_THEME_TF_PROMPT_PREFIX-[}${workspace:gs/%/%%}${ZSH_THEME_TF_PROMPT_SUFFIX-]}"
}
+function tf_version_prompt_info() {
+ local terraform_version
+ terraform_version=$(terraform --version | head -n 1 | cut -d ' ' -f 2)
+ echo "${ZSH_THEME_TF_VERSION_PROMPT_PREFIX-[}${terraform_version:gs/%/%%}${ZSH_THEME_TF_VERSION_PROMPT_SUFFIX-]}"
+}
+
+
alias tf='terraform'
alias tfa='terraform apply'
+alias tfc='terraform console'
alias tfd='terraform destroy'
alias tff='terraform fmt'
alias tfi='terraform init'
alias tfo='terraform output'
alias tfp='terraform plan'
alias tfv='terraform validate'
-
-if (( $+commands[terraform] )); then
- autoload -U +X bashcompinit && bashcompinit
- complete -o nospace -C terraform terraform
-fi
diff --git a/plugins/tig/tig.plugin.zsh b/plugins/tig/tig.plugin.zsh
index 7e0c530a..5b7d2550 100644
--- a/plugins/tig/tig.plugin.zsh
+++ b/plugins/tig/tig.plugin.zsh
@@ -1,3 +1,5 @@
alias tis='tig status'
alias til='tig log'
alias tib='tig blame -C'
+alias tif='tig reflog'
+alias tia='tig --all'
diff --git a/plugins/tmux/README.md b/plugins/tmux/README.md
index 7348f77c..0f8473da 100644
--- a/plugins/tmux/README.md
+++ b/plugins/tmux/README.md
@@ -28,16 +28,16 @@ The plugin also supports the following:
## Configuration Variables
-| Variable | Description |
-| ----------------------------------- | ----------------------------------------------------------------------------- |
-| `ZSH_TMUX_AUTOSTART` | Automatically starts tmux (default: `false`) |
-| `ZSH_TMUX_AUTOSTART_ONCE` | Autostart only if tmux hasn't been started previously (default: `true`) |
-| `ZSH_TMUX_AUTOCONNECT` | Automatically connect to a previous session if it exits (default: `true`) |
-| `ZSH_TMUX_AUTOQUIT` | Automatically closes terminal once tmux exits (default: `ZSH_TMUX_AUTOSTART`) |
-| `ZSH_TMUX_FIXTERM` | Sets `$TERM` to 256-color term or not based on current terminal support |
-| `ZSH_TMUX_ITERM2` | Sets the `-CC` option for iTerm2 tmux integration (default: `false`) |
-| `ZSH_TMUX_FIXTERM_WITHOUT_256COLOR` | `$TERM` to use for non 256-color terminals (default: `screen`) |
-| `ZSH_TMUX_FIXTERM_WITH_256COLOR` | `$TERM` to use for 256-color terminals (default: `screen-256color` |
-| `ZSH_TMUX_CONFIG` | Set the configuration path (default: `$HOME/.tmux.conf`) |
-| `ZSH_TMUX_UNICODE` | Set `tmux -u` option to support unicode |
-| `ZSH_TMUX_DEFAULT_SESSION_NAME` | Set tmux default session name when autostart is enabled |
+| Variable | Description |
+| ----------------------------------- | ------------------------------------------------------------------------------------------- |
+| `ZSH_TMUX_AUTOSTART` | Automatically starts tmux (default: `false`) |
+| `ZSH_TMUX_AUTOSTART_ONCE` | Autostart only if tmux hasn't been started previously (default: `true`) |
+| `ZSH_TMUX_AUTOCONNECT` | Automatically connect to a previous session if it exits (default: `true`) |
+| `ZSH_TMUX_AUTOQUIT` | Automatically closes terminal once tmux exits (default: `ZSH_TMUX_AUTOSTART`) |
+| `ZSH_TMUX_FIXTERM` | Sets `$TERM` to 256-color term or not based on current terminal support |
+| `ZSH_TMUX_ITERM2` | Sets the `-CC` option for iTerm2 tmux integration (default: `false`) |
+| `ZSH_TMUX_FIXTERM_WITHOUT_256COLOR` | `$TERM` to use for non 256-color terminals (default: `screen`) |
+| `ZSH_TMUX_FIXTERM_WITH_256COLOR` | `$TERM` to use for 256-color terminals (default: `screen-256color` |
+| `ZSH_TMUX_CONFIG` | Set the configuration path (default: `$HOME/.tmux.conf`, `$XDG_CONFIG_HOME/tmux/tmux.conf`) |
+| `ZSH_TMUX_UNICODE` | Set `tmux -u` option to support unicode |
+| `ZSH_TMUX_DEFAULT_SESSION_NAME` | Set tmux default session name when autostart is enabled |
diff --git a/plugins/tmux/tmux.plugin.zsh b/plugins/tmux/tmux.plugin.zsh
index b9bb66d5..6ed91c44 100644
--- a/plugins/tmux/tmux.plugin.zsh
+++ b/plugins/tmux/tmux.plugin.zsh
@@ -26,12 +26,17 @@ fi
# systems without the proper terminfo
: ${ZSH_TMUX_FIXTERM_WITH_256COLOR:=screen-256color}
# Set the configuration path
-: ${ZSH_TMUX_CONFIG:=$HOME/.tmux.conf}
+if [[ -e $HOME/.tmux.conf ]]; then
+ : ${ZSH_TMUX_CONFIG:=$HOME/.tmux.conf}
+elif [[ -e ${XDG_CONFIG_HOME:-$HOME/.config}/tmux/tmux.conf ]]; then
+ : ${ZSH_TMUX_CONFIG:=${XDG_CONFIG_HOME:-$HOME/.config}/tmux/tmux.conf}
+else
+ : ${ZSH_TMUX_CONFIG:=$HOME/.tmux.conf}
+fi
# Set -u option to support unicode
: ${ZSH_TMUX_UNICODE:=false}
# ALIASES
-
alias ta='tmux attach -t'
alias tad='tmux attach -d -t'
alias ts='tmux new-session -s'
@@ -73,7 +78,11 @@ function _zsh_tmux_plugin_run() {
[[ "$ZSH_TMUX_UNICODE" == "true" ]] && tmux_cmd+=(-u)
# Try to connect to an existing session.
- [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach
+ if [[ -n "$ZSH_TMUX_DEFAULT_SESSION_NAME" ]]; then
+ [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach -t $ZSH_TMUX_DEFAULT_SESSION_NAME
+ else
+ [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach
+ fi
# If failed, just run tmux, fixing the TERM variable if requested.
if [[ $? -ne 0 ]]; then
@@ -83,9 +92,9 @@ function _zsh_tmux_plugin_run() {
tmux_cmd+=(-f "$ZSH_TMUX_CONFIG")
fi
if [[ -n "$ZSH_TMUX_DEFAULT_SESSION_NAME" ]]; then
- $tmux_cmd new-session -s $ZSH_TMUX_DEFAULT_SESSION_NAME
+ $tmux_cmd new-session -s $ZSH_TMUX_DEFAULT_SESSION_NAME
else
- $tmux_cmd new-session
+ $tmux_cmd new-session
fi
fi
@@ -100,7 +109,7 @@ compdef _tmux _zsh_tmux_plugin_run
alias tmux=_zsh_tmux_plugin_run
# Autostart if not already in tmux and enabled.
-if [[ -z "$TMUX" && "$ZSH_TMUX_AUTOSTART" == "true" && -z "$INSIDE_EMACS" && -z "$EMACS" && -z "$VIM" ]]; then
+if [[ -z "$TMUX" && "$ZSH_TMUX_AUTOSTART" == "true" && -z "$INSIDE_EMACS" && -z "$EMACS" && -z "$VIM" && -z "$INTELLIJ_ENVIRONMENT_READER" ]]; then
# Actually don't autostart if we already did and multiple autostarts are disabled.
if [[ "$ZSH_TMUX_AUTOSTART_ONCE" == "false" || "$ZSH_TMUX_AUTOSTARTED" != "true" ]]; then
export ZSH_TMUX_AUTOSTARTED=true
diff --git a/plugins/toolbox/README.md b/plugins/toolbox/README.md
index abaca31f..bc04a906 100644
--- a/plugins/toolbox/README.md
+++ b/plugins/toolbox/README.md
@@ -22,4 +22,5 @@ RPROMPT='$(toolbox_prompt_info)'
| Alias | Command | Description |
|-------|----------------------|----------------------------------------|
-| tb | `toolbox enter` | Enters the toolbox environment |
+| tbe | `toolbox enter` | Enters the toolbox environment |
+| tbr | `toolbox run` | Run a command in an existing toolbox |
diff --git a/plugins/toolbox/toolbox.plugin.zsh b/plugins/toolbox/toolbox.plugin.zsh
index d24d6d39..377e498c 100644
--- a/plugins/toolbox/toolbox.plugin.zsh
+++ b/plugins/toolbox/toolbox.plugin.zsh
@@ -2,4 +2,5 @@ function toolbox_prompt_info() {
[[ -f /run/.toolboxenv ]] && echo "⬢"
}
-alias tb="toolbox enter"
+alias tbe="toolbox enter"
+alias tbr="toolbox run"
diff --git a/plugins/ubuntu/README.md b/plugins/ubuntu/README.md
index 2401c102..20f5c65e 100644
--- a/plugins/ubuntu/README.md
+++ b/plugins/ubuntu/README.md
@@ -15,7 +15,7 @@ Commands that use `$APT` will use `apt` if installed or defer to `apt-get` other
| Alias | Command | Description |
|---------|--------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|
| age | `sudo $APT` | Run apt-get with sudo |
-| acse | `apt-cache search` | Search the apt-cache with the specified criteria |
+| acs | `apt-cache search` | Search the apt-cache with the specified criteria |
| acsp | `apt-cache showpkg` | Shows information about the listed packages |
| acp | `apt-cache policy` | Display the package source priorities |
| afs | `apt-file search --regexp` | Perform a regular expression apt-file search |
diff --git a/plugins/ubuntu/ubuntu.plugin.zsh b/plugins/ubuntu/ubuntu.plugin.zsh
index 4d35da2a..7b765a40 100644
--- a/plugins/ubuntu/ubuntu.plugin.zsh
+++ b/plugins/ubuntu/ubuntu.plugin.zsh
@@ -1,6 +1,6 @@
(( $+commands[apt] )) && APT=apt || APT=apt-get
-alias acse='apt-cache search'
+alias acs='apt-cache search'
alias afs='apt-file search --regexp'
diff --git a/plugins/vi-mode/README.md b/plugins/vi-mode/README.md
index 476666bf..821c12ad 100644
--- a/plugins/vi-mode/README.md
+++ b/plugins/vi-mode/README.md
@@ -29,6 +29,8 @@ plugins=(... vi-mode)
VI_MODE_SET_CURSOR=true
```
+ See [Cursor Styles](#cursor-styles) for controlling how the cursor looks in different modes
+
- `MODE_INDICATOR`: controls the string displayed when the shell is in normal mode.
See [Mode indicators](#mode-indicators) for details.
@@ -49,8 +51,42 @@ MODE_INDICATOR="%F{white}+%f"
INSERT_MODE_INDICATOR="%F{yellow}+%f"
```
-You can also use the `vi_mode_prompt_info` function in your prompt, which will display
-this mode indicator.
+### Adding mode indicators to your prompt
+
+`Vi-mode` by default will add mode indicators to `RPROMPT` **unless** that is defined by
+a preceding plugin.
+
+If `PROMPT` or `RPROMPT` is not defined to your liking, you can add mode info manually. The `vi_mode_prompt_info` function is available to insert mode indicator information.
+
+Here are some examples:
+
+```bash
+source $ZSH/oh-my-zsh.sh
+
+PROMPT="$PROMPT\$(vi_mode_prompt_info)"
+RPROMPT="\$(vi_mode_prompt_info)$RPROMPT"
+```
+
+Note the `\$` here, which importantly prevents interpolation at the time of defining, but allows it to be executed for each prompt update event.
+
+## Cursor Styles
+
+You can control the cursor style used in each active vim mode by changing the values of the following variables.
+
+```zsh
+# defaults
+VI_MODE_CURSOR_NORMAL=2
+VI_MODE_CURSOR_VISUAL=6
+VI_MODE_CURSOR_INSERT=6
+VI_MODE_CURSOR_OPPEND=0
+```
+
+- 0, 1 - Blinking block
+- 2 - Solid block
+- 3 - Blinking underline
+- 4 - Solid underline
+- 5 - Blinking line
+- 6 - Solid line
## Key bindings
@@ -108,11 +144,17 @@ NOTE: this used to be bound to `v`. That is now the default (`visual-mode`).
- `c{motion}` : Delete {motion} text and start insert
- `cc` : Delete line and start insert
- `C` : Delete to the end of the line and start insert
+- `P` : Insert the contents of the clipboard before the cursor
+- `p` : Insert the contents of the clipboard after the cursor
- `r{char}` : Replace the character under the cursor with {char}
- `R` : Enter replace mode: Each character replaces existing one
- `x` : Delete `count` characters under and after the cursor
- `X` : Delete `count` characters before the cursor
+NOTE: delete/kill commands (`dd`, `D`, `c{motion}`, `C`, `x`,`X`) and yank commands
+(`y`, `Y`) will copy to the clipboard. Contents can then be put back using paste commands
+(`P`, `p`).
+
## Known issues
### Low `$KEYTIMEOUT`
diff --git a/plugins/vi-mode/vi-mode.plugin.zsh b/plugins/vi-mode/vi-mode.plugin.zsh
index 149d6bbd..d1493e02 100644
--- a/plugins/vi-mode/vi-mode.plugin.zsh
+++ b/plugins/vi-mode/vi-mode.plugin.zsh
@@ -14,6 +14,15 @@ typeset -g VI_MODE_RESET_PROMPT_ON_MODE_CHANGE
# Unset or set to any other value to do the opposite.
typeset -g VI_MODE_SET_CURSOR
+# Control how the cursor appears in the various vim modes. This only applies
+# if $VI_MODE_SET_CURSOR=true.
+#
+# See https://vt100.net/docs/vt510-rm/DECSCUSR for cursor styles
+typeset -g VI_MODE_CURSOR_NORMAL=2
+typeset -g VI_MODE_CURSOR_VISUAL=6
+typeset -g VI_MODE_CURSOR_INSERT=6
+typeset -g VI_MODE_CURSOR_OPPEND=0
+
typeset -g VI_KEYMAP=main
function _vi-mode-set-cursor-shape-for-keymap() {
@@ -22,24 +31,44 @@ function _vi-mode-set-cursor-shape-for-keymap() {
# https://vt100.net/docs/vt510-rm/DECSCUSR
local _shape=0
case "${1:-${VI_KEYMAP:-main}}" in
- main) _shape=6 ;; # vi insert: line
- viins) _shape=6 ;; # vi insert: line
- isearch) _shape=6 ;; # inc search: line
- command) _shape=6 ;; # read a command name
- vicmd) _shape=2 ;; # vi cmd: block
- visual) _shape=2 ;; # vi visual mode: block
- viopp) _shape=0 ;; # vi operation pending: blinking block
+ main) _shape=$VI_MODE_CURSOR_INSERT ;; # vi insert: line
+ viins) _shape=$VI_MODE_CURSOR_INSERT ;; # vi insert: line
+ isearch) _shape=$VI_MODE_CURSOR_INSERT ;; # inc search: line
+ command) _shape=$VI_MODE_CURSOR_INSERT ;; # read a command name
+ vicmd) _shape=$VI_MODE_CURSOR_NORMAL ;; # vi cmd: block
+ visual) _shape=$VI_MODE_CURSOR_VISUAL ;; # vi visual mode: block
+ viopp) _shape=$VI_MODE_CURSOR_OPPEND ;; # vi operation pending: blinking block
*) _shape=0 ;;
esac
printf $'\e[%d q' "${_shape}"
}
+function _visual-mode {
+ typeset -g VI_KEYMAP=visual
+ _vi-mode-set-cursor-shape-for-keymap "$VI_KEYMAP"
+ zle .visual-mode
+}
+zle -N visual-mode _visual-mode
+
+function _vi-mode-should-reset-prompt() {
+ # If $VI_MODE_RESET_PROMPT_ON_MODE_CHANGE is unset (default), dynamically
+ # check whether we're using the prompt to display vi-mode info
+ if [[ -z "${VI_MODE_RESET_PROMPT_ON_MODE_CHANGE:-}" ]]; then
+ [[ "${PS1} ${RPS1}" = *'$(vi_mode_prompt_info)'* ]]
+ return $?
+ fi
+
+ # If $VI_MODE_RESET_PROMPT_ON_MODE_CHANGE was manually set, let's check
+ # if it was specifically set to true or it was disabled with any other value
+ [[ "${VI_MODE_RESET_PROMPT_ON_MODE_CHANGE}" = true ]]
+}
+
# Updates editor information when the keymap changes.
function zle-keymap-select() {
# update keymap variable for the prompt
typeset -g VI_KEYMAP=$KEYMAP
- if [[ "${VI_MODE_RESET_PROMPT_ON_MODE_CHANGE:-}" = true ]]; then
+ if _vi-mode-should-reset-prompt; then
zle reset-prompt
zle -R
fi
@@ -50,10 +79,9 @@ zle -N zle-keymap-select
# These "echoti" statements were originally set in lib/key-bindings.zsh
# Not sure the best way to extend without overriding.
function zle-line-init() {
- local prev_vi_keymap
- prev_vi_keymap="${VI_KEYMAP:-}"
+ local prev_vi_keymap="${VI_KEYMAP:-}"
typeset -g VI_KEYMAP=main
- [[ "$prev_vi_keymap" != 'main' ]] && [[ "${VI_MODE_RESET_PROMPT_ON_MODE_CHANGE:-}" = true ]] && zle reset-prompt
+ [[ "$prev_vi_keymap" != 'main' ]] && _vi-mode-should-reset-prompt && zle reset-prompt
(( ! ${+terminfo[smkx]} )) || echoti smkx
_vi-mode-set-cursor-shape-for-keymap "${VI_KEYMAP}"
}
@@ -119,8 +147,15 @@ function wrap_clipboard_widgets() {
done
}
-wrap_clipboard_widgets copy vi-yank vi-yank-eol vi-backward-kill-word vi-change-whole-line vi-delete vi-delete-char
-wrap_clipboard_widgets paste vi-put-{before,after}
+wrap_clipboard_widgets copy \
+ vi-yank vi-yank-eol vi-yank-whole-line \
+ vi-change vi-change-eol vi-change-whole-line \
+ vi-kill-line vi-kill-eol vi-backward-kill-word \
+ vi-delete vi-delete-char vi-backward-delete-char
+
+wrap_clipboard_widgets paste \
+ vi-put-{before,after}
+
unfunction wrap_clipboard_widgets
# if mode indicator wasn't setup by theme, define default, we'll leave INSERT_MODE_INDICATOR empty by default
@@ -129,13 +164,6 @@ if [[ -z "$MODE_INDICATOR" ]]; then
fi
function vi_mode_prompt_info() {
- # If we're using the prompt to display mode info, and we haven't explicitly
- # disabled "reset prompt on mode change", then set it here.
- #
- # We do that here instead of the `if` statement below because the user may
- # set RPS1/RPROMPT to something else in their custom config.
- : "${VI_MODE_RESET_PROMPT_ON_MODE_CHANGE:=true}"
-
echo "${${VI_KEYMAP/vicmd/$MODE_INDICATOR}/(main|viins)/$INSERT_MODE_INDICATOR}"
}
diff --git a/plugins/watson/README.md b/plugins/watson/README.md
new file mode 100644
index 00000000..ef734ec6
--- /dev/null
+++ b/plugins/watson/README.md
@@ -0,0 +1,9 @@
+# Watson
+
+This plugin provides completion for [Watson](https://tailordev.github.io/Watson/).
+
+To use it add `watson` to the plugins array in your zshrc file.
+
+```zsh
+plugins=(... watson)
+```
diff --git a/plugins/watson/_watson b/plugins/watson/_watson
new file mode 100644
index 00000000..0f599bd6
--- /dev/null
+++ b/plugins/watson/_watson
@@ -0,0 +1,34 @@
+#compdef watson
+
+_watson_completion() {
+ local -a completions
+ local -a completions_with_descriptions
+ local -a response
+ (( ! $+commands[watson] )) && return 1
+
+ response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) _WATSON_COMPLETE=zsh_complete watson)}")
+
+ for type key descr in ${response}; do
+ if [[ "$type" == "plain" ]]; then
+ if [[ "$descr" == "_" ]]; then
+ completions+=("$key")
+ else
+ completions_with_descriptions+=("$key":"$descr")
+ fi
+ elif [[ "$type" == "dir" ]]; then
+ _path_files -/
+ elif [[ "$type" == "file" ]]; then
+ _path_files -f
+ fi
+ done
+
+ if [ -n "$completions_with_descriptions" ]; then
+ _describe -V unsorted completions_with_descriptions -U
+ fi
+
+ if [ -n "$completions" ]; then
+ compadd -U -V unsorted -a completions
+ fi
+}
+
+compdef _watson_completion watson;
diff --git a/plugins/web-search/README.md b/plugins/web-search/README.md
index 0bf9f26a..6e4b4d7b 100644
--- a/plugins/web-search/README.md
+++ b/plugins/web-search/README.md
@@ -12,8 +12,8 @@ plugins=( ... web-search)
You can use the `web-search` plugin in these two forms:
-* `web_search [more terms if you want]`
-* ` [more terms if you want]`
+- `web_search [more terms if you want]`
+- ` [more terms if you want]`
For example, these two are equivalent:
@@ -24,43 +24,42 @@ $ google oh-my-zsh
Available search contexts are:
-| Context | URL |
-| --------------------- | ---------------------------------------- |
-| `bing` | `https://www.bing.com/search?q=` |
-| `google` | `https://www.google.com/search?q=` |
-| `brs` or `brave` | `https://search.brave.com/search?q=` |
-| `yahoo` | `https://search.yahoo.com/search?p=` |
-| `ddg` or `duckduckgo` | `https://www.duckduckgo.com/?q=` |
-| `sp` or `startpage` | `https://www.startpage.com/do/search?q=` |
-| `yandex` | `https://yandex.ru/yandsearch?text=` |
-| `github` | `https://github.com/search?q=` |
-| `baidu` | `https://www.baidu.com/s?wd=` |
-| `ecosia` | `https://www.ecosia.org/search?q=` |
-| `goodreads` | `https://www.goodreads.com/search?q=` |
-| `qwant` | `https://www.qwant.com/?q=` |
-| `givero` | `https://www.givero.com/search?q=` |
-| `stackoverflow` | `https://stackoverflow.com/search?q=` |
-| `wolframalpha` | `https://wolframalpha.com/input?i=` |
-| `archive` | `https://web.archive.org/web/*/` |
-| `scholar` | `https://scholar.google.com/scholar?q=` |
-| `ask` | `https://www.ask.com/web?q=` |
+| Context | URL |
+| --------------------- | ----------------------------------------------- |
+| `bing` | `https://www.bing.com/search?q=` |
+| `google` | `https://www.google.com/search?q=` |
+| `brs` or `brave` | `https://search.brave.com/search?q=` |
+| `yahoo` | `https://search.yahoo.com/search?p=` |
+| `ddg` or `duckduckgo` | `https://www.duckduckgo.com/?q=` |
+| `sp` or `startpage` | `https://www.startpage.com/do/search?q=` |
+| `yandex` | `https://yandex.ru/yandsearch?text=` |
+| `github` | `https://github.com/search?q=` |
+| `baidu` | `https://www.baidu.com/s?wd=` |
+| `ecosia` | `https://www.ecosia.org/search?q=` |
+| `goodreads` | `https://www.goodreads.com/search?q=` |
+| `qwant` | `https://www.qwant.com/?q=` |
+| `givero` | `https://www.givero.com/search?q=` |
+| `stackoverflow` | `https://stackoverflow.com/search?q=` |
+| `wolframalpha` | `https://wolframalpha.com/input?i=` |
+| `archive` | `https://web.archive.org/web/*/` |
+| `scholar` | `https://scholar.google.com/scholar?q=` |
+| `ask` | `https://www.ask.com/web?q=` |
+| `youtube` | `https://www.youtube.com/results?search_query=` |
Also there are aliases for bang-searching DuckDuckGo:
| Context | Bang |
-|-----------|-------|
+| --------- | ----- |
| `wiki` | `!w` |
| `news` | `!n` |
-| `youtube` | `!yt` |
| `map` | `!m` |
| `image` | `!i` |
| `ducky` | `!` |
### Custom search engines
-If you want to add other search contexts to the plugin, you can use the
-`$ZSH_WEB_SEARCH_ENGINES` variable. Set it before Oh My Zsh is sourced,
-with the following format:
+If you want to add other search contexts to the plugin, you can use the `$ZSH_WEB_SEARCH_ENGINES` variable.
+Set it before Oh My Zsh is sourced, with the following format:
```zsh
ZSH_WEB_SEARCH_ENGINES=(
@@ -69,13 +68,12 @@ ZSH_WEB_SEARCH_ENGINES=(
)
```
-where `` is the name of the search context, and `` a URL of
-the same type as the search contexts above. For example, to add `reddit`,
-you'd do:
+where `` is the name of the search context, and `` a URL of the same type as the search contexts
+above. For example, to add `reddit`, you'd do:
```zsh
ZSH_WEB_SEARCH_ENGINES=(reddit "https://www.reddit.com/search/?q=")
```
-These custom search engines will also be turned to aliases, so you can
-both do `web_search reddit ` or `reddit `.
+These custom search engines will also be turned to aliases, so you can both do `web_search reddit ` or
+`reddit `.
diff --git a/plugins/web-search/web-search.plugin.zsh b/plugins/web-search/web-search.plugin.zsh
index ec176dd6..a8848fd9 100644
--- a/plugins/web-search/web-search.plugin.zsh
+++ b/plugins/web-search/web-search.plugin.zsh
@@ -25,6 +25,7 @@ function web_search() {
archive "https://web.archive.org/web/*/"
scholar "https://scholar.google.com/scholar?q="
ask "https://www.ask.com/web?q="
+ youtube "https://www.youtube.com/results?search_query="
)
# check whether the search engine is supported
@@ -66,11 +67,11 @@ alias wolframalpha='web_search wolframalpha'
alias archive='web_search archive'
alias scholar='web_search scholar'
alias ask='web_search ask'
+alias youtube='web_search youtube'
#add your own !bang searches here
alias wiki='web_search duckduckgo \!w'
alias news='web_search duckduckgo \!n'
-alias youtube='web_search duckduckgo \!yt'
alias map='web_search duckduckgo \!m'
alias image='web_search duckduckgo \!i'
alias ducky='web_search duckduckgo \!'
diff --git a/plugins/xcode/xcode.plugin.zsh b/plugins/xcode/xcode.plugin.zsh
index 5d1f901a..f09434e6 100644
--- a/plugins/xcode/xcode.plugin.zsh
+++ b/plugins/xcode/xcode.plugin.zsh
@@ -17,6 +17,13 @@ function xc {
local active_path
active_path=${"$(xcode-select -p)"%%/Contents/Developer*}
echo "Found ${xcode_files[1]}. Opening with ${active_path}"
+
+ # If Xcode is already opened in another Desk, we need this double call
+ # with -g to open the project window in the current Desk and focus it.
+ # See https://github.com/ohmyzsh/ohmyzsh/issues/10384
+ if command pgrep -q "^Xcode"; then
+ open -g -a "$active_path" "${xcode_files[1]}"
+ fi
open -a "$active_path" "${xcode_files[1]}"
}
diff --git a/plugins/yarn/README.md b/plugins/yarn/README.md
index 9c16ff2c..5c7c7f32 100644
--- a/plugins/yarn/README.md
+++ b/plugins/yarn/README.md
@@ -15,7 +15,7 @@ It also adds `yarn` global scripts dir (commonly `~/.yarn/bin`) to the `$PATH`.
To disable this feature, set the following style in your `.zshrc`:
```zsh
-zstyle ':omz:plugins:yarn' global-path false
+zstyle ':omz:plugins:yarn' global-path no
```
## Aliases
@@ -29,6 +29,7 @@ zstyle ':omz:plugins:yarn' global-path false
| yb | `yarn build` | Run the build script defined in `package.json` |
| ycc | `yarn cache clean` | Clean yarn's global cache of packages |
| yd | `yarn dev` | Run the dev script defined in `package.json` |
+| yf | `yarn format` | Run the dev script defined in `package.json` |
| yga | `yarn global add` | Install packages globally on your operating system |
| ygls | `yarn global list` | Lists global installed packages |
| ygrm | `yarn global remove` | Remove global installed packages from your OS |
@@ -54,3 +55,4 @@ zstyle ':omz:plugins:yarn' global-path false
| yv | `yarn version` | Update the version of your package |
| yw | `yarn workspace` | Run a command within a single workspace. |
| yws | `yarn workspaces` | Run a command within all defined workspaces. |
+| yy | `yarn why` | Show why a package has been installed, detailing which other packages depend on it |
diff --git a/plugins/yarn/_yarn b/plugins/yarn/_yarn
index 1237ba67..f15756ff 100644
--- a/plugins/yarn/_yarn
+++ b/plugins/yarn/_yarn
@@ -144,7 +144,7 @@ _yarn_scripts() {
fi
if [[ -n $packageJson ]]; then
- scripts=("${(@f)$(cat ${packageJson} | perl -0777 -MJSON::PP -n -E '%r=%{decode_json($_)->{scripts}}; do{$k=$_;($e=$k)=~s/:/\\:/g; printf "$e:$r{$k}\n"} for sort keys %r')}")
+ scripts=("${(@f)$(cat ${packageJson} | perl -0777 -MJSON::PP -n -E 'binmode(STDOUT, ":encoding(UTF-8)"); %r=%{decode_json($_)->{scripts}}; do{$k=$_;($e=$k)=~s/:/\\:/g; printf "$e:$r{$k}\n"} for sort keys %r')}")
fi
commands=('env' $scripts $binaries)
diff --git a/plugins/yarn/yarn.plugin.zsh b/plugins/yarn/yarn.plugin.zsh
index bcb8661c..157044d7 100644
--- a/plugins/yarn/yarn.plugin.zsh
+++ b/plugins/yarn/yarn.plugin.zsh
@@ -17,6 +17,7 @@ alias yap="yarn add --peer"
alias yb="yarn build"
alias ycc="yarn cache clean"
alias yd="yarn dev"
+alias yf="yarn format"
alias yga="yarn global add"
alias ygls="yarn global list"
alias ygrm="yarn global remove"
@@ -42,3 +43,4 @@ alias yup="yarn upgrade"
alias yv="yarn version"
alias yw="yarn workspace"
alias yws="yarn workspaces"
+alias yy="yarn why"
diff --git a/plugins/z/LICENSE b/plugins/z/LICENSE
index d1cca7ae..6af13b9e 100644
--- a/plugins/z/LICENSE
+++ b/plugins/z/LICENSE
@@ -1,6 +1,6 @@
MIT License
-Copyright (c) 2018-2022 Alexandros Kozak
+Copyright (c) 2018-2023 Alexandros Kozak
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/plugins/z/MANUAL.md b/plugins/z/MANUAL.md
index dcca3c45..d367c302 100644
--- a/plugins/z/MANUAL.md
+++ b/plugins/z/MANUAL.md
@@ -1,5 +1,9 @@
# Zsh-z
+[](https://opensource.org/licenses/MIT)
+
+[](https://github.com/agkozak/zsh-z/stargazers)
+
Zsh-z is a command line tool that allows you to jump quickly to directories that you have visited frequently in the past, or recently -- but most often a combination of the two (a concept known as ["frecency"](https://en.wikipedia.org/wiki/Frecency)). It works by keeping track of when you go to directories and how much time you spend in them. It is then in the position to guess where you want to go when you type a partial string, e.g., `z src` might take you to `~/src/zsh`. `z zsh` might also get you there, and `z c/z` might prove to be even more specific -- it all depends on your habits and how much time you have been using Zsh-z to build up a database. After using Zsh-z for a little while, you will get to where you want to be by typing considerably less than you would need if you were using `cd`.
Zsh-z is a native Zsh port of [rupa/z](https://github.com/rupa/z), a tool written for `bash` and Zsh that uses embedded `awk` scripts to do the heavy lifting. It was quite possibly my most used command line tool for a couple of years. I decided to translate it, `awk` parts and all, into pure Zsh script, to see if by eliminating calls to external tools (`awk`, `sort`, `date`, `sed`, `mv`, `rm`, and `chown`) and reducing forking through subshells I could make it faster. The performance increase is impressive, particularly on systems where forking is slow, such as Cygwin, MSYS2, and WSL. I have found that, in those environments, switching directories using Zsh-z can be over 100% faster than it is using `rupa/z`.
@@ -28,6 +32,10 @@ Zsh-z is a drop-in replacement for `rupa/z` and will, by default, use the same d
Here are the latest features and updates.
+- April 27, 2023
+ + Zsh-z now allows the user to specify the directory-changing command using the `ZSHZ_CD` environment variable (default: `builtin cd`; props @basnijholt).
+- January 27, 2023
+ + If the datafile directory specified by `ZSHZ_DATA` or `_Z_DATA` does not already exist, create it (props @mattmc3).
- June 29, 2022
+ Zsh-z is less likely to leave temporary files sitting around (props @mafredri).
- June 27, 2022
@@ -118,13 +126,19 @@ Add the line
to your `.zshrc`, somewhere above the line that says `antigen apply`.
-### For [oh-my-zsh](http://ohmyz.sh/) users
+### For [Oh My Zsh](http://ohmyz.sh/) users
-Execute the following command:
+Zsh-z is now included as part of Oh My Zsh! As long as you are using an up-to-date installation of Oh My Zsh, you can activate Zsh-z simply by adding `z` to your `plugins` array in your `.zshrc`, e.g.,
+
+ plugins=( git z )
+
+It is as simple as that.
+
+If, however, you prefer always to use the latest version of Zsh-z from the `agkozak/zsh-z` repo, you may install it thus:
git clone https://github.com/agkozak/zsh-z ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-z
-and add `zsh-z` to the line of your `.zshrc` that specifies `plugins=()`, e.g., `plugins=( git zsh-z )`.
+and activate it by adding `zsh-z` to the line of your `.zshrc` that specifies `plugins=()`, e.g., `plugins=( git zsh-z )`.
### For [prezto](https://github.com/sorin-ionescu/prezto) users
@@ -246,6 +260,7 @@ to install `zsh-z`.
Zsh-z has environment variables (they all begin with `ZSHZ_`) that change its behavior if you set them; you can also keep your old ones if you have been using `rupa/z` (they begin with `_Z_`).
* `ZSHZ_CMD` changes the command name (default: `z`)
+* `ZSHZ_CD` specifies the default directory-changing command (default: `builtin cd`)
* `ZSHZ_COMPLETION` can be `'frecent'` (default) or `'legacy'`, depending on whether you want your completion results sorted according to frecency or simply sorted alphabetically
* `ZSHZ_DATA` changes the database file (default: `~/.z`)
* `ZSHZ_ECHO` displays the new path name when changing directories (default: `0`)
diff --git a/plugins/z/_z b/plugins/z/_z
index 9891a52e..a493f35b 100644
--- a/plugins/z/_z
+++ b/plugins/z/_z
@@ -5,7 +5,7 @@
#
# https://github.com/agkozak/zsh-z
#
-# Copyright (c) 2018-2022 Alexandros Kozak
+# Copyright (c) 2018-2023 Alexandros Kozak
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
diff --git a/plugins/z/img/mit_license.svg b/plugins/z/img/mit_license.svg
new file mode 100644
index 00000000..1c02079d
--- /dev/null
+++ b/plugins/z/img/mit_license.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/plugins/z/img/zsh_4.3.11_plus.svg b/plugins/z/img/zsh_4.3.11_plus.svg
new file mode 100644
index 00000000..f46d947d
--- /dev/null
+++ b/plugins/z/img/zsh_4.3.11_plus.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/plugins/z/z.plugin.zsh b/plugins/z/z.plugin.zsh
index 209edfea..60a63062 100644
--- a/plugins/z/z.plugin.zsh
+++ b/plugins/z/z.plugin.zsh
@@ -4,7 +4,7 @@
#
# https://github.com/agkozak/zsh-z
#
-# Copyright (c) 2018-2022 Alexandros Kozak
+# Copyright (c) 2018-2023 Alexandros Kozak
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
@@ -52,6 +52,7 @@
# ZSHZ_CASE -> if `ignore', pattern matching is case-insensitive; if `smart',
# pattern matching is case-insensitive only when the pattern is all
# lowercase
+# ZSHZ_CD -> the directory-changing command that is used (default: builtin cd)
# ZSHZ_CMD -> name of command (default: z)
# ZSHZ_COMPLETION -> completion method (default: 'frecent'; 'legacy' for
# alphabetic sorting)
@@ -129,6 +130,7 @@ is-at-least 5.3.0 && ZSHZ[PRINTV]=1
# Globals:
# ZSHZ
# ZSHZ_CASE
+# ZSHZ_CD
# ZSHZ_COMPLETION
# ZSHZ_DATA
# ZSHZ_DEBUG
@@ -149,9 +151,19 @@ zshz() {
local REPLY
local -a lines
- # Allow the user to specify the datafile name in $ZSHZ_DATA (default: ~/.z)
+ # Allow the user to specify a custom datafile in $ZSHZ_DATA (or legacy $_Z_DATA)
+ local custom_datafile="${ZSHZ_DATA:-$_Z_DATA}"
+
+ # If a datafile was provided as a standalone file without a directory path
+ # print a warning and exit
+ if [[ -n ${custom_datafile} && ${custom_datafile} != */* ]]; then
+ print "ERROR: You configured a custom Zsh-z datafile (${custom_datafile}), but have not specified its directory." >&2
+ exit
+ fi
+
+ # If the user specified a datafile, use that or default to ~/.z
# If the datafile is a symlink, it gets dereferenced
- local datafile=${${ZSHZ_DATA:-${_Z_DATA:-${HOME}/.z}}:A}
+ local datafile=${${custom_datafile:-$HOME/.z}:A}
# If the datafile is a directory, print a warning and exit
if [[ -d $datafile ]]; then
@@ -161,7 +173,7 @@ zshz() {
# Make sure that the datafile exists before attempting to read it or lock it
# for writing
- [[ -f $datafile ]] || touch "$datafile"
+ [[ -f $datafile ]] || { mkdir -p "${datafile:h}" && touch "$datafile" }
# Bail if we don't own the datafile and $ZSHZ_OWNER is not set
[[ -z ${ZSHZ_OWNER:-${_Z_OWNER}} && -f $datafile && ! -O $datafile ]] &&
@@ -620,7 +632,7 @@ zshz() {
*)
# Frecency routine
(( dx = EPOCHSECONDS - time_field ))
- rank=$(( 10000 * rank_field * (3.75/((0.0001 * dx + 1) + 0.25)) ))
+ rank=$(( 10000 * rank_field * (3.75/( (0.0001 * dx + 1) + 0.25)) ))
;;
esac
@@ -756,6 +768,26 @@ zshz() {
[[ $output_format != 'completion' ]] && output_format='list'
}
+ #########################################################
+ # Allow the user to specify directory-changing command
+ # using $ZSHZ_CD (default: builtin cd).
+ #
+ # Globals:
+ # ZSHZ_CD
+ #
+ # Arguments:
+ # $* Path
+ #########################################################
+ zshz_cd() {
+ setopt LOCAL_OPTIONS NO_WARN_CREATE_GLOBAL
+
+ if [[ -z $ZSHZ_CD ]]; then
+ builtin cd "$*"
+ else
+ ${=ZSHZ_CD} "$*"
+ fi
+ }
+
#########################################################
# If $ZSHZ_ECHO == 1, display paths as you jump to them.
# If it is also the case that $ZSHZ_TILDE == 1, display
@@ -773,7 +805,7 @@ zshz() {
if [[ ${@: -1} == /* ]] && (( ! $+opts[-e] && ! $+opts[-l] )); then
# cd if possible; echo the new path if $ZSHZ_ECHO == 1
- [[ -d ${@: -1} ]] && builtin cd ${@: -1} && _zshz_echo && return
+ [[ -d ${@: -1} ]] && zshz_cd ${@: -1} && _zshz_echo && return
fi
# With option -c, make sure query string matches beginning of matches;
@@ -830,12 +862,12 @@ zshz() {
print -- "$cd"
else
# cd if possible; echo the new path if $ZSHZ_ECHO == 1
- [[ -d $cd ]] && builtin cd "$cd" && _zshz_echo
+ [[ -d $cd ]] && zshz_cd "$cd" && _zshz_echo
fi
else
# if $req is a valid path, cd to it; echo the new path if $ZSHZ_ECHO == 1
if ! (( $+opts[-e] || $+opts[-l] )) && [[ -d $req ]]; then
- builtin cd "$req" && _zshz_echo
+ zshz_cd "$req" && _zshz_echo
else
return $ret2
fi
@@ -900,9 +932,9 @@ add-zsh-hook chpwd _zshz_chpwd
############################################################
# Standarized $0 handling
-# (See https://github.com/agkozak/Zsh-100-Commits-Club/blob/master/Zsh-Plugin-Standard.adoc)
-0=${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}
-0=${${(M)0:#/*}:-$PWD/$0}
+# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
+0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
+0="${${(M)0:#/*}:-$PWD/$0}"
(( ${fpath[(ie)${0:A:h}]} <= ${#fpath} )) || fpath=( "${0:A:h}" "${fpath[@]}" )
diff --git a/plugins/zsh-interactive-cd/LICENSE b/plugins/zsh-interactive-cd/LICENSE
new file mode 100644
index 00000000..40b3f8d7
--- /dev/null
+++ b/plugins/zsh-interactive-cd/LICENSE
@@ -0,0 +1,375 @@
+Copyright 2017-2018 Henry Chang
+
+Mozilla Public License Version 2.0
+==================================
+
+1. Definitions
+--------------
+
+1.1. "Contributor"
+ means each individual or legal entity that creates, contributes to
+ the creation of, or owns Covered Software.
+
+1.2. "Contributor Version"
+ means the combination of the Contributions of others (if any) used
+ by a Contributor and that particular Contributor's Contribution.
+
+1.3. "Contribution"
+ means Covered Software of a particular Contributor.
+
+1.4. "Covered Software"
+ means Source Code Form to which the initial Contributor has attached
+ the notice in Exhibit A, the Executable Form of such Source Code
+ Form, and Modifications of such Source Code Form, in each case
+ including portions thereof.
+
+1.5. "Incompatible With Secondary Licenses"
+ means
+
+ (a) that the initial Contributor has attached the notice described
+ in Exhibit B to the Covered Software; or
+
+ (b) that the Covered Software was made available under the terms of
+ version 1.1 or earlier of the License, but not also under the
+ terms of a Secondary License.
+
+1.6. "Executable Form"
+ means any form of the work other than Source Code Form.
+
+1.7. "Larger Work"
+ means a work that combines Covered Software with other material, in
+ a separate file or files, that is not Covered Software.
+
+1.8. "License"
+ means this document.
+
+1.9. "Licensable"
+ means having the right to grant, to the maximum extent possible,
+ whether at the time of the initial grant or subsequently, any and
+ all of the rights conveyed by this License.
+
+1.10. "Modifications"
+ means any of the following:
+
+ (a) any file in Source Code Form that results from an addition to,
+ deletion from, or modification of the contents of Covered
+ Software; or
+
+ (b) any new file in Source Code Form that contains any Covered
+ Software.
+
+1.11. "Patent Claims" of a Contributor
+ means any patent claim(s), including without limitation, method,
+ process, and apparatus claims, in any patent Licensable by such
+ Contributor that would be infringed, but for the grant of the
+ License, by the making, using, selling, offering for sale, having
+ made, import, or transfer of either its Contributions or its
+ Contributor Version.
+
+1.12. "Secondary License"
+ means either the GNU General Public License, Version 2.0, the GNU
+ Lesser General Public License, Version 2.1, the GNU Affero General
+ Public License, Version 3.0, or any later versions of those
+ licenses.
+
+1.13. "Source Code Form"
+ means the form of the work preferred for making modifications.
+
+1.14. "You" (or "Your")
+ means an individual or a legal entity exercising rights under this
+ License. For legal entities, "You" includes any entity that
+ controls, is controlled by, or is under common control with You. For
+ purposes of this definition, "control" means (a) the power, direct
+ or indirect, to cause the direction or management of such entity,
+ whether by contract or otherwise, or (b) ownership of more than
+ fifty percent (50%) of the outstanding shares or beneficial
+ ownership of such entity.
+
+2. License Grants and Conditions
+--------------------------------
+
+2.1. Grants
+
+Each Contributor hereby grants You a world-wide, royalty-free,
+non-exclusive license:
+
+(a) under intellectual property rights (other than patent or trademark)
+ Licensable by such Contributor to use, reproduce, make available,
+ modify, display, perform, distribute, and otherwise exploit its
+ Contributions, either on an unmodified basis, with Modifications, or
+ as part of a Larger Work; and
+
+(b) under Patent Claims of such Contributor to make, use, sell, offer
+ for sale, have made, import, and otherwise transfer either its
+ Contributions or its Contributor Version.
+
+2.2. Effective Date
+
+The licenses granted in Section 2.1 with respect to any Contribution
+become effective for each Contribution on the date the Contributor first
+distributes such Contribution.
+
+2.3. Limitations on Grant Scope
+
+The licenses granted in this Section 2 are the only rights granted under
+this License. No additional rights or licenses will be implied from the
+distribution or licensing of Covered Software under this License.
+Notwithstanding Section 2.1(b) above, no patent license is granted by a
+Contributor:
+
+(a) for any code that a Contributor has removed from Covered Software;
+ or
+
+(b) for infringements caused by: (i) Your and any other third party's
+ modifications of Covered Software, or (ii) the combination of its
+ Contributions with other software (except as part of its Contributor
+ Version); or
+
+(c) under Patent Claims infringed by Covered Software in the absence of
+ its Contributions.
+
+This License does not grant any rights in the trademarks, service marks,
+or logos of any Contributor (except as may be necessary to comply with
+the notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+No Contributor makes additional grants as a result of Your choice to
+distribute the Covered Software under a subsequent version of this
+License (see Section 10.2) or under the terms of a Secondary License (if
+permitted under the terms of Section 3.3).
+
+2.5. Representation
+
+Each Contributor represents that the Contributor believes its
+Contributions are its original creation(s) or it has sufficient rights
+to grant the rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+This License is not intended to limit any rights You have under
+applicable copyright doctrines of fair use, fair dealing, or other
+equivalents.
+
+2.7. Conditions
+
+Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
+in Section 2.1.
+
+3. Responsibilities
+-------------------
+
+3.1. Distribution of Source Form
+
+All distribution of Covered Software in Source Code Form, including any
+Modifications that You create or to which You contribute, must be under
+the terms of this License. You must inform recipients that the Source
+Code Form of the Covered Software is governed by the terms of this
+License, and how they can obtain a copy of this License. You may not
+attempt to alter or restrict the recipients' rights in the Source Code
+Form.
+
+3.2. Distribution of Executable Form
+
+If You distribute Covered Software in Executable Form then:
+
+(a) such Covered Software must also be made available in Source Code
+ Form, as described in Section 3.1, and You must inform recipients of
+ the Executable Form how they can obtain a copy of such Source Code
+ Form by reasonable means in a timely manner, at a charge no more
+ than the cost of distribution to the recipient; and
+
+(b) You may distribute such Executable Form under the terms of this
+ License, or sublicense it under different terms, provided that the
+ license for the Executable Form does not attempt to limit or alter
+ the recipients' rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+You may create and distribute a Larger Work under terms of Your choice,
+provided that You also comply with the requirements of this License for
+the Covered Software. If the Larger Work is a combination of Covered
+Software with a work governed by one or more Secondary Licenses, and the
+Covered Software is not Incompatible With Secondary Licenses, this
+License permits You to additionally distribute such Covered Software
+under the terms of such Secondary License(s), so that the recipient of
+the Larger Work may, at their option, further distribute the Covered
+Software under the terms of either this License or such Secondary
+License(s).
+
+3.4. Notices
+
+You may not remove or alter the substance of any license notices
+(including copyright notices, patent notices, disclaimers of warranty,
+or limitations of liability) contained within the Source Code Form of
+the Covered Software, except that You may alter any license notices to
+the extent required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+You may choose to offer, and to charge a fee for, warranty, support,
+indemnity or liability obligations to one or more recipients of Covered
+Software. However, You may do so only on Your own behalf, and not on
+behalf of any Contributor. You must make it absolutely clear that any
+such warranty, support, indemnity, or liability obligation is offered by
+You alone, and You hereby agree to indemnify every Contributor for any
+liability incurred by such Contributor as a result of warranty, support,
+indemnity or liability terms You offer. You may include additional
+disclaimers of warranty and limitations of liability specific to any
+jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+---------------------------------------------------
+
+If it is impossible for You to comply with any of the terms of this
+License with respect to some or all of the Covered Software due to
+statute, judicial order, or regulation then You must: (a) comply with
+the terms of this License to the maximum extent possible; and (b)
+describe the limitations and the code they affect. Such description must
+be placed in a text file included with all distributions of the Covered
+Software under this License. Except to the extent prohibited by statute
+or regulation, such description must be sufficiently detailed for a
+recipient of ordinary skill to be able to understand it.
+
+5. Termination
+--------------
+
+5.1. The rights granted under this License will terminate automatically
+if You fail to comply with any of its terms. However, if You become
+compliant, then the rights granted under this License from a particular
+Contributor are reinstated (a) provisionally, unless and until such
+Contributor explicitly and finally terminates Your grants, and (b) on an
+ongoing basis, if such Contributor fails to notify You of the
+non-compliance by some reasonable means prior to 60 days after You have
+come back into compliance. Moreover, Your grants from a particular
+Contributor are reinstated on an ongoing basis if such Contributor
+notifies You of the non-compliance by some reasonable means, this is the
+first time You have received notice of non-compliance with this License
+from such Contributor, and You become compliant prior to 30 days after
+Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+infringement claim (excluding declaratory judgment actions,
+counter-claims, and cross-claims) alleging that a Contributor Version
+directly or indirectly infringes any patent, then the rights granted to
+You by any and all Contributors for the Covered Software under Section
+2.1 of this License shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all
+end user license agreements (excluding distributors and resellers) which
+have been validly granted by You or Your distributors under this License
+prior to termination shall survive termination.
+
+************************************************************************
+* *
+* 6. Disclaimer of Warranty *
+* ------------------------- *
+* *
+* Covered Software is provided under this License on an "as is" *
+* basis, without warranty of any kind, either expressed, implied, or *
+* statutory, including, without limitation, warranties that the *
+* Covered Software is free of defects, merchantable, fit for a *
+* particular purpose or non-infringing. The entire risk as to the *
+* quality and performance of the Covered Software is with You. *
+* Should any Covered Software prove defective in any respect, You *
+* (not any Contributor) assume the cost of any necessary servicing, *
+* repair, or correction. This disclaimer of warranty constitutes an *
+* essential part of this License. No use of any Covered Software is *
+* authorized under this License except under this disclaimer. *
+* *
+************************************************************************
+
+************************************************************************
+* *
+* 7. Limitation of Liability *
+* -------------------------- *
+* *
+* Under no circumstances and under no legal theory, whether tort *
+* (including negligence), contract, or otherwise, shall any *
+* Contributor, or anyone who distributes Covered Software as *
+* permitted above, be liable to You for any direct, indirect, *
+* special, incidental, or consequential damages of any character *
+* including, without limitation, damages for lost profits, loss of *
+* goodwill, work stoppage, computer failure or malfunction, or any *
+* and all other commercial damages or losses, even if such party *
+* shall have been informed of the possibility of such damages. This *
+* limitation of liability shall not apply to liability for death or *
+* personal injury resulting from such party's negligence to the *
+* extent applicable law prohibits such limitation. Some *
+* jurisdictions do not allow the exclusion or limitation of *
+* incidental or consequential damages, so this exclusion and *
+* limitation may not apply to You. *
+* *
+************************************************************************
+
+8. Litigation
+-------------
+
+Any litigation relating to this License may be brought only in the
+courts of a jurisdiction where the defendant maintains its principal
+place of business and such litigation shall be governed by laws of that
+jurisdiction, without reference to its conflict-of-law provisions.
+Nothing in this Section shall prevent a party's ability to bring
+cross-claims or counter-claims.
+
+9. Miscellaneous
+----------------
+
+This License represents the complete agreement concerning the subject
+matter hereof. If any provision of this License is held to be
+unenforceable, such provision shall be reformed only to the extent
+necessary to make it enforceable. Any law or regulation which provides
+that the language of a contract shall be construed against the drafter
+shall not be used to construe this License against a Contributor.
+
+10. Versions of the License
+---------------------------
+
+10.1. New Versions
+
+Mozilla Foundation is the license steward. Except as provided in Section
+10.3, no one other than the license steward has the right to modify or
+publish new versions of this License. Each version will be given a
+distinguishing version number.
+
+10.2. Effect of New Versions
+
+You may distribute the Covered Software under the terms of the version
+of the License under which You originally received the Covered Software,
+or under the terms of any subsequent version published by the license
+steward.
+
+10.3. Modified Versions
+
+If you create software not governed by this License, and you want to
+create a new license for such software, you may create and use a
+modified version of this License if you rename the license and remove
+any references to the name of the license steward (except to note that
+such modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary
+Licenses
+
+If You choose to distribute Source Code Form that is Incompatible With
+Secondary Licenses under the terms of this version of the License, the
+notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+-------------------------------------------
+
+ This Source Code Form is subject to the terms of the Mozilla Public
+ License, v. 2.0. If a copy of the MPL was not distributed with this
+ file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular
+file, then You may include the notice in a location (such as a LICENSE
+file in a relevant directory) where a recipient would be likely to look
+for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - "Incompatible With Secondary Licenses" Notice
+---------------------------------------------------------
+
+ This Source Code Form is "Incompatible With Secondary Licenses", as
+ defined by the Mozilla Public License, v. 2.0.
diff --git a/plugins/zsh-interactive-cd/README.md b/plugins/zsh-interactive-cd/README.md
index c8337fbc..4bffbf04 100644
--- a/plugins/zsh-interactive-cd/README.md
+++ b/plugins/zsh-interactive-cd/README.md
@@ -1,23 +1,15 @@
# zsh-interactive-cd
-This plugin adds a fish-like interactive tab completion for the `cd` command.
+## Demo
-To use it, add `zsh-interactive-cd` to the plugins array of your zshrc file:
-```zsh
-plugins=(... zsh-interactive-cd)
-```
+
-
+## Installation
+
+1. Install [fzf](https://github.com/junegunn/fzf) by following its [installation instruction](https://github.com/junegunn/fzf#installation).
+
+2. Source `zsh-interactive-cd.plugin.zsh` in `.zshrc`.
## Usage
Press tab for completion as usual, it'll launch fzf automatically. Check fzf’s [readme](https://github.com/junegunn/fzf#search-syntax) for more search syntax usage.
-
-## Requirements
-
-This plugin requires [fzf](https://github.com/junegunn/fzf). Install it by following
-its [installation instructions](https://github.com/junegunn/fzf#installation).
-
-## Author
-
-[Henry Chang](https://github.com/changyuheng)
diff --git a/plugins/zsh-interactive-cd/demo.gif b/plugins/zsh-interactive-cd/demo.gif
new file mode 100644
index 00000000..3568ecf9
Binary files /dev/null and b/plugins/zsh-interactive-cd/demo.gif differ
diff --git a/plugins/zsh-interactive-cd/zsh-interactive-cd.plugin.zsh b/plugins/zsh-interactive-cd/zsh-interactive-cd.plugin.zsh
index b0520c23..0ae9d50a 100644
--- a/plugins/zsh-interactive-cd/zsh-interactive-cd.plugin.zsh
+++ b/plugins/zsh-interactive-cd/zsh-interactive-cd.plugin.zsh
@@ -1,4 +1,10 @@
-# Copyright (c) 2017 Henry Chang
+#!/usr/bin/env zsh
+#
+# Copyright 2017-2018 Henry Chang
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
__zic_fzf_prog() {
[ -n "$TMUX_PANE" ] && [ "${FZF_TMUX:-0}" != 0 ] && [ ${LINES:-40} -gt 15 ] \
@@ -17,7 +23,7 @@ __zic_matched_subdir_list() {
length=0
fi
find -L "$dir" -mindepth 1 -maxdepth 1 -type d 2>/dev/null \
- | cut -b $(( ${length} + 2 ))- | sed '/^$/d' | while read -r line; do
+ | cut -b $(( ${length} + 2 ))- | command sed '/^$/d' | while read -r line; do
if [[ "${line[1]}" == "." ]]; then
continue
fi
@@ -32,13 +38,19 @@ __zic_matched_subdir_list() {
seg=$(basename -- "$1")
starts_with_dir=$( \
find -L "$dir" -mindepth 1 -maxdepth 1 -type d \
- 2>/dev/null | cut -b $(( ${length} + 2 ))- | sed '/^$/d' \
+ 2>/dev/null | cut -b $(( ${length} + 2 ))- | command sed '/^$/d' \
| while read -r line; do
if [[ "${seg[1]}" != "." && "${line[1]}" == "." ]]; then
continue
fi
- if [[ "$line" == "$seg"* ]]; then
- echo "$line"
+ if [ "$zic_case_insensitive" = "true" ]; then
+ if [[ "$line:u" == "$seg:u"* ]]; then
+ echo "$line"
+ fi
+ else
+ if [[ "$line" == "$seg"* ]]; then
+ echo "$line"
+ fi
fi
done
)
@@ -46,19 +58,36 @@ __zic_matched_subdir_list() {
echo "$starts_with_dir"
else
find -L "$dir" -mindepth 1 -maxdepth 1 -type d \
- 2>/dev/null | cut -b $(( ${length} + 2 ))- | sed '/^$/d' \
+ 2>/dev/null | cut -b $(( ${length} + 2 ))- | command sed '/^$/d' \
| while read -r line; do
if [[ "${seg[1]}" != "." && "${line[1]}" == "." ]]; then
continue
fi
- if [[ "$line" == *"$seg"* ]]; then
- echo "$line"
+ if [ "$zic_case_insensitive" = "true" ]; then
+ if [[ "$line:u" == *"$seg:u"* ]]; then
+ echo "$line"
+ fi
+ else
+ if [[ "$line" == *"$seg"* ]]; then
+ echo "$line"
+ fi
fi
done
fi
fi
}
+__zic_fzf_bindings() {
+ autoload is-at-least
+ fzf=$(__zic_fzf_prog)
+
+ if $(is-at-least '0.21.0' $(${=fzf} --version)); then
+ echo 'shift-tab:up,tab:down,bspace:backward-delete-char/eof'
+ else
+ echo 'shift-tab:up,tab:down'
+ fi
+}
+
_zic_list_generator() {
__zic_matched_subdir_list "${(Q)@[-1]}" | sort
}
@@ -75,6 +104,7 @@ _zic_complete() {
fi
fzf=$(__zic_fzf_prog)
+ fzf_bindings=$(__zic_fzf_bindings)
if [ $(echo $l | wc -l) -eq 1 ]; then
matches=${(q)l}
@@ -82,7 +112,7 @@ _zic_complete() {
matches=$(echo $l \
| FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} \
--reverse $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS \
- --bind 'shift-tab:up,tab:down'" ${=fzf} \
+ --bind '${fzf_bindings}'" ${=fzf} \
| while read -r item; do
echo -n "${(q)item} "
done)
@@ -144,5 +174,7 @@ zic-completion() {
}
zle -N zic-completion
-bindkey -M emacs '^I' zic-completion
-bindkey -M viins '^I' zic-completion
+if [ -z $zic_custom_binding ]; then
+ zic_custom_binding='^I'
+fi
+bindkey "${zic_custom_binding}" zic-completion
diff --git a/plugins/zsh-navigation-tools/n-list b/plugins/zsh-navigation-tools/n-list
index f25db8f6..a852b083 100644
--- a/plugins/zsh-navigation-tools/n-list
+++ b/plugins/zsh-navigation-tools/n-list
@@ -467,7 +467,7 @@ while (( 1 )); do
elif [ -n "$keypad" ]; then
final_key="$keypad"
else
- _nlist_status_msg "Inproper input detected"
+ _nlist_status_msg "Improper input detected"
zcurses refresh main inner
fi
diff --git a/themes/af-magic.zsh-theme b/themes/af-magic.zsh-theme
index 2ef9b02d..70549d01 100644
--- a/themes/af-magic.zsh-theme
+++ b/themes/af-magic.zsh-theme
@@ -6,11 +6,12 @@
# dashed separator size
function afmagic_dashes {
# check either virtualenv or condaenv variables
- local python_env="${VIRTUAL_ENV:-$CONDA_DEFAULT_ENV}"
+ local python_env_dir="${VIRTUAL_ENV:-$CONDA_DEFAULT_ENV}"
+ local python_env="${python_env_dir##*/}"
# if there is a python virtual environment and it is displayed in
# the prompt, account for it when returning the number of dashes
- if [[ -n "$python_env" && "$PS1" = \(* ]]; then
+ if [[ -n "$python_env" && "$PS1" = *\(${python_env}\)* ]]; then
echo $(( COLUMNS - ${#python_env} - 3 ))
else
echo $COLUMNS
diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme
index 5f4efe81..aa274a5b 100644
--- a/themes/agnoster.zsh-theme
+++ b/themes/agnoster.zsh-theme
@@ -109,13 +109,26 @@ prompt_git() {
if [[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]]; then
repo_path=$(git rev-parse --git-dir 2>/dev/null)
dirty=$(parse_git_dirty)
- ref=$(git symbolic-ref HEAD 2> /dev/null) || ref="➦ $(git rev-parse --short HEAD 2> /dev/null)"
+ ref=$(git symbolic-ref HEAD 2> /dev/null) || \
+ ref="◈ $(git describe --exact-match --tags HEAD 2> /dev/null)" || \
+ ref="➦ $(git rev-parse --short HEAD 2> /dev/null)"
if [[ -n $dirty ]]; then
prompt_segment yellow black
else
prompt_segment green $CURRENT_FG
fi
+ local ahead behind
+ ahead=$(git log --oneline @{upstream}.. 2>/dev/null)
+ behind=$(git log --oneline ..@{upstream} 2>/dev/null)
+ if [[ -n "$ahead" ]] && [[ -n "$behind" ]]; then
+ PL_BRANCH_CHAR=$'\u21c5'
+ elif [[ -n "$ahead" ]]; then
+ PL_BRANCH_CHAR=$'\u21b1'
+ elif [[ -n "$behind" ]]; then
+ PL_BRANCH_CHAR=$'\u21b0'
+ fi
+
if [[ -e "${repo_path}/BISECT_LOG" ]]; then
mode=" "
elif [[ -e "${repo_path}/MERGE_HEAD" ]]; then
diff --git a/themes/amuse.zsh-theme b/themes/amuse.zsh-theme
index 3f7ec0bc..d787fdaa 100644
--- a/themes/amuse.zsh-theme
+++ b/themes/amuse.zsh-theme
@@ -11,8 +11,14 @@ ZSH_THEME_RUBY_PROMPT_PREFIX="%{$fg_bold[red]%}‹"
ZSH_THEME_RUBY_PROMPT_SUFFIX="›%{$reset_color%}"
PROMPT='
-%{$fg_bold[green]%}%~%{$reset_color%}$(git_prompt_info) ⌚ %{$fg_bold[red]%}%*%{$reset_color%}
+%{$fg_bold[green]%}%~%{$reset_color%}$(git_prompt_info)$(virtualenv_prompt_info) ⌚ %{$fg_bold[red]%}%*%{$reset_color%}
$ '
RPROMPT='$(ruby_prompt_info)'
+VIRTUAL_ENV_DISABLE_PROMPT=0
+ZSH_THEME_VIRTUAL_ENV_PROMPT_PREFIX=" %{$fg[green]%}🐍"
+ZSH_THEME_VIRTUAL_ENV_PROMPT_SUFFIX="%{$reset_color%}"
+ZSH_THEME_VIRTUALENV_PREFIX=$ZSH_THEME_VIRTUAL_ENV_PROMPT_PREFIX
+ZSH_THEME_VIRTUALENV_SUFFIX=$ZSH_THEME_VIRTUAL_ENV_PROMPT_SUFFIX
+
diff --git a/themes/avit.zsh-theme b/themes/avit.zsh-theme
index f90ba331..20627446 100644
--- a/themes/avit.zsh-theme
+++ b/themes/avit.zsh-theme
@@ -11,7 +11,12 @@ $(_user_host)${_current_dir} $(git_prompt_info) $(ruby_prompt_info)
PROMPT2='%{%(!.${fg[red]}.${fg[white]})%}◀%{$reset_color%} '
-RPROMPT='$(vi_mode_prompt_info)%{$(echotc UP 1)%}$(_git_time_since_commit) $(git_prompt_status) ${_return_status}%{$(echotc DO 1)%}'
+__RPROMPT='$(vi_mode_prompt_info)%{$(echotc UP 1)%}$(_git_time_since_commit) $(git_prompt_status) ${_return_status}%{$(echotc DO 1)%}'
+if [[ -z $RPROMPT ]]; then
+ RPROMPT=$__RPROMPT
+else
+ RPROMPT="${RPROMPT} ${__RPROMPT}"
+fi
function _user_host() {
local me
@@ -82,4 +87,4 @@ ZSH_THEME_GIT_TIME_SINCE_COMMIT_NEUTRAL="%{$fg[white]%}"
# LS colors, made with https://geoff.greer.fm/lscolors/
export LSCOLORS="exfxcxdxbxegedabagacad"
export LS_COLORS='di=34;40:ln=35;40:so=32;40:pi=33;40:ex=31;40:bd=34;46:cd=34;43:su=0;41:sg=0;46:tw=0;42:ow=0;43:'
-export GREP_COLOR='1;33'
+export GREP_COLORS='mt=1;33'
diff --git a/themes/bureau.zsh-theme b/themes/bureau.zsh-theme
index 698aa2ff..e87a594c 100644
--- a/themes/bureau.zsh-theme
+++ b/themes/bureau.zsh-theme
@@ -15,6 +15,7 @@ ZSH_THEME_GIT_PROMPT_BEHIND="%{$fg[magenta]%}▾%{$reset_color%}"
ZSH_THEME_GIT_PROMPT_STAGED="%{$fg_bold[green]%}●%{$reset_color%}"
ZSH_THEME_GIT_PROMPT_UNSTAGED="%{$fg_bold[yellow]%}●%{$reset_color%}"
ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg_bold[red]%}●%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_STASHED="(%{$fg_bold[blue]%}✹%{$reset_color%})"
bureau_git_info () {
local ref
@@ -67,6 +68,12 @@ bureau_git_status() {
}
bureau_git_prompt() {
+ # ignore non git folders and hidden repos (adapted from lib/git.zsh)
+ if ! command git rev-parse --git-dir &> /dev/null \
+ || [[ "$(command git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then
+ return
+ fi
+
# check git information
local gitinfo=$(bureau_git_info)
if [[ -z "$gitinfo" ]]; then
diff --git a/themes/fino-time.zsh-theme b/themes/fino-time.zsh-theme
index c7e2d965..3f9360ac 100644
--- a/themes/fino-time.zsh-theme
+++ b/themes/fino-time.zsh-theme
@@ -12,6 +12,7 @@
# Also borrowing from http://stevelosh.com/blog/2010/02/my-extravagant-zsh-prompt/
function virtualenv_info {
+ [ $CONDA_DEFAULT_ENV ] && echo "($CONDA_DEFAULT_ENV) "
[ $VIRTUAL_ENV ] && echo '('`basename $VIRTUAL_ENV`') '
}
diff --git a/themes/gallois.zsh-theme b/themes/gallois.zsh-theme
index bb97bfb1..3fc34907 100644
--- a/themes/gallois.zsh-theme
+++ b/themes/gallois.zsh-theme
@@ -1,24 +1,140 @@
# Depends on the git plugin for work_in_progress()
(( $+functions[work_in_progress] )) || work_in_progress() {}
-ZSH_THEME_GIT_PROMPT_PREFIX="%{$reset_color%}%{$fg[green]%}["
-ZSH_THEME_GIT_PROMPT_SUFFIX="]%{$reset_color%}"
-ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}*%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[cyan]%}[%{$fg[green]%}"
+ZSH_THEME_GIT_PROMPT_SUFFIX="%{$fg[cyan]%}]"
+ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}"
ZSH_THEME_GIT_PROMPT_CLEAN=""
# Customized git status, oh-my-zsh currently does not allow render dirty status before branch
git_custom_status() {
local branch=$(git_current_branch)
[[ -n "$branch" ]] || return 0
- echo "$(parse_git_dirty)\
-%{${fg_bold[yellow]}%}$(work_in_progress)%{$reset_color%}\
-${ZSH_THEME_GIT_PROMPT_PREFIX}${branch}${ZSH_THEME_GIT_PROMPT_SUFFIX}"
+ print "%{${fg_bold[yellow]}%}$(work_in_progress)%{$reset_color%}\
+${ZSH_THEME_GIT_PROMPT_PREFIX}$(parse_git_dirty)${branch}\
+${ZSH_THEME_GIT_PROMPT_SUFFIX}"
+}
+autoload -U colors && colors
+
+#export VCS_PROMPT=hg_prompt_info
+export VCS_PROMPT=git_custom_status
+
+base_prompt="%{$fg[cyan]%}[%~% ]%(?.%{$fg[green]%}.%{$fg[red]%})%B$%b "
+custom_prompt=""
+last_run_time=""
+last_vcs_info=""
+
+
+function pipestatus_parse {
+ PIPESTATUS="$pipestatus"
+ ERROR=0
+ for i in "${(z)PIPESTATUS}"; do
+ if [[ "$i" -ne 0 ]]; then
+ ERROR=1
+ fi
+ done
+
+ if [[ "$ERROR" -ne 0 ]]; then
+ print "[%{$fg[red]%}$PIPESTATUS%{$fg[cyan]%}]"
+ fi
}
-# RVM component of prompt
-ZSH_THEME_RUBY_PROMPT_PREFIX="%{$fg[red]%}["
-ZSH_THEME_RUBY_PROMPT_SUFFIX="]%{$reset_color%}"
# Combine it all into a final right-side prompt
-RPS1="\$(git_custom_status)\$(ruby_prompt_info)${RPS1:+ $RPS1}"
PROMPT='%{$fg[cyan]%}[%~% ]%(?.%{$fg[green]%}.%{$fg[red]%})%B$%b '
+function preexec() {
+ last_run_time=$(perl -MTime::HiRes=time -e 'printf "%.9f\n", time')
+}
+
+function duration() {
+ local duration
+ local now=$(perl -MTime::HiRes=time -e 'printf "%.9f\n", time')
+ local last=$1
+ local last_split=("${(@s/./)last}")
+ local now_split=("${(@s/./)now}")
+ local T=$((now_split[1] - last_split[1]))
+ local D=$((T/60/60/24))
+ local H=$((T/60/60%24))
+ local M=$((T/60%60))
+ local S=$((T%60))
+ local s=$(((now_split[2] - last_split[2]) / 1000000000.))
+ local m=$(((now_split[2] - last_split[2]) / 1000000.))
+
+ (( $D > 0 )) && duration+="${D}d"
+ (( $H > 0 )) && duration+="${H}h"
+ (( $M > 0 )) && duration+="${M}m"
+
+ if [[ $S -le 0 ]]; then
+ printf "%ims" "$m"
+ else
+ if ! [[ -z $duration ]] && printf "%s" "$duration"
+ local sec_milli=$((S + s))
+ printf "%.3fs" "$sec_milli"
+ fi
+}
+
+function precmd() {
+ RETVAL=$(pipestatus_parse)
+ local info=""
+
+ if [ ! -z "$last_run_time" ]; then
+ local elapsed=$(duration $last_run_time)
+ last_run_time=$(print $last_run_time | tr -d ".")
+ if [ $(( $(perl -MTime::HiRes=time -e 'printf "%.9f\n", time' | tr -d ".") - $last_run_time )) -gt $(( 120 * 1000 * 1000 * 1000 )) ]; then
+ local elapsed_color="%{$fg[magenta]%}"
+ elif [ $(( $(perl -MTime::HiRes=time -e 'printf "%.9f\n", time' | tr -d ".") - $last_run_time )) -gt $(( 60 * 1000 * 1000 * 1000 )) ]; then
+ local elapsed_color="%{$fg[red]%}"
+ elif [ $(( $(perl -MTime::HiRes=time -e 'printf "%.9f\n", time' | tr -d ".") - $last_run_time )) -gt $(( 10 * 1000 * 1000 * 1000 )) ]; then
+ local elapsed_color="%{$fg[yellow]%}"
+ else
+ local elapsed_color="%{$fg[green]%}"
+ fi
+ info=$(printf "%s%s%s%s%s" "%{$fg[cyan]%}[" "$elapsed_color" "$elapsed" "%{$fg[cyan]%}]" "$RETVAL")
+ unset last_run_time
+ fi
+
+ if [ -z "$info" -a ! -z "$last_vcs_info" ]; then
+ custom_prompt="$last_vcs_info$base_prompt"
+ return;
+ fi
+
+ if (( ${+VCS_PROMPT} )); then
+ last_vcs_info=$($VCS_PROMPT)
+ if [ ! -z "$last_vcs_info" ]; then
+ [ -z "$info" ] && info=$last_vcs_info || info="$info$last_vcs_info"
+ fi
+ fi
+
+ [ -z "$info" ] && custom_prompt="$base_prompt" || custom_prompt="$info$base_prompt"
+}
+
+function hg_prompt_info() {
+ unset output info parts branch_parts branch
+
+ local output=""
+ if ! output="$(hg status 2> /dev/null)"; then
+ return
+ fi
+
+ local info=$(hg log -l1 --template '{author}:{node|short}:{remotenames}:{phabdiff}')
+ local parts=(${(@s/:/)info})
+ local branch_parts=(${(@s,/,)parts[3]})
+ local branch=${branch_parts[-1]}
+ [ ! -z "${parts[3]}" ] && [[ "${parts[1]}" =~ "$USER@" ]] && branch=${parts[3]}
+ [ -z "${parts[3]}" ] && branch=${parts[2]}
+
+ if [[ ! -z "$output" ]]; then
+ local color="%{$fg[red]%}"
+ elif [[ "${branch}" == "master" || "${branch}" == "warm" ]]; then
+ local color="%{$fg[yellow]%}"
+ else
+ local color="%{$fg[green]%}"
+ fi
+
+ print "%{$fg[cyan]%}[${color}${branch}%{$fg[cyan]%}]"
+}
+
+setopt PROMPT_SUBST
+PROMPT='$custom_prompt'
+
+
diff --git a/themes/gnzh.zsh-theme b/themes/gnzh.zsh-theme
index 1e6c4e93..ca62320e 100644
--- a/themes/gnzh.zsh-theme
+++ b/themes/gnzh.zsh-theme
@@ -21,7 +21,7 @@ fi
if [[ -n "$SSH_CLIENT" || -n "$SSH2_CLIENT" ]]; then
PR_HOST='%F{red}%M%f' # SSH
else
- PR_HOST='%F{green}%M%f' # no SSH
+ PR_HOST='%F{green}%m%f' # no SSH
fi
diff --git a/themes/half-life.zsh-theme b/themes/half-life.zsh-theme
index c4d78512..2ad84ac8 100644
--- a/themes/half-life.zsh-theme
+++ b/themes/half-life.zsh-theme
@@ -89,5 +89,9 @@ ZSH_THEME_RUBY_PROMPT_PREFIX="with%F{red} "
ZSH_THEME_RUBY_PROMPT_SUFFIX="%{$reset_color%}"
ZSH_THEME_RVM_PROMPT_OPTIONS="v g"
+# virtualenv prompt settings
+ZSH_THEME_VIRTUALENV_PREFIX=" with%F{red} "
+ZSH_THEME_VIRTUALENV_SUFFIX="%{$reset_color%}"
+
setopt prompt_subst
-PROMPT="${purple}%n%{$reset_color%} in ${limegreen}%~%{$reset_color%}\$(ruby_prompt_info)\$vcs_info_msg_0_${orange} λ%{$reset_color%} "
+PROMPT="${purple}%n%{$reset_color%} in ${limegreen}%~%{$reset_color%}\$(virtualenv_prompt_info)\$(ruby_prompt_info)\$vcs_info_msg_0_${orange} λ%{$reset_color%} "
diff --git a/themes/michelebologna.zsh-theme b/themes/michelebologna.zsh-theme
index bb86d68d..b13b2caf 100644
--- a/themes/michelebologna.zsh-theme
+++ b/themes/michelebologna.zsh-theme
@@ -29,14 +29,13 @@ local cyan="%{$fg_bold[cyan]%}"
local yellow="%{$fg_bold[yellow]%}"
local blue="%{$fg_bold[blue]%}"
local magenta="%{$fg_bold[magenta]%}"
-local white="%{$fg_bold[white]%}"
local reset="%{$reset_color%}"
local -a color_array
-color_array=($green $red $cyan $yellow $blue $magenta $white)
+color_array=($green $red $cyan $yellow $blue $magenta)
-local username_color=$white
-local hostname_color=$color_array[$[((#HOST))%7+1]] # choose hostname color based on first character
+local username_color=$blue
+local hostname_color=$color_array[$[((#HOST))%6+1]] # choose hostname color based on first character
local current_dir_color=$blue
local username="%n"
@@ -66,10 +65,10 @@ function michelebologna_git_prompt {
local out=$(git_prompt_info)$(git_prompt_status)$(git_remote_status)
[[ -n $out ]] || return
printf " %s(%s%s%s)%s" \
- "%{$fg_bold[white]%}" \
+ "%{$fg_bold[blue]%}" \
"%{$fg_bold[green]%}" \
"$out" \
- "%{$fg_bold[white]%}" \
+ "%{$fg_bold[blue]%}" \
"%{$reset_color%}"
}
diff --git a/themes/mlh.zsh-theme b/themes/mlh.zsh-theme
index baff3fb6..c059bf85 100644
--- a/themes/mlh.zsh-theme
+++ b/themes/mlh.zsh-theme
@@ -47,6 +47,10 @@ if [ -z "$MLH_SHELL_SYMBOL" ]; then
MLH_SHELL_SYMBOL="$ "
fi
+if [ -z "$MLH_SHELL_SYMBOL_ROOT" ]; then
+ MLH_SHELL_SYMBOL_ROOT="# "
+fi
+
# colors
USER_COLOR="%F{001}"
DEVICE_COLOR="%F{033}"
@@ -83,7 +87,11 @@ exit_code() {
}
prompt_end() {
- printf "\n$MLH_SHELL_SYMBOL"
+ if [ "$UID" -eq 0 ]; then
+ printf "\n$MLH_SHELL_SYMBOL_ROOT"
+ else
+ printf "\n$MLH_SHELL_SYMBOL"
+ fi
}
# Set git_prompt_info text
diff --git a/themes/mortalscumbag.zsh-theme b/themes/mortalscumbag.zsh-theme
index d81a7ca0..36301cb7 100644
--- a/themes/mortalscumbag.zsh-theme
+++ b/themes/mortalscumbag.zsh-theme
@@ -51,8 +51,14 @@ function ssh_connection() {
fi
}
+function _toolbox_prompt_info() {
+ if typeset -f toolbox_prompt_info > /dev/null; then
+ toolbox_prompt_info
+ fi
+}
+
local ret_status="%(?:%{$fg_bold[green]%}:%{$fg_bold[red]%})%?%{$reset_color%}"
-PROMPT=$'\n$(ssh_connection)%{$fg_bold[green]%}%n@%m%{$reset_color%}$(my_git_prompt) : %~\n[${ret_status}] %# '
+PROMPT=$'\n$(_toolbox_prompt_info)$(ssh_connection)%{$fg_bold[green]%}%n@%m%{$reset_color%}$(my_git_prompt) : %~\n[${ret_status}] %# '
ZSH_THEME_PROMPT_RETURNCODE_PREFIX="%{$fg_bold[red]%}"
ZSH_THEME_GIT_PROMPT_PREFIX=" $fg[white]‹ %{$fg_bold[yellow]%}"
diff --git a/themes/oldgallois.zsh-theme b/themes/oldgallois.zsh-theme
new file mode 100644
index 00000000..bb97bfb1
--- /dev/null
+++ b/themes/oldgallois.zsh-theme
@@ -0,0 +1,24 @@
+# Depends on the git plugin for work_in_progress()
+(( $+functions[work_in_progress] )) || work_in_progress() {}
+
+ZSH_THEME_GIT_PROMPT_PREFIX="%{$reset_color%}%{$fg[green]%}["
+ZSH_THEME_GIT_PROMPT_SUFFIX="]%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}*%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_CLEAN=""
+
+# Customized git status, oh-my-zsh currently does not allow render dirty status before branch
+git_custom_status() {
+ local branch=$(git_current_branch)
+ [[ -n "$branch" ]] || return 0
+ echo "$(parse_git_dirty)\
+%{${fg_bold[yellow]}%}$(work_in_progress)%{$reset_color%}\
+${ZSH_THEME_GIT_PROMPT_PREFIX}${branch}${ZSH_THEME_GIT_PROMPT_SUFFIX}"
+}
+
+# RVM component of prompt
+ZSH_THEME_RUBY_PROMPT_PREFIX="%{$fg[red]%}["
+ZSH_THEME_RUBY_PROMPT_SUFFIX="]%{$reset_color%}"
+
+# Combine it all into a final right-side prompt
+RPS1="\$(git_custom_status)\$(ruby_prompt_info)${RPS1:+ $RPS1}"
+PROMPT='%{$fg[cyan]%}[%~% ]%(?.%{$fg[green]%}.%{$fg[red]%})%B$%b '
diff --git a/themes/robbyrussell.zsh-theme b/themes/robbyrussell.zsh-theme
index 2fd5f2cd..173e6d57 100644
--- a/themes/robbyrussell.zsh-theme
+++ b/themes/robbyrussell.zsh-theme
@@ -1,5 +1,5 @@
-PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )"
-PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)'
+PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ ) %{$fg[cyan]%}%c%{$reset_color%}"
+PROMPT+=' $(git_prompt_info)'
ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[blue]%}git:(%{$fg[red]%}"
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
diff --git a/tools/changelog.sh b/tools/changelog.sh
index 6489a3cb..6d768963 100755
--- a/tools/changelog.sh
+++ b/tools/changelog.sh
@@ -106,6 +106,9 @@ function parse-commit {
message="${match[1]}"
# remove CR characters (might be inserted in GitHub UI commit description form)
message="${message//$'\r'/}"
+ # remove lines containing only whitespace
+ local nlnl=$'\n\n'
+ message="${message//$'\n'[[:space:]]##$'\n'/$nlnl}"
# skip next paragraphs (separated by two newlines or more)
message="${message%%$'\n\n'*}"
# ... and replace newlines with spaces
@@ -157,6 +160,89 @@ function parse-commit {
fi
}
+################################
+# SUPPORTS HYPERLINKS FUNCTION #
+################################
+
+# The code for checking if a terminal supports hyperlinks is copied from install.sh
+
+# The [ -t 1 ] check only works when the function is not called from
+# a subshell (like in `$(...)` or `(...)`, so this hack redefines the
+# function at the top level to always return false when stdout is not
+# a tty.
+if [ -t 1 ]; then
+ is_tty() {
+ true
+ }
+else
+ is_tty() {
+ false
+ }
+fi
+
+# This function uses the logic from supports-hyperlinks[1][2], which is
+# made by Kat Marchán (@zkat) and licensed under the Apache License 2.0.
+# [1] https://github.com/zkat/supports-hyperlinks
+# [2] https://crates.io/crates/supports-hyperlinks
+#
+# Copyright (c) 2021 Kat Marchán
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+supports_hyperlinks() {
+ # $FORCE_HYPERLINK must be set and be non-zero (this acts as a logic bypass)
+ if [ -n "$FORCE_HYPERLINK" ]; then
+ [ "$FORCE_HYPERLINK" != 0 ]
+ return $?
+ fi
+
+ # If stdout is not a tty, it doesn't support hyperlinks
+ is_tty || return 1
+
+ # DomTerm terminal emulator (domterm.org)
+ if [ -n "$DOMTERM" ]; then
+ return 0
+ fi
+
+ # VTE-based terminals above v0.50 (Gnome Terminal, Guake, ROXTerm, etc)
+ if [ -n "$VTE_VERSION" ]; then
+ [ $VTE_VERSION -ge 5000 ]
+ return $?
+ fi
+
+ # If $TERM_PROGRAM is set, these terminals support hyperlinks
+ case "$TERM_PROGRAM" in
+ Hyper|iTerm.app|terminology|WezTerm) return 0 ;;
+ esac
+
+ # kitty supports hyperlinks
+ if [ "$TERM" = xterm-kitty ]; then
+ return 0
+ fi
+
+ # Windows Terminal also supports hyperlinks
+ if [ -n "$WT_SESSION" ]; then
+ return 0
+ fi
+
+ # Konsole supports hyperlinks, but it's an opt-in setting that can't be detected
+ # https://github.com/ohmyzsh/ohmyzsh/issues/10964
+ # if [ -n "$KONSOLE_VERSION" ]; then
+ # return 0
+ # fi
+
+ return 1
+}
+
#############################
# RELEASE CHANGELOG DISPLAY #
#############################
@@ -208,8 +294,14 @@ function display-release {
local hash="${1:-$hash}"
case "$output" in
raw) printf '%s' "$hash" ;;
- text) printf '\e[33m%s\e[0m' "$hash" ;; # red
- md) printf '[`%s`](https://github.com/ohmyzsh/ohmyzsh/commit/%s)' "$hash" ;;
+ text)
+ local text="\e[33m$hash\e[0m"; # red
+ if supports_hyperlinks; then
+ printf "\e]8;;%s\a%s\e]8;;\a" "https://github.com/ohmyzsh/ohmyzsh/commit/$hash" $text;
+ else
+ echo $text;
+ fi ;;
+ md) printf '[`%s`](https://github.com/ohmyzsh/ohmyzsh/commit/%s)' "$hash" "$hash" ;;
esac
}
@@ -272,7 +364,12 @@ function display-release {
case "$output" in
raw) printf '%s' "$subject" ;;
# In text mode, highlight (#) and dim text between `backticks`
- text) sed -E $'s|#([0-9]+)|\e[32m#\\1\e[0m|g;s|`([^`]+)`|`\e[2m\\1\e[0m`|g' <<< "$subject" ;;
+ text)
+ if supports_hyperlinks; then
+ sed -E $'s|#([0-9]+)|\e]8;;https://github.com/ohmyzsh/ohmyzsh/issues/\\1\a\e[32m#\\1\e[0m\e]8;;\a|g;s|`([^`]+)`|`\e[2m\\1\e[0m`|g' <<< "$subject"
+ else
+ sed -E $'s|#([0-9]+)|\e[32m#\\1\e[0m|g;s|`([^`]+)`|`\e[2m\\1\e[0m`|g' <<< "$subject"
+ fi ;;
# In markdown mode, link to (#) issues
md) sed -E 's|#([0-9]+)|[#\1](https://github.com/ohmyzsh/ohmyzsh/issues/\1)|g' <<< "$subject" ;;
esac
diff --git a/tools/check_for_upgrade.sh b/tools/check_for_upgrade.sh
index cc527e72..1cc193bd 100644
--- a/tools/check_for_upgrade.sh
+++ b/tools/check_for_upgrade.sh
@@ -9,6 +9,7 @@ fi
# - prompt (default): the user is asked before updating when it's time to update
# - auto: the update is performed automatically when it's time
# - reminder: a reminder is shown to the user when it's time to update
+# - background-alpha: an experimental update-on-the-background option
# - disabled: automatic update is turned off
zstyle -s ':omz:update' mode update_mode || {
update_mode=prompt
@@ -21,10 +22,12 @@ zstyle -s ':omz:update' mode update_mode || {
# Cancel update if:
# - the automatic update is disabled.
# - the current user doesn't have write permissions nor owns the $ZSH directory.
+# - is not run from a tty
# - git is unavailable on the system.
if [[ "$update_mode" = disabled ]] \
|| [[ ! -w "$ZSH" || ! -O "$ZSH" ]] \
- || ! command -v git &>/dev/null; then
+ || [[ ! -t 1 ]] \
+ || ! command git --version 2>&1 >/dev/null; then
unset update_mode
return
fi
@@ -89,12 +92,37 @@ function is_update_available() {
}
function update_last_updated_file() {
- echo "LAST_EPOCH=$(current_epoch)" >! "${ZSH_CACHE_DIR}/.zsh-update"
+ local exit_status="$1" error="$2"
+
+ if [[ -z "${1}${2}" ]]; then
+ echo "LAST_EPOCH=$(current_epoch)" >! "${ZSH_CACHE_DIR}/.zsh-update"
+ return
+ fi
+
+ cat >! "${ZSH_CACHE_DIR}/.zsh-update" <&1); then
+ update_last_updated_file 0 "Update successful"
+ else
+ exit_status=$?
+ update_last_updated_file $exit_status "$error"
+ return $exit_status
fi
}
@@ -123,87 +151,145 @@ function has_typed_input() {
}
}
-() {
- emulate -L zsh
+function handle_update() {
+ () {
+ emulate -L zsh
- local epoch_target mtime option LAST_EPOCH
+ local epoch_target mtime option LAST_EPOCH
- # Remove lock directory if older than a day
- zmodload zsh/datetime
- zmodload -F zsh/stat b:zstat
- if mtime=$(zstat +mtime "$ZSH/log/update.lock" 2>/dev/null); then
- if (( (mtime + 3600 * 24) < EPOCHSECONDS )); then
- command rm -rf "$ZSH/log/update.lock"
+ # Remove lock directory if older than a day
+ zmodload zsh/datetime
+ zmodload -F zsh/stat b:zstat
+ if mtime=$(zstat +mtime "$ZSH/log/update.lock" 2>/dev/null); then
+ if (( (mtime + 3600 * 24) < EPOCHSECONDS )); then
+ command rm -rf "$ZSH/log/update.lock"
+ fi
fi
- fi
- # Check for lock directory
- if ! command mkdir "$ZSH/log/update.lock" 2>/dev/null; then
- return
- fi
+ # Check for lock directory
+ if ! command mkdir "$ZSH/log/update.lock" 2>/dev/null; then
+ return
+ fi
- # Remove lock directory on exit. `return $ret` is important for when trapping a SIGINT:
- # The return status from the function is handled specially. If it is zero, the signal is
- # assumed to have been handled, and execution continues normally. Otherwise, the shell
- # will behave as interrupted except that the return status of the trap is retained.
- # This means that for a CTRL+C, the trap needs to return the same exit status so that
- # the shell actually exits what it's running.
- trap "
- ret=\$?
- unset update_mode
- unset -f current_epoch is_update_available update_last_updated_file update_ohmyzsh 2>/dev/null
- command rm -rf '$ZSH/log/update.lock'
- return \$ret
- " EXIT INT QUIT
+ # Remove lock directory on exit. `return $ret` is important for when trapping a SIGINT:
+ # The return status from the function is handled specially. If it is zero, the signal is
+ # assumed to have been handled, and execution continues normally. Otherwise, the shell
+ # will behave as interrupted except that the return status of the trap is retained.
+ # This means that for a CTRL+C, the trap needs to return the same exit status so that
+ # the shell actually exits what it's running.
+ trap "
+ ret=\$?
+ unset update_mode
+ unset -f current_epoch is_update_available update_last_updated_file update_ohmyzsh handle_update 2>/dev/null
+ command rm -rf '$ZSH/log/update.lock'
+ return \$ret
+ " EXIT INT QUIT
- # Create or update .zsh-update file if missing or malformed
- if ! source "${ZSH_CACHE_DIR}/.zsh-update" 2>/dev/null || [[ -z "$LAST_EPOCH" ]]; then
- update_last_updated_file
- return
- fi
+ # Create or update .zsh-update file if missing or malformed
+ if ! source "${ZSH_CACHE_DIR}/.zsh-update" 2>/dev/null || [[ -z "$LAST_EPOCH" ]]; then
+ update_last_updated_file
+ return
+ fi
- # Number of days before trying to update again
- zstyle -s ':omz:update' frequency epoch_target || epoch_target=${UPDATE_ZSH_DAYS:-13}
- # Test if enough time has passed until the next update
- if (( ( $(current_epoch) - $LAST_EPOCH ) < $epoch_target )); then
- return
- fi
+ # Number of days before trying to update again
+ zstyle -s ':omz:update' frequency epoch_target || epoch_target=${UPDATE_ZSH_DAYS:-13}
+ # Test if enough time has passed until the next update
+ if (( ( $(current_epoch) - $LAST_EPOCH ) < $epoch_target )); then
+ return
+ fi
- # Test if Oh My Zsh directory is a git repository
- if ! (builtin cd -q "$ZSH" && LANG= git rev-parse &>/dev/null); then
- echo >&2 "[oh-my-zsh] Can't update: not a git repository."
- return
- fi
+ # Test if Oh My Zsh directory is a git repository
+ if ! (builtin cd -q "$ZSH" && LANG= git rev-parse &>/dev/null); then
+ echo >&2 "[oh-my-zsh] Can't update: not a git repository."
+ return
+ fi
- # Check if there are updates available before proceeding
- if ! is_update_available; then
- return
- fi
+ # Check if there are updates available before proceeding
+ if ! is_update_available; then
+ update_last_updated_file
+ return
+ fi
- # If in reminder mode or user has typed input, show reminder and exit
- if [[ "$update_mode" = reminder ]] || has_typed_input; then
- printf '\r\e[0K' # move cursor to first column and clear whole line
- echo "[oh-my-zsh] It's time to update! You can do that by running \`omz update\`"
- return 0
- fi
+ # If in reminder mode or user has typed input, show reminder and exit
+ if [[ "$update_mode" = reminder ]] || { [[ "$update_mode" != background-alpha ]] && has_typed_input }; then
+ printf '\r\e[0K' # move cursor to first column and clear whole line
+ echo "[oh-my-zsh] It's time to update! You can do that by running \`omz update\`"
+ return 0
+ fi
- # Don't ask for confirmation before updating if in auto mode
- if [[ "$update_mode" = auto ]]; then
- update_ohmyzsh
- return $?
- fi
+ # Don't ask for confirmation before updating if in auto mode
+ if [[ "$update_mode" = (auto|background-alpha) ]]; then
+ update_ohmyzsh
+ return $?
+ fi
- # Ask for confirmation and only update on 'y', 'Y' or Enter
- # Otherwise just show a reminder for how to update
- echo -n "[oh-my-zsh] Would you like to update? [Y/n] "
- read -r -k 1 option
- [[ "$option" = $'\n' ]] || echo
- case "$option" in
- [yY$'\n']) update_ohmyzsh ;;
- [nN]) update_last_updated_file ;&
- *) echo "[oh-my-zsh] You can update manually by running \`omz update\`" ;;
- esac
+ # Ask for confirmation and only update on 'y', 'Y' or Enter
+ # Otherwise just show a reminder for how to update
+ echo -n "[oh-my-zsh] Would you like to update? [Y/n] "
+ read -r -k 1 option
+ [[ "$option" = $'\n' ]] || echo
+ case "$option" in
+ [yY$'\n']) update_ohmyzsh ;;
+ [nN]) update_last_updated_file ;&
+ *) echo "[oh-my-zsh] You can update manually by running \`omz update\`" ;;
+ esac
+ }
+
+ unset update_mode
+ unset -f current_epoch is_update_available update_last_updated_file update_ohmyzsh handle_update
}
-unset update_mode
-unset -f current_epoch is_update_available update_last_updated_file update_ohmyzsh
+case "$update_mode" in
+ background-alpha)
+ autoload -Uz add-zsh-hook
+
+ _omz_bg_update() {
+ # do the update in a subshell
+ (handle_update) &|
+
+ # register update results function
+ add-zsh-hook precmd _omz_bg_update_status
+
+ # deregister background function
+ add-zsh-hook -d precmd _omz_bg_update
+ unset -f _omz_bg_update
+ }
+
+ _omz_bg_update_status() {
+ {
+ local LAST_EPOCH EXIT_STATUS ERROR
+ if [[ ! -f "$ZSH_CACHE_DIR"/.zsh-update ]]; then
+ return 1
+ fi
+
+ # check update results until timeout is reached
+ . "$ZSH_CACHE_DIR/.zsh-update"
+ if [[ -z "$EXIT_STATUS" || -z "$ERROR" ]]; then
+ return 1
+ fi
+
+ if [[ "$EXIT_STATUS" -eq 0 ]]; then
+ print -P "\n%F{green}[oh-my-zsh] Update successful.%f"
+ return 0
+ elif [[ "$EXIT_STATUS" -ne 0 ]]; then
+ print -P "\n%F{red}[oh-my-zsh] There was an error updating:%f"
+ printf "\n${fg[yellow]}%s${reset_color}" "$ERROR"
+ return 0
+ fi
+ } always {
+ if (( TRY_BLOCK_ERROR == 0 )); then
+ # if last update results have been handled, remove them from the status file
+ update_last_updated_file
+
+ # deregister background function
+ add-zsh-hook -d precmd _omz_bg_update_status
+ unset -f _omz_bg_update_status
+ fi
+ }
+ }
+
+ add-zsh-hook precmd _omz_bg_update
+ ;;
+ *)
+ handle_update ;;
+esac
diff --git a/tools/install.sh b/tools/install.sh
index a6538f9d..fcfbcf77 100755
--- a/tools/install.sh
+++ b/tools/install.sh
@@ -16,6 +16,9 @@
# ZSH=~/.zsh sh install.sh
#
# Respects the following environment variables:
+# ZDOTDIR - path to Zsh dotfiles directory (default: unset). See [1][2]
+# [1] https://zsh.sourceforge.io/Doc/Release/Parameters.html#index-ZDOTDIR
+# [2] https://zsh.sourceforge.io/Doc/Release/Files.html#index-ZDOTDIR_002c-use-of
# ZSH - path to the Oh My Zsh repository folder (default: $HOME/.oh-my-zsh)
# REPO - name of the GitHub repo to install from (default: ohmyzsh/ohmyzsh)
# REMOTE - full remote URL of the git repo to install (default: GitHub via HTTPS)
@@ -53,8 +56,17 @@ HOME="${HOME:-$(eval echo ~$USER)}"
# Track if $ZSH was provided
custom_zsh=${ZSH:+yes}
-# Default settings
+# Use $zdot to keep track of where the directory is for zsh dotfiles
+# To check if $ZDOTDIR was provided, explicitly check for $ZDOTDIR
+zdot="${ZDOTDIR:-$HOME}"
+
+# Default value for $ZSH
+# a) if $ZDOTDIR is supplied and not $HOME: $ZDOTDIR/ohmyzsh
+# b) otherwise, $HOME/.oh-my-zsh
+[ "$ZDOTDIR" = "$HOME" ] || ZSH="${ZSH:-${ZDOTDIR:+$ZDOTDIR/ohmyzsh}}"
ZSH="${ZSH:-$HOME/.oh-my-zsh}"
+
+# Default settings
REPO=${REPO:-ohmyzsh/ohmyzsh}
REMOTE=${REMOTE:-https://github.com/${REPO}.git}
BRANCH=${BRANCH:-master}
@@ -72,6 +84,10 @@ command_exists() {
user_can_sudo() {
# Check if sudo is installed
command_exists sudo || return 1
+ # Termux can't run sudo, so we can detect it and exit the function early.
+ case "$PREFIX" in
+ *com.termux*) return 1 ;;
+ esac
# The following command has 3 parts:
#
# 1. Run `sudo` with `-v`. Does the following:
@@ -311,11 +327,11 @@ setup_zshrc() {
echo "${FMT_BLUE}Looking for an existing zsh config...${FMT_RESET}"
# Must use this exact name so uninstall.sh can find it
- OLD_ZSHRC=~/.zshrc.pre-oh-my-zsh
- if [ -f ~/.zshrc ] || [ -h ~/.zshrc ]; then
+ OLD_ZSHRC="$zdot/.zshrc.pre-oh-my-zsh"
+ if [ -f "$zdot/.zshrc" ] || [ -h "$zdot/.zshrc" ]; then
# Skip this if the user doesn't want to replace an existing .zshrc
if [ "$KEEP_ZSHRC" = yes ]; then
- echo "${FMT_YELLOW}Found ~/.zshrc.${FMT_RESET} ${FMT_GREEN}Keeping...${FMT_RESET}"
+ echo "${FMT_YELLOW}Found ${zdot}/.zshrc.${FMT_RESET} ${FMT_GREEN}Keeping...${FMT_RESET}"
return
fi
if [ -e "$OLD_ZSHRC" ]; then
@@ -327,19 +343,24 @@ setup_zshrc() {
fi
mv "$OLD_ZSHRC" "${OLD_OLD_ZSHRC}"
- echo "${FMT_YELLOW}Found old ~/.zshrc.pre-oh-my-zsh." \
+ echo "${FMT_YELLOW}Found old .zshrc.pre-oh-my-zsh." \
"${FMT_GREEN}Backing up to ${OLD_OLD_ZSHRC}${FMT_RESET}"
fi
- echo "${FMT_YELLOW}Found ~/.zshrc.${FMT_RESET} ${FMT_GREEN}Backing up to ${OLD_ZSHRC}${FMT_RESET}"
- mv ~/.zshrc "$OLD_ZSHRC"
+ echo "${FMT_YELLOW}Found ${zdot}/.zshrc.${FMT_RESET} ${FMT_GREEN}Backing up to ${OLD_ZSHRC}${FMT_RESET}"
+ mv "$zdot/.zshrc" "$OLD_ZSHRC"
fi
- echo "${FMT_GREEN}Using the Oh My Zsh template file and adding it to ~/.zshrc.${FMT_RESET}"
+ echo "${FMT_GREEN}Using the Oh My Zsh template file and adding it to $zdot/.zshrc.${FMT_RESET}"
- # Replace $HOME path with '$HOME' in $ZSH variable in .zshrc file
- omz=$(echo "$ZSH" | sed "s|^$HOME/|\$HOME/|")
- sed "s|^export ZSH=.*$|export ZSH=\"${omz}\"|" "$ZSH/templates/zshrc.zsh-template" > ~/.zshrc-omztemp
- mv -f ~/.zshrc-omztemp ~/.zshrc
+ # Modify $ZSH variable in .zshrc directory to use the literal $ZDOTDIR or $HOME
+ omz="$ZSH"
+ if [ -n "$ZDOTDIR" ] && [ "$ZDOTDIR" != "$HOME" ]; then
+ omz=$(echo "$omz" | sed "s|^$ZDOTDIR/|\$ZDOTDIR/|")
+ fi
+ omz=$(echo "$omz" | sed "s|^$HOME/|\$HOME/|")
+
+ sed "s|^export ZSH=.*$|export ZSH=\"${omz}\"|" "$ZSH/templates/zshrc.zsh-template" > "$zdot/.zshrc-omztemp"
+ mv -f "$zdot/.zshrc-omztemp" "$zdot/.zshrc"
echo
}
@@ -407,9 +428,9 @@ EOF
# We're going to change the default shell, so back up the current one
if [ -n "$SHELL" ]; then
- echo "$SHELL" > ~/.shell.pre-oh-my-zsh
+ echo "$SHELL" > "$zdot/.shell.pre-oh-my-zsh"
else
- grep "^$USER:" /etc/passwd | awk -F: '{print $7}' > ~/.shell.pre-oh-my-zsh
+ grep "^$USER:" /etc/passwd | awk -F: '{print $7}' > "$zdot/.shell.pre-oh-my-zsh"
fi
echo "Changing your shell to $zsh..."
@@ -451,7 +472,7 @@ print_success() {
printf '\n'
printf '\n'
printf "%s %s %s\n" "Before you scream ${FMT_BOLD}${FMT_YELLOW}Oh My Zsh!${FMT_RESET} look over the" \
- "$(fmt_code "$(fmt_link ".zshrc" "file://$HOME/.zshrc" --text)")" \
+ "$(fmt_code "$(fmt_link ".zshrc" "file://$zdot/.zshrc" --text)")" \
"file to select plugins, themes, and options."
printf '\n'
printf '%s\n' "• Follow us on Twitter: $(fmt_link @ohmyzsh https://twitter.com/ohmyzsh)"
@@ -506,6 +527,11 @@ EOF
exit 1
fi
+ # Create ZDOTDIR folder structure if it doesn't exist
+ if [ -n "$ZDOTDIR" ]; then
+ mkdir -p "$ZDOTDIR"
+ fi
+
setup_ohmyzsh
setup_zshrc
setup_shell
diff --git a/tools/uninstall.sh b/tools/uninstall.sh
index 6a0e7b4c..6e3df7ac 100644
--- a/tools/uninstall.sh
+++ b/tools/uninstall.sh
@@ -1,3 +1,15 @@
+if hash chsh >/dev/null 2>&1 && [ -f ~/.shell.pre-oh-my-zsh ]; then
+ old_shell=$(cat ~/.shell.pre-oh-my-zsh)
+ echo "Switching your shell back to '$old_shell':"
+ if chsh -s "$old_shell"; then
+ rm -f ~/.shell.pre-oh-my-zsh
+ else
+ echo "Could not change default shell. Change it manually by running chsh"
+ echo "or editing the /etc/passwd file."
+ exit
+ fi
+fi
+
read -r -p "Are you sure you want to remove Oh My Zsh? [y/N] " confirmation
if [ "$confirmation" != y ] && [ "$confirmation" != Y ]; then
echo "Uninstall cancelled"
@@ -25,16 +37,5 @@ else
echo "No original zsh config found"
fi
-if hash chsh >/dev/null 2>&1 && [ -f ~/.shell.pre-oh-my-zsh ]; then
- old_shell=$(cat ~/.shell.pre-oh-my-zsh)
- echo "Switching your shell back to '$old_shell':"
- if chsh -s "$old_shell"; then
- rm -f ~/.shell.pre-oh-my-zsh
- else
- echo "Could not change default shell. Change it manually by running chsh"
- echo "or editing the /etc/passwd file."
- fi
-fi
-
echo "Thanks for trying out Oh My Zsh. It's been uninstalled."
echo "Don't forget to restart your terminal!"
diff --git a/tools/upgrade.sh b/tools/upgrade.sh
index 596a5930..f7a263d6 100755
--- a/tools/upgrade.sh
+++ b/tools/upgrade.sh
@@ -1,4 +1,7 @@
#!/usr/bin/env zsh
+set +u # disable nounset
+
+local ret=0 # exit code
# Protect against running with shells other than zsh
if [ -z "$ZSH_VERSION" ]; then
@@ -12,6 +15,23 @@ esac
cd "$ZSH"
+verbose_mode="default"
+interactive=false
+
+while getopts "v:i" opt; do
+ case $opt in
+ v)
+ if [[ $OPTARG == default || $OPTARG == minimal || $OPTARG == silent ]]; then
+ verbose_mode=$OPTARG
+ else
+ echo "[oh-my-zsh] update verbosity '$OPTARG' is not valid"
+ echo "[oh-my-zsh] valid options are 'default', 'minimal' and 'silent'"
+ fi
+ ;;
+ i) interactive=true ;;
+ esac
+done
+
# Use colors, but only if connected to a terminal
# and that terminal supports them.
@@ -164,17 +184,23 @@ fi
# Update upstream remote to ohmyzsh org
git remote -v | while read remote url extra; do
case "$url" in
- https://github.com/robbyrussell/oh-my-zsh(|.git))
- git remote set-url "$remote" "https://github.com/ohmyzsh/ohmyzsh.git"
- break ;;
- git@github.com:robbyrussell/oh-my-zsh(|.git))
- git remote set-url "$remote" "git@github.com:ohmyzsh/ohmyzsh.git"
- break ;;
- # Update out-of-date "unauthenticated git protocol on port 9418" to https
git://github.com/robbyrussell/oh-my-zsh(|.git))
- git remote set-url "$remote" "https://github.com/ohmyzsh/ohmyzsh.git"
- break ;;
+ # Update out-of-date "unauthenticated git protocol on port 9418" to https
+ git remote set-url "$remote" "https://github.com/ohmyzsh/ohmyzsh.git" ;;
+ https://github.com/robbyrussell/oh-my-zsh(|.git))
+ git remote set-url "$remote" "https://github.com/ohmyzsh/ohmyzsh.git" ;;
+ git@github.com:robbyrussell/oh-my-zsh(|.git))
+ git remote set-url "$remote" "git@github.com:ohmyzsh/ohmyzsh.git" ;;
+ https://github.com/ohmyzsh/ohmyzsh(|.git)) ;;
+ git@github.com:ohmyzsh/ohmyzsh(|.git)) ;;
+ *) continue ;;
esac
+
+ # If we reach this point we have found the proper ohmyzsh upstream remote. If we don't,
+ # we'll only update from the set remote if `oh-my-zsh.remote` has been set to a remote,
+ # as when installing from a fork.
+ git config --local oh-my-zsh.remote "$remote"
+ break
done
# Set git-config values known to fix git errors
@@ -203,7 +229,9 @@ git checkout -q "$branch" -- || exit 1
last_commit=$(git rev-parse "$branch")
# Update Oh My Zsh
-printf "${BLUE}%s${RESET}\n" "Updating Oh My Zsh"
+if [[ $verbose_mode != silent ]]; then
+ printf "${BLUE}%s${RESET}\n" "Updating Oh My Zsh"
+fi
if LANG= git pull --quiet --rebase $remote $branch; then
# Check if it was really updated or not
if [[ "$(git rev-parse HEAD)" = "$last_commit" ]]; then
@@ -215,24 +243,30 @@ if LANG= git pull --quiet --rebase $remote $branch; then
git config oh-my-zsh.lastVersion "$last_commit"
# Print changelog to the terminal
- if [[ "$1" = --interactive ]]; then
+ if [[ $interactive == true && $verbose_mode == default ]]; then
"$ZSH/tools/changelog.sh" HEAD "$last_commit"
fi
- printf "${BLUE}%s \`${BOLD}%s${RESET}${BLUE}\`${RESET}\n" "You can see the changelog with" "omz changelog"
+ if [[ $verbose_mode != silent ]]; then
+ printf "${BLUE}%s \`${BOLD}%s${RESET}${BLUE}\`${RESET}\n" "You can see the changelog with" "omz changelog"
+ fi
fi
- printf '%s %s__ %s %s %s %s %s__ %s\n' $RAINBOW $RESET
- printf '%s ____ %s/ /_ %s ____ ___ %s__ __ %s ____ %s_____%s/ /_ %s\n' $RAINBOW $RESET
- printf '%s / __ \\%s/ __ \\ %s / __ `__ \\%s/ / / / %s /_ / %s/ ___/%s __ \\ %s\n' $RAINBOW $RESET
- printf '%s/ /_/ /%s / / / %s / / / / / /%s /_/ / %s / /_%s(__ )%s / / / %s\n' $RAINBOW $RESET
- printf '%s\\____/%s_/ /_/ %s /_/ /_/ /_/%s\\__, / %s /___/%s____/%s_/ /_/ %s\n' $RAINBOW $RESET
- printf '%s %s %s %s /____/ %s %s %s %s\n' $RAINBOW $RESET
- printf '\n'
- printf "${BLUE}%s${RESET}\n\n" "$message"
- printf "${BLUE}${BOLD}%s %s${RESET}\n" "To keep up with the latest news and updates, follow us on Twitter:" "$(fmt_link @ohmyzsh https://twitter.com/ohmyzsh)"
- printf "${BLUE}${BOLD}%s %s${RESET}\n" "Want to get involved in the community? Join our Discord:" "$(fmt_link "Discord server" https://discord.gg/ohmyzsh)"
- printf "${BLUE}${BOLD}%s %s${RESET}\n" "Get your Oh My Zsh swag at:" "$(fmt_link "Planet Argon Shop" https://shop.planetargon.com/collections/oh-my-zsh)"
+ if [[ $verbose_mode == default ]]; then
+ printf '%s %s__ %s %s %s %s %s__ %s\n' $RAINBOW $RESET
+ printf '%s ____ %s/ /_ %s ____ ___ %s__ __ %s ____ %s_____%s/ /_ %s\n' $RAINBOW $RESET
+ printf '%s / __ \\%s/ __ \\ %s / __ `__ \\%s/ / / / %s /_ / %s/ ___/%s __ \\ %s\n' $RAINBOW $RESET
+ printf '%s/ /_/ /%s / / / %s / / / / / /%s /_/ / %s / /_%s(__ )%s / / / %s\n' $RAINBOW $RESET
+ printf '%s\\____/%s_/ /_/ %s /_/ /_/ /_/%s\\__, / %s /___/%s____/%s_/ /_/ %s\n' $RAINBOW $RESET
+ printf '%s %s %s %s /____/ %s %s %s %s\n' $RAINBOW $RESET
+ printf '\n'
+ printf "${BLUE}%s${RESET}\n\n" "$message"
+ printf "${BLUE}${BOLD}%s %s${RESET}\n" "To keep up with the latest news and updates, follow us on Twitter:" "$(fmt_link @ohmyzsh https://twitter.com/ohmyzsh)"
+ printf "${BLUE}${BOLD}%s %s${RESET}\n" "Want to get involved in the community? Join our Discord:" "$(fmt_link "Discord server" https://discord.gg/ohmyzsh)"
+ printf "${BLUE}${BOLD}%s %s${RESET}\n" "Get your Oh My Zsh swag at:" "$(fmt_link "Planet Argon Shop" https://shop.planetargon.com/collections/oh-my-zsh)"
+ elif [[ $verbose_mode == minimal ]]; then
+ printf "${BLUE}%s${RESET}\n" "$message"
+ fi
else
ret=$?
printf "${RED}%s${RESET}\n" 'There was an error updating. Try again later?'