diff options
37 files changed, 844 insertions, 209 deletions
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index cba8e93af..c3990c4ee 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,3 +1,4 @@ # Plugin owners plugins/gitfast/ @felipec plugins/sdk/ @rgoldberg +plugins/git-lfs/ @vietduc01100001 diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 6bcb90efe..1abae8913 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,5 +1,7 @@ ## Standards checklist: +<!-- Fill with an x the ones that apply. Example: [x] --> + - [ ] The PR title is descriptive. - [ ] The PR doesn't replicate another PR which is already open. - [ ] I have read the contribution guide and followed all the instructions. diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile new file mode 100644 index 000000000..b35c80dfb --- /dev/null +++ b/.gitpod.Dockerfile @@ -0,0 +1,5 @@ +FROM gitpod/workspace-full + +RUN sudo apt-get update && \ + sudo apt-get install -y zsh && \ + sudo rm -rf /var/lib/apt/lists/* diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 000000000..ccc57242c --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,9 @@ +image: + file: .gitpod.Dockerfile + +tasks: + - init: | + export EDITOR="command gp open -w" VISUAL="command gp open -w" + cp -f /workspace/ohmyzsh/templates/zshrc.zsh-template ~/.zshrc + ln -sf /workspace/ohmyzsh ~/.oh-my-zsh + command: exec zsh @@ -15,6 +15,7 @@ To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twi [![CI](https://github.com/ohmyzsh/ohmyzsh/workflows/CI/badge.svg)](https://github.com/ohmyzsh/ohmyzsh/actions?query=workflow%3ACI) [![Follow @ohmyzsh](https://img.shields.io/twitter/follow/ohmyzsh?label=Follow+@ohmyzsh&style=flat)](https://twitter.com/intent/follow?screen_name=ohmyzsh) [![Discord server](https://img.shields.io/discord/642496866407284746)](https://discord.gg/ohmyzsh) +[![Gitpod ready](https://img.shields.io/badge/Gitpod-ready-blue?logo=gitpod)](https://gitpod.io/#https://github.com/ohmyzsh/ohmyzsh) ## Getting Started diff --git a/lib/cli.zsh b/lib/cli.zsh index c1ae2bdf2..b1478a89f 100644 --- a/lib/cli.zsh +++ b/lib/cli.zsh @@ -23,16 +23,27 @@ function _omz { local -a cmds subcmds cmds=( 'help:Usage information' + 'plugin:Commands for Oh My Zsh plugins management' + 'pr:Commands for Oh My Zsh Pull Requests management' + 'theme:Commands for Oh My Zsh themes management' 'update:Update Oh My Zsh' - 'pr:Commands for Oh My Zsh Pull Requests' ) if (( CURRENT == 2 )); then _describe 'command' cmds elif (( CURRENT == 3 )); then case "$words[2]" in - pr) subcmds=( 'test:Test a Pull Request' 'clean:Delete all Pull Request branches' ) + plugin) subcmds=('list:List plugins') _describe 'command' subcmds ;; + pr) subcmds=('test:Test a Pull Request' 'clean:Delete all Pull Request branches') + _describe 'command' subcmds ;; + theme) subcmds=('use:Load a theme' 'list:List themes') + _describe 'command' subcmds ;; + esac + elif (( CURRENT == 4 )); then + case "$words[2]::$words[3]" in + theme::use) compadd "$ZSH"/themes/*.zsh-theme(.N:t:r) \ + "$ZSH_CUSTOM"/**/*.zsh-theme(.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::) ;; esac fi @@ -49,23 +60,41 @@ Usage: omz <command> [options] Available commands: help Print this help message + plugin <command> Manage plugins + pr <command> Manage Oh My Zsh Pull Requests + theme <command> Manage themes update Update Oh My Zsh - pr <command> Commands for Oh My Zsh Pull Requests EOF } +function _omz::confirm { + # If question supplied, ask it before reading the answer + # NOTE: uses the logname of the caller function + if [[ -n "$1" ]]; then + _omz::log prompt "$1" "${${functrace[1]#_}%:*}" + fi + + # Read one character + read -r -k 1 + + # If no newline entered, add a newline + if [[ "$REPLY" != $'\n' ]]; then + echo + fi +} + function _omz::log { # if promptsubst is set, a message with `` or $() # will be run even if quoted due to `print -P` setopt localoptions nopromptsubst # $1 = info|warn|error|debug - # $@ = text + # $2 = text + # $3 = (optional) name of the logger local logtype=$1 - local logname=${${functrace[1]#_}%:*} - shift + local logname=${3:-${${functrace[1]#_}%:*}} # Don't print anything if debug is not active if [[ $logtype = debug && -z $_OMZ_DEBUG ]]; then @@ -74,14 +103,57 @@ function _omz::log { # Choose coloring based on log type case "$logtype" in - prompt) print -Pn "%S%F{blue}$logname%f%s: $@" ;; - debug) print -P "%F{white}$logname%f: $@" ;; - info) print -P "%F{green}$logname%f: $@" ;; - warn) print -P "%S%F{yellow}$logname%f%s: $@" ;; - error) print -P "%S%F{red}$logname%f%s: $@" ;; + prompt) print -Pn "%S%F{blue}$logname%f%s: $2" ;; + debug) print -P "%F{white}$logname%f: $2" ;; + info) print -P "%F{green}$logname%f: $2" ;; + warn) print -P "%S%F{yellow}$logname%f%s: $2" ;; + error) print -P "%S%F{red}$logname%f%s: $2" ;; esac >&2 } +function _omz::plugin { + (( $# > 0 && $+functions[_omz::plugin::$1] )) || { + cat <<EOF +Usage: omz plugin <command> [options] + +Available commands: + + list List all available Oh My Zsh plugins + +EOF + return 1 + } + + local command="$1" + shift + + _omz::plugin::$command "$@" +} + +function _omz::plugin::list { + local -a custom_plugins builtin_plugins + custom_plugins=("$ZSH_CUSTOM"/plugins/*(-/N:t)) + builtin_plugins=("$ZSH"/plugins/*(-/N:t)) + + # If the command is being piped, print all found line by line + if [[ ! -t 1 ]]; then + print -l ${(q-)custom_plugins} ${(q-)builtin_plugins} + return + fi + + if (( ${#custom_plugins} )); then + print -P "%U%BCustom plugins%b%u:" + print -l ${(q-)custom_plugins} | column + fi + + if (( ${#builtin_plugins} )); then + (( ${#custom_plugins} )) && echo # add a line of separation + + print -P "%U%BBuilt-in plugins%b%u:" + print -l ${(q-)builtin_plugins} | column + fi +} + function _omz::pr { (( $# > 0 && $+functions[_omz::pr::$1] )) || { cat <<EOF @@ -107,6 +179,24 @@ function _omz::pr::clean { set -e builtin cd -q "$ZSH" + # Check if there are PR branches + local fmt branches + fmt="%(color:bold blue)%(align:18,right)%(refname:short)%(end)%(color:reset) %(color:dim bold red)%(objectname:short)%(color:reset) %(color:yellow)%(contents:subject)" + branches="$(command git for-each-ref --sort=-committerdate --color --format="$fmt" "refs/heads/ohmyzsh/pull-*")" + + # Exit if there are no PR branches + if [[ -z "$branches" ]]; then + _omz::log info "there are no Pull Request branches to remove." + return + fi + + # Print found PR branches + echo "$branches\n" + # Confirm before removing the branches + _omz::confirm "do you want remove these Pull Request branches? [Y/n] " + # Only proceed if the answer is a valid yes option + [[ "$REPLY" != [yY$'\n'] ]] && return + _omz::log info "removing all Oh My Zsh Pull Request branches..." command git branch --list 'ohmyzsh/pull-*' | while read branch; do command git branch -D "$branch" @@ -181,13 +271,9 @@ function _omz::pr::test { command zsh -l # After testing, go back to the previous HEAD if the user wants - _omz::log prompt "do you want to go back to the previous branch? [Y/n] " - read -r -k 1 - - # If no newline entered, add a newline - [[ "$REPLY" != $'\n' ]] && echo - # If NO selected, do nothing else - [[ "$REPLY" = [nN] ]] && return + _omz::confirm "do you want to go back to the previous branch? [Y/n] " + # Only proceed if the answer is a valid yes option + [[ "$REPLY" != [yY$'\n'] ]] && return ( set -e @@ -200,6 +286,69 @@ function _omz::pr::test { ) } +function _omz::theme { + (( $# > 0 && $+functions[_omz::theme::$1] )) || { + cat <<EOF +Usage: omz theme <command> [options] + +Available commands: + + list List all available Oh My Zsh themes + use <theme> Load an Oh My Zsh theme + +EOF + return 1 + } + + local command="$1" + shift + + _omz::theme::$command "$@" +} + +function _omz::theme::list { + local -a custom_themes builtin_themes + custom_themes=("$ZSH_CUSTOM"/**/*.zsh-theme(.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::)) + builtin_themes=("$ZSH"/themes/*.zsh-theme(.N:t:r)) + + # If the command is being piped, print all found line by line + if [[ ! -t 1 ]]; then + print -l ${(q-)custom_themes} ${(q-)builtin_themes} + return + fi + + if (( ${#custom_themes} )); then + print -P "%U%BCustom themes%b%u:" + print -l ${(q-)custom_themes} | column + fi + + if (( ${#builtin_themes} )); then + (( ${#custom_themes} )) && echo # add a line of separation + + print -P "%U%BBuilt-in themes%b%u:" + print -l ${(q-)builtin_themes} | column + fi +} + +function _omz::theme::use { + if [[ -z "$1" ]]; then + echo >&2 "Usage: omz theme use <theme>" + return 1 + fi + + # Respect compatibility with old lookup order + if [[ -f "$ZSH_CUSTOM/$1.zsh-theme" ]]; then + source "$ZSH_CUSTOM/$1.zsh-theme" + elif [[ -f "$ZSH_CUSTOM/themes/$1.zsh-theme" ]]; then + source "$ZSH_CUSTOM/themes/$1.zsh-theme" + elif [[ -f "$ZSH/themes/$1.zsh-theme" ]]; then + source "$ZSH/themes/$1.zsh-theme" + else + _omz::log error "theme '$1' not found" + return 1 + fi +} + function _omz::update { # Run update script env ZSH="$ZSH" sh "$ZSH/tools/upgrade.sh" diff --git a/lib/completion.zsh b/lib/completion.zsh index a3873cd08..2b62785d5 100644 --- a/lib/completion.zsh +++ b/lib/completion.zsh @@ -1,7 +1,7 @@ # fixme - the load process here seems a bit bizarre zmodload -i zsh/complist -WORDCHARS='_-' +WORDCHARS='' unsetopt menu_complete # do not autoselect the first completion entry unsetopt flowcontrol diff --git a/lib/git.zsh b/lib/git.zsh index ffc7c01a1..53d39609e 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -147,44 +147,102 @@ function git_prompt_long_sha() { SHA=$(__git_prompt_git rev-parse HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER" } -# Get the status of the working tree function git_prompt_status() { - emulate -L zsh + [[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return - local INDEX STATUS - INDEX=$(__git_prompt_git status --porcelain -b 2> /dev/null) || return 0 - STATUS="" - if [[ "${INDEX}" =~ $'(^|\n)\\?\\? ' ]]; then - STATUS="$ZSH_THEME_GIT_PROMPT_UNTRACKED$STATUS" - fi - if [[ "${INDEX}" =~ $'(^|\n)(A |M |MM) ' ]]; then - STATUS="$ZSH_THEME_GIT_PROMPT_ADDED$STATUS" - fi - if [[ "${INDEX}" =~ $'(^|\n)([ AM]M| T) ' ]]; then - STATUS="$ZSH_THEME_GIT_PROMPT_MODIFIED$STATUS" - fi - if [[ "${INDEX}" =~ $'(^|\n)R ' ]]; then - STATUS="$ZSH_THEME_GIT_PROMPT_RENAMED$STATUS" - fi - if [[ "${INDEX}" =~ $'(^|\n)([A ]D|D ) ' ]]; then - STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS" - fi - if $(__git_prompt_git rev-parse --verify refs/stash >/dev/null 2>&1); then - STATUS="$ZSH_THEME_GIT_PROMPT_STASHED$STATUS" - fi - if [[ "${INDEX}" =~ $'(^|\n)UU ' ]]; then - STATUS="$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS" - fi - if [[ "${INDEX}" =~ $'(^|\n)## [^ ]\+ .*ahead' ]]; then - STATUS="$ZSH_THEME_GIT_PROMPT_AHEAD$STATUS" + # Maps a git status prefix to an internal constant + # This cannot use the prompt constants, as they may be empty + local -A prefix_constant_map + prefix_constant_map=( + '\?\? ' 'UNTRACKED' + 'A ' 'ADDED' + 'M ' 'ADDED' + 'MM ' 'ADDED' + ' M ' 'MODIFIED' + 'AM ' 'MODIFIED' + ' T ' 'MODIFIED' + 'R ' 'RENAMED' + ' D ' 'DELETED' + 'D ' 'DELETED' + 'UU ' 'UNMERGED' + 'ahead' 'AHEAD' + 'behind' 'BEHIND' + 'diverged' 'DIVERGED' + 'stashed' 'STASHED' + ) + + # Maps the internal constant to the prompt theme + local -A constant_prompt_map + constant_prompt_map=( + 'UNTRACKED' "$ZSH_THEME_GIT_PROMPT_UNTRACKED" + 'ADDED' "$ZSH_THEME_GIT_PROMPT_ADDED" + 'MODIFIED' "$ZSH_THEME_GIT_PROMPT_MODIFIED" + 'RENAMED' "$ZSH_THEME_GIT_PROMPT_RENAMED" + 'DELETED' "$ZSH_THEME_GIT_PROMPT_DELETED" + 'UNMERGED' "$ZSH_THEME_GIT_PROMPT_UNMERGED" + 'AHEAD' "$ZSH_THEME_GIT_PROMPT_AHEAD" + 'BEHIND' "$ZSH_THEME_GIT_PROMPT_BEHIND" + 'DIVERGED' "$ZSH_THEME_GIT_PROMPT_DIVERGED" + 'STASHED' "$ZSH_THEME_GIT_PROMPT_STASHED" + ) + + # The order that the prompt displays should be added to the prompt + local status_constants + status_constants=( + UNTRACKED ADDED MODIFIED RENAMED DELETED + STASHED UNMERGED AHEAD BEHIND DIVERGED + ) + + local status_text="$(__git_prompt_git status --porcelain -b 2> /dev/null)" + + # Don't continue on a catastrophic failure + if [[ $? -eq 128 ]]; then + return 1 fi - if [[ "${INDEX}" =~ $'(^|\n)## [^ ]\+ .*behind' ]]; then - STATUS="$ZSH_THEME_GIT_PROMPT_BEHIND$STATUS" + + # A lookup table of each git status encountered + local -A statuses_seen + + if __git_prompt_git rev-parse --verify refs/stash &>/dev/null; then + statuses_seen[STASHED]=1 fi - if [[ "${INDEX}" =~ $'(^|\n)## [^ ]\+ .*diverged' ]]; then - STATUS="$ZSH_THEME_GIT_PROMPT_DIVERGED$STATUS" + + local status_lines + status_lines=("${(@f)${status_text}}") + + # If the tracking line exists, get and parse it + if [[ "$status_lines[1]" =~ "^## [^ ]+ \[(.*)\]" ]]; then + local branch_statuses + branch_statuses=("${(@s/,/)match}") + for branch_status in $branch_statuses; do + if [[ ! $branch_status =~ "(behind|diverged|ahead) ([0-9]+)?" ]]; then + continue + fi + local last_parsed_status=$prefix_constant_map[$match[1]] + statuses_seen[$last_parsed_status]=$match[2] + done fi - echo $STATUS + + # For each status prefix, do a regex comparison + for status_prefix in ${(k)prefix_constant_map}; do + local status_constant="${prefix_constant_map[$status_prefix]}" + local status_regex=$'(^|\n)'"$status_prefix" + + if [[ "$status_text" =~ $status_regex ]]; then + statuses_seen[$status_constant]=1 + fi + done + + # Display the seen statuses in the order specified + local status_prompt + for status_constant in $status_constants; do + if (( ${+statuses_seen[$status_constant]} )); then + local next_display=$constant_prompt_map[$status_constant] + status_prompt="$next_display$status_prompt" + fi + done + + echo $status_prompt } # Outputs the name of the current user diff --git a/lib/history.zsh b/lib/history.zsh index 0ee8cfe7a..8d922a30b 100644 --- a/lib/history.zsh +++ b/lib/history.zsh @@ -36,4 +36,3 @@ setopt hist_expire_dups_first # delete duplicates first when HISTFILE size excee setopt hist_ignore_dups # ignore duplicated commands history list setopt hist_ignore_space # ignore commands that start with space setopt hist_verify # show command with history expansion to user before running it -setopt share_history # share command history data diff --git a/lib/nvm.zsh b/lib/nvm.zsh index 4a8b6811e..2fe57a8f4 100644 --- a/lib/nvm.zsh +++ b/lib/nvm.zsh @@ -1,9 +1,6 @@ -# get the node.js version +# get the nvm-controlled node.js version function nvm_prompt_info() { - [[ -f "$NVM_DIR/nvm.sh" ]] || return - local nvm_prompt - nvm_prompt=$(node -v 2>/dev/null) - [[ "${nvm_prompt}x" == "x" ]] && return - nvm_prompt=${nvm_prompt:1} + which nvm &>/dev/null || return + local nvm_prompt=${$(nvm current)#v} echo "${ZSH_THEME_NVM_PROMPT_PREFIX}${nvm_prompt}${ZSH_THEME_NVM_PROMPT_SUFFIX}" } diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh index 8cb2389e2..778f12bca 100644 --- a/lib/termsupport.zsh +++ b/lib/termsupport.zsh @@ -42,7 +42,7 @@ function title { } ZSH_THEME_TERM_TAB_TITLE_IDLE="%15<..<%~%<<" #15 char left truncated PWD -ZSH_THEME_TERM_TITLE_IDLE="%n@%m: %~" +ZSH_THEME_TERM_TITLE_IDLE="%n@%m:%~" # Avoid duplication of directory in terminals with independent dir display if [[ "$TERM_PROGRAM" == Apple_Terminal ]]; then ZSH_THEME_TERM_TITLE_IDLE="%n@%m" diff --git a/plugins/cargo/_cargo b/plugins/cargo/_cargo index 12694901e..ffc9fcdc8 100644 --- a/plugins/cargo/_cargo +++ b/plugins/cargo/_cargo @@ -12,8 +12,8 @@ _cargo() { '(-q --quiet)*'{-v,--verbose}'[use verbose output]' '(-q --quiet -v --verbose)'{-q,--quiet}'[no output printed to stdout]' '-Z+[pass unstable (nightly-only) flags to cargo]: :_cargo_unstable_flags' - '--frozen[require that Cargo.lock and cache are up-to-date]' - '--locked[require that Cargo.lock is up-to-date]' + '--frozen[require that Cargo.lock and cache are up to date]' + '--locked[require that Cargo.lock is up to date]' '--color=[specify colorization option]:coloring:(auto always never)' '(- 1 *)'{-h,--help}'[show help message]' ) diff --git a/plugins/emacs/emacs.plugin.zsh b/plugins/emacs/emacs.plugin.zsh index db0ab13af..0b602d12a 100644 --- a/plugins/emacs/emacs.plugin.zsh +++ b/plugins/emacs/emacs.plugin.zsh @@ -26,6 +26,16 @@ if "$ZSH/tools/require_tool.sh" emacsclient 24 2>/dev/null ; then # create a new X frame alias eframe='emacsclient --alternate-editor "" --create-frame' + # Emacs ANSI Term tracking + if [[ -n "$INSIDE_EMACS" ]]; then + chpwd_emacs() { print -P "\033AnSiTc %d"; } + print -P "\033AnSiTc %d" # Track current working directory + print -P "\033AnSiTu %n" # Track username + + # add chpwd hook + autoload -Uz add-zsh-hook + add-zsh-hook chpwd chpwd_emacs + fi # Write to standard output the path to the file # opened in the current buffer. diff --git a/plugins/fzf/README.md b/plugins/fzf/README.md index d9617563a..791a3eb6f 100644 --- a/plugins/fzf/README.md +++ b/plugins/fzf/README.md @@ -1,33 +1,52 @@ # fzf -This plugin enables [junegunn's fzf](https://github.com/junegunn/fzf) fuzzy auto-completion and key bindings +This plugin tries to find [junegunn's fzf](https://github.com/junegunn/fzf) based on where +it's been installed, and enables its fuzzy auto-completion and key bindings. To use it, add `fzf` to the plugins array in your zshrc file: + ```zsh plugins=(... fzf) ``` ## Settings -Add these before the `plugins=()` line in your zshrc file: +All these settings should go in your zshrc file, before Oh My Zsh is sourced. + +### `FZF_BASE` + +Set to fzf installation directory path: + +```zsh +export FZF_BASE=/path/to/fzf/install/dir +``` + +### `FZF_DEFAULT_COMMAND` + +Set default command to use when input is tty: ```zsh -# Set fzf installation directory path -# export FZF_BASE=/path/to/fzf/install/dir +export FZF_DEFAULT_COMMAND='<your fzf default commmand>' +``` + +If not set, the plugin will try to set it to these, in the order in which they're found: -# Uncomment to set the FZF_DEFAULT_COMMAND -# export FZF_DEFAULT_COMMAND='<your fzf default commmand>' +- [`rg`](https://github.com/BurntSushi/ripgrep) +- [`fd`](https://github.com/sharkdp/fd) +- [`ag`](https://github.com/ggreer/the_silver_searcher) -# Uncomment the following line to disable fuzzy completion -# DISABLE_FZF_AUTO_COMPLETION="true" +### `DISABLE_FZF_AUTO_COMPLETION` -# Uncomment the following line to disable key bindings (CTRL-T, CTRL-R, ALT-C) -# DISABLE_FZF_KEY_BINDINGS="true" +Set whether to load fzf auto-completion: + +```zsh +DISABLE_FZF_AUTO_COMPLETION="true" ``` -| Setting | Example value | Description | -|-----------------------------|----------------------------|-------------------------------------------------------------| -| FZF_BASE | `/path/to/fzf/install/dir` | Set fzf installation directory path (**export**) | -| FZF_DEFAULT_COMMAND | `fd --type f` | Set default command to use when input is tty (**export**) | -| DISABLE_FZF_AUTO_COMPLETION | `true` | Set whether to load fzf auto-completion | -| DISABLE_FZF_KEY_BINDINGS | `true` | Set whether to disable key bindings (CTRL-T, CTRL-R, ALT-C) | +### `DISABLE_FZF_KEY_BINDINGS` + +Set whether to disable key bindings (CTRL-T, CTRL-R, ALT-C): + +```zsh +DISABLE_FZF_KEY_BINDINGS="true" +``` diff --git a/plugins/fzf/fzf.plugin.zsh b/plugins/fzf/fzf.plugin.zsh index 0b831b7f7..2f48215d5 100644 --- a/plugins/fzf/fzf.plugin.zsh +++ b/plugins/fzf/fzf.plugin.zsh @@ -1,9 +1,5 @@ function setup_using_base_dir() { - # Declare all variables local not no mess with outside env in any way - local fzf_base - local fzf_shell - local fzfdirs - local dir + local fzf_base fzf_shell fzfdirs dir test -d "${FZF_BASE}" && fzf_base="${FZF_BASE}" @@ -31,38 +27,37 @@ function setup_using_base_dir() { fi fi - if [[ -d "${fzf_base}" ]]; then - # Fix fzf shell directory for Arch Linux, NixOS or Void Linux packages - if [[ ! -d "${fzf_base}/shell" ]]; then - fzf_shell="${fzf_base}" - else - fzf_shell="${fzf_base}/shell" - fi + if [[ ! -d "${fzf_base}" ]]; then + return 1 + fi - # Setup fzf binary path - if ! (( ${+commands[fzf]} )) && [[ ! "$PATH" == *$fzf_base/bin* ]]; then - export PATH="$PATH:$fzf_base/bin" - fi + # Fix fzf shell directory for Arch Linux, NixOS or Void Linux packages + if [[ ! -d "${fzf_base}/shell" ]]; then + fzf_shell="${fzf_base}" + else + fzf_shell="${fzf_base}/shell" + fi - # Auto-completion - if [[ ! "$DISABLE_FZF_AUTO_COMPLETION" == "true" ]]; then - [[ $- == *i* ]] && source "${fzf_shell}/completion.zsh" 2> /dev/null - fi + # Setup fzf binary path + if (( ! ${+commands[fzf]} )) && [[ "$PATH" != *$fzf_base/bin* ]]; then + export PATH="$PATH:$fzf_base/bin" + fi - # Key bindings - if [[ ! "$DISABLE_FZF_KEY_BINDINGS" == "true" ]]; then - source "${fzf_shell}/key-bindings.zsh" - fi - else - return 1 + # Auto-completion + if [[ -o interactive && "$DISABLE_FZF_AUTO_COMPLETION" != "true" ]]; then + source "${fzf_shell}/completion.zsh" 2> /dev/null + fi + + # Key bindings + if [[ "$DISABLE_FZF_KEY_BINDINGS" != "true" ]]; then + source "${fzf_shell}/key-bindings.zsh" fi } function setup_using_debian_package() { - (( $+commands[dpkg] )) && dpkg -s fzf &> /dev/null - if (( $? )); then - # Either not a debian based distro, or no fzf installed. In any case skip ahead + if (( ! $+commands[dpkg] )) || ! dpkg -s fzf &>/dev/null; then + # Either not a debian based distro, or no fzf installed return 1 fi @@ -76,8 +71,8 @@ function setup_using_debian_package() { local key_bindings="/usr/share/doc/fzf/examples/key-bindings.zsh" # Auto-completion - if [[ $- == *i* ]] && [[ ! "$DISABLE_FZF_AUTO_COMPLETION" == "true" ]]; then - source $completions 2> /dev/null + if [[ -o interactive && "$DISABLE_FZF_AUTO_COMPLETION" != "true" ]]; then + source $completions 2> /dev/null fi # Key bindings @@ -88,16 +83,74 @@ function setup_using_debian_package() { return 0 } +function setup_using_opensuse_package() { + # OpenSUSE installs fzf in /usr/bin/fzf + # If the command is not found, the package isn't installed + (( $+commands[fzf] )) || return 1 + + # The fzf-zsh-completion package installs the auto-completion in + local completions="/usr/share/zsh/site-functions/_fzf" + # The fzf-zsh-completion package installs the key-bindings file in + local key_bindings="/etc/zsh_completion.d/fzf-key-bindings" + + # If these are not found: (1) maybe we're not on OpenSUSE, or + # (2) maybe the fzf-zsh-completion package isn't installed. + if [[ ! -f "$completions" || ! -f "$key_bindings" ]]; then + return 1 + fi + + # Auto-completion + if [[ -o interactive && "$DISABLE_FZF_AUTO_COMPLETION" != "true" ]]; then + source "$completions" 2>/dev/null + fi + + # Key bindings + if [[ "$DISABLE_FZF_KEY_BINDINGS" != "true" ]]; then + source "$key_bindings" 2>/dev/null + fi + + return 0 +} + +function setup_using_openbsd_package() { + # openBSD installs fzf in /usr/local/bin/fzf + if [[ "$OSTYPE" != openbsd* ]] || (( ! $+commands[fzf] )); then + return 1 + fi + + # The fzf package installs the auto-completion in + local completions="/usr/local/share/zsh/site-functions/_fzf_completion" + # The fzf package installs the key-bindings file in + local key_bindings="/usr/local/share/zsh/site-functions/_fzf_key_bindings" + + # Auto-completion + if [[ -o interactive && "$DISABLE_FZF_AUTO_COMPLETION" != "true" ]]; then + source "$completions" 2>/dev/null + fi + + # Key bindings + if [[ "$DISABLE_FZF_KEY_BINDINGS" != "true" ]]; then + source "$key_bindings" 2>/dev/null + fi + + return 0 +} + function indicate_error() { - print "[oh-my-zsh] fzf plugin: Cannot find fzf installation directory.\n"\ - "Please add \`export FZF_BASE=/path/to/fzf/install/dir\` to your .zshrc" >&2 + cat >&2 <<EOF +[oh-my-zsh] fzf plugin: Cannot find fzf installation directory. +Please add \`export FZF_BASE=/path/to/fzf/install/dir\` to your .zshrc +EOF } -# Check for debian package first, because it easy to short cut # Indicate to user that fzf installation not found if nothing worked -setup_using_debian_package || setup_using_base_dir || indicate_error +setup_using_openbsd_package \ + || setup_using_debian_package \ + || setup_using_opensuse_package \ + || setup_using_base_dir \ + || indicate_error -unset -f setup_using_debian_package setup_using_base_dir indicate_error +unset -f setup_using_opensuse_package setup_using_debian_package setup_using_base_dir indicate_error if [[ -z "$FZF_DEFAULT_COMMAND" ]]; then if (( $+commands[rg] )); then diff --git a/plugins/git-lfs/README.md b/plugins/git-lfs/README.md new file mode 100644 index 000000000..1222b2767 --- /dev/null +++ b/plugins/git-lfs/README.md @@ -0,0 +1,24 @@ +# git lfs plugin + +The git lfs plugin provides [aliases](#aliases) and [functions](#functions) for [git-lfs](https://github.com/git-lfs/git-lfs). + +To use it, add `git-lfs` to the plugins array in your zshrc file: + +```zsh +plugins=(... git-lfs) +``` + +## Aliases + +| Alias | Command | +| :------- | :---------------------------------- | +| `glfsi` | `git lfs install` | +| `glfst` | `git lfs track` | +| `glfsls` | `git lfs ls-files` | +| `glfsmi` | `git lfs migrate import --include=` | + +## Functions + +| Function | Command | +| :------- | :---------------------------------------------- | +| `gplfs` | `git lfs push origin "$(current_branch)" --all` | diff --git a/plugins/git-lfs/git-lfs.plugin.zsh b/plugins/git-lfs/git-lfs.plugin.zsh new file mode 100644 index 000000000..e7bb67603 --- /dev/null +++ b/plugins/git-lfs/git-lfs.plugin.zsh @@ -0,0 +1,17 @@ +# +# Aliases +# + +alias glfsi='git lfs install' +alias glfst='git lfs track' +alias glfsls='git lfs ls-files' +alias glfsmi='git lfs migrate import --include=' + +# +# Functions +# + +function gplfs() { + local b="$(git_current_branch)" + git lfs push origin "$b" --all +} diff --git a/plugins/git-prompt/README.md b/plugins/git-prompt/README.md index e3b2d623a..83948f536 100644 --- a/plugins/git-prompt/README.md +++ b/plugins/git-prompt/README.md @@ -11,6 +11,9 @@ plugins=(... git-prompt) See the [original repository](https://github.com/olivierverdier/zsh-git-prompt). +## Prerequisites +This plugin uses `python`, so your host needs to have it installed + ## Examples The prompt may look like the following: diff --git a/plugins/globalias/README.md b/plugins/globalias/README.md index 0b064105d..cd7fc3cb2 100644 --- a/plugins/globalias/README.md +++ b/plugins/globalias/README.md @@ -17,6 +17,9 @@ Then just press `SPACE` to trigger the expansion of a command you've written. If you only want to insert a space without expanding the command line, press `CTRL`+`SPACE`. +if you would like to filter out any values from expanding set `GLOBALIAS_FILTER_VALUES` to +an array of said values. See [Filtered values](#filtered-values). + ## Examples #### Glob expressions @@ -37,7 +40,6 @@ $ ls folder/file.json anotherfolder/another.json $ mkdir "`date -R`" # expands to $ mkdir Tue,\ 04\ Oct\ 2016\ 13:54:03\ +0300 - ``` #### Aliases @@ -60,3 +62,18 @@ $ S<space> # expands to: $ sudo systemctl ``` + +#### Filtered values + +``` +# .zshrc +alias l='ls -lh' +alias la='ls --color=auto -lah' +GLOBALIAS_FILTER_VALUES=(l) + +$ l<space> +# does not expand +$ la<space> +# expands to: +$ ls --color=auto -lah +``` diff --git a/plugins/globalias/globalias.plugin.zsh b/plugins/globalias/globalias.plugin.zsh index 9602a9606..bd27d589d 100644 --- a/plugins/globalias/globalias.plugin.zsh +++ b/plugins/globalias/globalias.plugin.zsh @@ -1,6 +1,12 @@ globalias() { - zle _expand_alias - zle expand-word + # Get last word to the left of the cursor: + # (z) splits into words using shell parsing + # (A) makes it an array even if there's only one element + local word=${${(Az)LBUFFER}[-1]} + if [[ $GLOBALIAS_FILTER_VALUES[(Ie)$word] -eq 0 ]]; then + zle _expand_alias + zle expand-word + fi zle self-insert } zle -N globalias diff --git a/plugins/golang/golang.plugin.zsh b/plugins/golang/golang.plugin.zsh index 47b10988e..398bd966f 100644 --- a/plugins/golang/golang.plugin.zsh +++ b/plugins/golang/golang.plugin.zsh @@ -41,7 +41,7 @@ __go_tool_complete() { return fi build_flags=( - '-a[force reinstallation of packages that are already up-to-date]' + '-a[force reinstallation of packages that are already up to date]' '-n[print the commands but do not run them]' '-p[number of parallel builds]:number' '-race[enable data race detection]' diff --git a/plugins/kube-ps1/README.md b/plugins/kube-ps1/README.md index a14337278..b08997b0f 100644 --- a/plugins/kube-ps1/README.md +++ b/plugins/kube-ps1/README.md @@ -6,14 +6,6 @@ configured on `kubectl` to your Bash/Zsh prompt strings (i.e. the `$PS1`). Inspired by several tools used to simplify usage of `kubectl`. -![prompt](img/screenshot2.png) - -![prompt_sol_light](img/screenshot-sol-light.png) - -![prompt_img](img/screenshot-img.png) - -![prompt demo](img/kube-ps1.gif) - ## Installing ### MacOS diff --git a/plugins/kubectl/README.md b/plugins/kubectl/README.md index ee05a8af1..7a6cdaa59 100644 --- a/plugins/kubectl/README.md +++ b/plugins/kubectl/README.md @@ -22,7 +22,7 @@ plugins=(... kubectl) | kcsc | `kubectl config set-context` | Set a context entry in kubeconfig | | kcdc | `kubectl config delete-context` | Delete the specified context from the kubeconfig | | kccc | `kubectl config current-context` | Display the current-context | -| kcgc | `kubectl config get-contexts` | List of contexts available +| kcgc | `kubectl config get-contexts` | List of contexts available | | | **General aliases** | | kdel | `kubectl delete` | Delete resources by filenames, stdin, resources and names, or by resources and label selector | | kdelf | `kubectl delete -f` | Delete a pod using the type and name specified in -f argument | @@ -91,13 +91,13 @@ plugins=(... kubectl) | keno | `kubectl edit node` | Edit nodes resource from the default editor | | kdno | `kubectl describe node` | Describe node resource in detail | | kdelno | `kubectl delete node` | Delete the node | -| | | **Persistent Volume Claim management** | +| | | **Persistent Volume Claim management** | | kgpvc | `kubectl get pvc` | List all PVCs | | kgpvcw | `kgpvc --watch` | After listing/getting the requested object, watch for changes | | kepvc | `kubectl edit pvc` | Edit pvcs from the default editor | -| kdpvc | `kubectl describe pvc` | Descirbe all pvcs | +| kdpvc | `kubectl describe pvc` | Describe all pvcs | | kdelpvc | `kubectl delete pvc` | Delete all pvcs matching passed arguments | -| | | | +| | | **StatefulSets management** | | kgss | `kubectl get statefulset` | List the statefulsets in ps format | | kgssw | `kgss --watch` | After getting the list of statefulsets, watch for changes | | kgsswide| `kgss -o wide` | After getting the statefulsets, output in plain-text format with any additional information | @@ -106,3 +106,26 @@ plugins=(... kubectl) | kdelss | `kubectl delete statefulset` | Delete the statefulset | | ksss | `kubectl scale statefulset` | Scale a statefulset | | krsss | `kubectl rollout status statefulset`| Check the rollout status of a deployment | +| | | **Service Accounts management** | +| kgsa | `kubectl get sa` | List all service accounts | +| kdsa | `kubectl describe sa` | Describe a service account in details | +| kdelsa | `kubectl delete sa` | Delete the service account | +| | | **DaemonSet management** | +| kgds | `kubectl get daemonset` | List all DaemonSets in ps output format | +| kgdsw | `kgds --watch` | After listing all DaemonSets, watch for changes | +| keds | `kubectl edit daemonset` | Edit DaemonSets from the default editor | +| kdds | `kubectl describe daemonset` | Describe all DaemonSets in detail | +| kdelds | `kubectl delete daemonset` | Delete all DaemonSets matching passed argument | +| | | **CronJob management** | +| kgcj | `kubectl get cronjob` | List all CronJobs in ps output format | +| kecj | `kubectl edit cronjob` | Edit CronJob from the default editor | +| kdcj | `kubectl describe cronjob` | Describe a CronJob in details | +| kdelcj | `kubectl delete cronjob` | Delete the CronJob | + +## Wrappers + +This plugin provides 3 wrappers to colorize kubectl output in JSON and YAML using various tools (which must be installed): + +- `kj`: JSON, colorized with [`jq`](https://stedolan.github.io/jq/). +- `kjx`: JSON, colorized with [`fx`](https://github.com/antonmedv/fx). +- `ky`: YAML, colorized with [`yh`](https://github.com/andreazorzetto/yh). diff --git a/plugins/kubectl/kubectl.plugin.zsh b/plugins/kubectl/kubectl.plugin.zsh index 647d029c1..d509d8795 100644 --- a/plugins/kubectl/kubectl.plugin.zsh +++ b/plugins/kubectl/kubectl.plugin.zsh @@ -1,7 +1,7 @@ if (( $+commands[kubectl] )); then __KUBECTL_COMPLETION_FILE="${ZSH_CACHE_DIR}/kubectl_completion" - if [[ ! -f $__KUBECTL_COMPLETION_FILE ]]; then + if [[ ! -f $__KUBECTL_COMPLETION_FILE || ! -s $__KUBECTL_COMPLETION_FILE ]]; then kubectl completion zsh >! $__KUBECTL_COMPLETION_FILE fi @@ -150,3 +150,31 @@ alias kepvc='kubectl edit pvc' alias kdpvc='kubectl describe pvc' alias kdelpvc='kubectl delete pvc' +# Service account management. +alias kgsa="kubectl get sa" +alias kdsa="kubectl describe sa" +alias kdelsa="kubectl delete sa" + +# DaemonSet management. +alias kgds='kubectl get daemonset' +alias kgdsw='kgds --watch' +alias keds='kubectl edit daemonset' +alias kdds='kubectl describe daemonset' +alias kdelds='kubectl delete daemonset' + +# CronJob management. +alias kgcj='kubectl get cronjob' +alias kecj='kubectl edit cronjob' +alias kdcj='kubectl describe cronjob' +alias kdelcj='kubectl delete cronjob' + +# Only run if the user actually has kubectl installed +if (( ${+_comps[kubectl]} )); then + kj() { kubectl "$@" -o json | jq; } + kjx() { kubectl "$@" -o json | fx; } + ky() { kubectl "$@" -o yaml | yh; } + + compdef kj=kubectl + compdef kjx=kubectl + compdef ky=kubectl +fi diff --git a/plugins/lando/LICENSE b/plugins/lando/LICENSE new file mode 100644 index 000000000..1d4983163 --- /dev/null +++ b/plugins/lando/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Joshua Bedford + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.
\ No newline at end of file diff --git a/plugins/lando/README.md b/plugins/lando/README.md new file mode 100644 index 000000000..928a42bca --- /dev/null +++ b/plugins/lando/README.md @@ -0,0 +1,37 @@ +# Lando ZSH (lando-zsh) + +This plugin adds aliases for using various languages and frameworks with [Lando](https://docs.lando.dev/basics/) for Docker. It will only run within lando-driven project directories. + +To use it, add `lando` to the plugins array in your zshrc file: + +```zsh +plugins=(... lando) +``` + +## ALIASES: + +| Alias | Description | +|:----------:|:----------------:| +| `artisan` | `lando artisan` | +| `composer` | `lando composer` | +| `drush` | `lando drush` | +| `gulp` | `lando gulp` | +| `npm` | `lando npm` | +| `wp` | `lando wp` | +| `yarn` | `lando yarn` | + +## How It Works: + +This plugin removes the requirement to type `lando` before a command. It utilizes the lando version of supported commands run within directories with the following criteria: +- The `.lando.yml` file is found in the current directory or any parent directory within `$LANDO_ZSH_SITES_DIRECTORY`. +- The current directory is within `$LANDO_ZSH_SITES_DIRECTORY` but is not `$LANDO_ZSH_SITES_DIRECTORY` itself. + +## Settings: + +- `LANDO_ZSH_SITES_DIRECTORY`: The plugin will stop searching through parents for `CONFIG_FILE` once it hits this directory. +- `LANDO_ZSH_CONFIG_FILE`: The plugin will check to see if this provided file exists to check for presence of Lando. + +## Author: + +- Author: Joshua Bedford +- URL: [https://github.com/joshuabedford/lando-zsh](https://github.com/joshuabedford/lando-zsh) diff --git a/plugins/lando/lando.plugin.zsh b/plugins/lando/lando.plugin.zsh new file mode 100644 index 000000000..aa74c9924 --- /dev/null +++ b/plugins/lando/lando.plugin.zsh @@ -0,0 +1,40 @@ +# Settings +: ${LANDO_ZSH_SITES_DIRECTORY:="$HOME/Sites"} +: ${LANDO_ZSH_CONFIG_FILE:=.lando.yml} + +# Enable multiple commands with lando. +function artisan \ + composer \ + drush \ + gulp \ + npm \ + wp \ + yarn { + if checkForLandoFile; then + lando "$0" "$@" + else + command "$0" "$@" + fi +} + +# Check for the file in the current and parent directories. +checkForLandoFile() { + # Only bother checking for lando within the Sites directory. + if [[ "$PWD/" != "$LANDO_ZSH_SITES_DIRECTORY"/* ]]; then + # Not within $LANDO_ZSH_SITES_DIRECTORY + return 1 + fi + + local curr_dir="$PWD" + # Checking for file: $LANDO_ZSH_CONFIG_FILE within $LANDO_ZSH_SITES_DIRECTORY... + while [[ "$curr_dir" != "$LANDO_ZSH_SITES_DIRECTORY" ]]; do + if [[ -f "$curr_dir/$LANDO_ZSH_CONFIG_FILE" ]]; then + return 0 + fi + curr_dir="${curr_dir:h}" + done + + # Could not find $LANDO_ZSH_CONFIG_FILE in the current directory + # or in any of its parents up to $LANDO_ZSH_SITES_DIRECTORY. + return 1 +}
\ No newline at end of file diff --git a/plugins/mvn/README.md b/plugins/mvn/README.md index cbe7f30fa..815dfd57c 100644 --- a/plugins/mvn/README.md +++ b/plugins/mvn/README.md @@ -19,6 +19,7 @@ if it's found, or the mvn command otherwise. | `mvn!` | `mvn -f <root>/pom.xml` | | `mvnag` | `mvn archetype:generate` | | `mvnboot` | `mvn spring-boot:run` | +| `mvnqdev` | `mvn quarkus:dev` | | `mvnc` | `mvn clean` | | `mvncd` | `mvn clean deploy` | | `mvnce` | `mvn clean eclipse:clean eclipse:eclipse` | diff --git a/plugins/mvn/mvn.plugin.zsh b/plugins/mvn/mvn.plugin.zsh index 7cb94b42f..27d63a6f9 100644 --- a/plugins/mvn/mvn.plugin.zsh +++ b/plugins/mvn/mvn.plugin.zsh @@ -62,6 +62,7 @@ alias mvne='mvn eclipse:eclipse' alias mvnfmt='mvn fmt:format' alias mvnjetty='mvn jetty:run' alias mvnp='mvn package' +alias mvnqdev='mvn quarkus:dev' alias mvns='mvn site' alias mvnsrc='mvn dependency:sources' alias mvnt='mvn test' @@ -72,7 +73,7 @@ alias mvn-updates='mvn versions:display-dependency-updates' function listMavenCompletions { local file new_file - local -a profiles POM_FILES + local -a profiles POM_FILES modules # Root POM POM_FILES=(~/.m2/settings.xml) @@ -108,6 +109,9 @@ function listMavenCompletions { profiles+=($(sed 's/<!--.*-->//' "$file" | sed '/<!--/,/-->/d' | grep -e "<profile>" -A 1 | grep -e "<id>.*</id>" | sed 's?.*<id>\(.*\)<\/id>.*?-P\1?')) done + # List modules + modules=($(find **/pom.xml -type f | grep -v '/target/classes/META-INF/' | grep '/pom.xml' |sed 's|\(.*\)/pom\.xml|\1|')) + reply=( # common lifecycle clean initialize process-resources compile process-test-resources test-compile test package verify install deploy site @@ -184,6 +188,8 @@ function listMavenCompletions { tomee:run tomee:run-war tomee:run-war-only tomee:stop tomee:deploy tomee:undeploy # 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 # exec exec:exec exec:java # versions @@ -268,8 +274,8 @@ function listMavenCompletions { stage:copy # toolchain 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 + #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 # 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=" @@ -320,6 +326,7 @@ function listMavenCompletions { -Dit.test=$(if [ -d ./src/test/java ] ; then find ./src/test/java -type f -name '*.java' | grep -v svn | sed 's?.*/\([^/]*\)\..*?-Dit.test=\1?' ; fi) $profiles + $modules ) } diff --git a/plugins/npx/README.md b/plugins/npx/README.md index 1c052930b..41e4c1352 100644 --- a/plugins/npx/README.md +++ b/plugins/npx/README.md @@ -1,21 +1,15 @@ # NPX Plugin -> npx(1) -- execute npm package binaries. ([more info](https://github.com/zkat/npx)) -This plugin automatically registers npx command-not-found handler if `npx` exists in your `$PATH`. +> npx(1) -- execute npm package binaries. ([more info](https://github.com/npm/npx)) -## Setup +This plugin automatically registers npx command-not-found handler if `npx` exists in your `$PATH`. -- Add plugin to `~/.zshrc` +To use it, add `npx` to the plugins array in your zshrc file: -```bash +```zsh plugins=(.... npx) ``` -- Globally install npx binary (npx will be auto installed with recent versions of Node.js) -```bash -sudo npm install -g npx -``` - ## Note The shell auto-fallback doesn't auto-install plain packages. In order to get it to install something, you need to add `@`: @@ -29,3 +23,17 @@ Started It does it this way so folks using the fallback don't accidentally try to install regular typoes. +## Deprecation + +Since npm v7, `npx` has been moved to `npm exec`. With the move, [the `--shell-auto-fallback` argument +for `npx` has been removed](https://github.com/npm/cli/blob/v7.0.0/docs/content/cli-commands/npm-exec.md#compatibility-with-older-npx-versions): + +> Shell fallback functionality is removed, as it is not advisable. + +When using npm v7, you'll get this error: + +> npx: the --shell-auto-fallback argument has been removed + +If you get this error, just disable the plugin by removing it from the plugins array in your zshrc file. +This plugin will no longer be maintained and will be removed in the future, when the older `npx` versions +are no longer available. diff --git a/plugins/nvm/README.md b/plugins/nvm/README.md index 2515da9e8..749a43403 100644 --- a/plugins/nvm/README.md +++ b/plugins/nvm/README.md @@ -16,3 +16,11 @@ plugins=(... nvm) - **`NVM_HOMEBREW`**: if you installed nvm via Homebrew, in a directory other than `/usr/local/opt/nvm`, you can set `NVM_HOMEBREW` to be the directory where you installed it. + +- **`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 use the `--no-use` parameter when loading nvm, and will create a function + for `node`, `npm` and `yarn`, so when you call either of these three, nvm will load with `nvm use default`. + +- **`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. diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh index 2264a2420..1e9b26e7a 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -1,23 +1,77 @@ -# Set NVM_DIR if it isn't already defined -[[ -z "$NVM_DIR" ]] && export NVM_DIR="$HOME/.nvm" +# See https://github.com/nvm-sh/nvm#installation-and-update +if [[ -z "$NVM_DIR" ]]; then + if [[ -d "$HOME/.nvm" ]]; then + export NVM_DIR="$HOME/.nvm" + elif [[ -d "${XDG_CONFIG_HOME:-$HOME/.config}/nvm" ]]; then + export NVM_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/nvm" + fi +fi # Don't try to load nvm if command already available -type "nvm" &> /dev/null && return +which nvm &> /dev/null && return -# Load nvm if it exists in $NVM_DIR if [[ -f "$NVM_DIR/nvm.sh" ]]; then - source "$NVM_DIR/nvm.sh" + # Load nvm if it exists in $NVM_DIR + source "$NVM_DIR/nvm.sh" ${NVM_LAZY+"--no-use"} +else + # Otherwise try to load nvm installed via Homebrew + # User can set this if they have an unusual Homebrew setup + NVM_HOMEBREW="${NVM_HOMEBREW:-/usr/local/opt/nvm}" + # Load nvm from Homebrew location if it exists + if [[ -f "$NVM_HOMEBREW/nvm.sh" ]]; then + source "$NVM_HOMEBREW/nvm.sh" ${NVM_LAZY+"--no-use"} + else + # Exit the plugin if we couldn't find nvm return + fi fi -# Otherwise try to load nvm installed via Homebrew +# Call nvm when first using node, npm or yarn +if (( $+NVM_LAZY )); then + function node npm yarn { + unfunction node npm yarn + nvm use default + command "$0" "$@" + } +fi -# User can set this if they have an unusual Homebrew setup -NVM_HOMEBREW="${NVM_HOMEBREW:-/usr/local/opt/nvm}" -# Load nvm from Homebrew location if it exists -[[ -f "$NVM_HOMEBREW/nvm.sh" ]] && source "$NVM_HOMEBREW/nvm.sh" -# Load nvm bash completion from Homebrew if it exists -if [[ -f "$NVM_HOMEBREW/etc/bash_completion.d/nvm" ]]; then - autoload -U +X bashcompinit && bashcompinit - source "$NVM_HOMEBREW/etc/bash_completion.d/nvm" +# 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() { + local node_version="$(nvm version)" + local nvmrc_path="$(nvm_find_nvmrc)" + + if [[ -n "$nvmrc_path" ]]; then + local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")") + + if [[ "$nvmrc_node_version" = "N/A" ]]; then + nvm install + elif [[ "$nvmrc_node_version" != "$node_version" ]]; then + nvm use + fi + elif [[ "$node_version" != "$(nvm version default)" ]]; then + echo "Reverting to nvm default version" + nvm use default + fi + } + + autoload -U add-zsh-hook + add-zsh-hook chpwd load-nvmrc + + load-nvmrc fi + +# Load nvm bash completion +for nvm_completion in "$NVM_DIR/bash_completion" "$NVM_HOMEBREW/etc/bash_completion.d/nvm"; do + if [[ -f "$nvm_completion" ]]; then + # Load bashcompinit + autoload -U +X bashcompinit && bashcompinit + # Bypass compinit call in nvm bash completion script. See: + # https://github.com/nvm-sh/nvm/blob/4436638/bash_completion#L86-L93 + ZSH_VERSION= source "$nvm_completion" + break + fi +done + +unset NVM_HOMEBREW NVM_LAZY NVM_AUTOLOAD nvm_completion diff --git a/plugins/safe-paste/safe-paste.plugin.zsh b/plugins/safe-paste/safe-paste.plugin.zsh index 75f1791d7..d443ae8a2 100644 --- a/plugins/safe-paste/safe-paste.plugin.zsh +++ b/plugins/safe-paste/safe-paste.plugin.zsh @@ -1,54 +1,100 @@ +# A good summary of the zsh 5.1 Bracketed Paste Mode changes is at: +# https://archive.zhimingwang.org/blog/2015-09-21-zsh-51-and-bracketed-paste.html + +# zsh 5.1 (September 2015) introduced built-in support for Bracketed Paste Mode +# https://github.com/zsh-users/zsh/blob/68405f31a043bdd5bf338eb06688ed3e1f740937/README#L38-L45 +# +# zsh 5.1 breaks url-quote-magic and other widgets replacing self-insert +# zsh-users' bracketed-paste-magic resolves these issues: +# https://github.com/zsh-users/zsh/blob/f702e17b14d75aa21bff014168fa9048124db286/Functions/Zle/bracketed-paste-magic#L9-L12 + +# Load bracketed-paste-magic if zsh version is >= 5.1 +if [[ ${ZSH_VERSION:0:3} -ge 5.1 ]]; then + set zle_bracketed_paste # Explicitly restore this zsh default + autoload -Uz bracketed-paste-magic + zle -N bracketed-paste bracketed-paste-magic + return ### The rest of this file is NOT executed on zsh version >= 5.1 ### +fi + +###################################################################### +# The rest of this file is ONLY executed if zsh version < 5.1 +###################################################################### + # Code from Mikael Magnusson: https://www.zsh.org/mla/users/2011/msg00367.html # -# Requires xterm, urxvt, iTerm2 or any other terminal that supports bracketed -# paste mode as documented: https://www.xfree86.org/current/ctlseqs.html - -# create a new keymap to use while pasting -bindkey -N paste -# make everything in this keymap call our custom widget -bindkey -R -M paste "^@"-"\M-^?" paste-insert -# these are the codes sent around the pasted text in bracketed -# paste mode. -# do the first one with both -M viins and -M vicmd in vi mode -bindkey '^[[200~' _start_paste -bindkey -M paste '^[[201~' _end_paste -# insert newlines rather than carriage returns when pasting newlines -bindkey -M paste -s '^M' '^J' - -zle -N _start_paste -zle -N _end_paste -zle -N zle-line-init _zle_line_init -zle -N zle-line-finish _zle_line_finish -zle -N paste-insert _paste_insert - -# switch the active keymap to paste mode -function _start_paste() { - bindkey -A paste main +# Requires xterm, urxvt, iTerm2 or any other terminal that supports +# Bracketed Paste Mode as documented: +# https://www.xfree86.org/current/ctlseqs.html#Bracketed%20Paste%20Mode +# +# For tmux, use: bind ] paste-buffer -p +# +# Additional technical details: https://cirw.in/blog/bracketed-paste + +# Create a new keymap to use while pasting +bindkey -N bracketed-paste +# Make everything in this new keymap enqueue characters for pasting +bindkey -RM bracketed-paste '\x00-\xFF' bracketed-paste-enqueue +# These are the codes sent around the pasted text in bracketed paste mode +bindkey -M main '^[[200~' _bracketed_paste_begin +bindkey -M bracketed-paste '^[[201~' _bracketed_paste_end +# Insert newlines rather than carriage returns when pasting newlines +bindkey -M bracketed-paste -s '^M' '^J' + +zle -N _bracketed_paste_begin +zle -N _bracketed_paste_end +zle -N bracketed-paste-enqueue _bracketed_paste_enqueue + +# Attempt to not clobber zle_line_{init,finish} +# Use https://github.com/willghatch/zsh-hooks if available +if typeset -f hooks-add-hook > /dev/null; then + hooks-add-hook zle_line_init_hook _bracketed_paste_zle_init + hooks-add-hook zle_line_finish_hook _bracketed_paste_zle_finish +else + zle -N zle-line-init _bracketed_paste_zle_init + zle -N zle-line-finish _bracketed_paste_zle_finish +fi + +# Switch the active keymap to paste mode +_bracketed_paste_begin() { + # Save the bindkey command to restore the active ("main") keymap + # Tokenise the restorative bindkey command into an array + _bracketed_paste_restore_keymap=( ${(z)"$(bindkey -lL main)"} ) + bindkey -A bracketed-paste main } -# go back to our normal keymap, and insert all the pasted text in the -# command line. this has the nice effect of making the whole paste be +# Go back to our normal keymap, and insert all the pasted text in the +# command line. This has the nice effect of making the whole paste be # a single undo/redo event. -function _end_paste() { -#use bindkey -v here with vi mode probably. maybe you want to track -#if you were in ins or cmd mode and restore the right one. - bindkey -e - LBUFFER+=$_paste_content - unset _paste_content +_bracketed_paste_end() { + # Only execute the restore command if it starts with 'bindkey' + # Allow for option KSH_ARRAYS being set (indexing starts at 0) + if [ ${_bracketed_paste_restore_keymap[@]:0:1} = 'bindkey' ]; then + $_bracketed_paste_restore_keymap + fi + LBUFFER+=$_bracketed_paste_content + unset _bracketed_paste_content _bracketed_paste_restore_keymap } -function _paste_insert() { - _paste_content+=$KEYS +# Append a pasted character to the content which is later inserted as a whole +_bracketed_paste_enqueue() { + _bracketed_paste_content+=$KEYS } -function _zle_line_init() { - # Tell terminal to send escape codes around pastes. - [[ $TERM == rxvt-unicode || $TERM == xterm || $TERM = xterm-256color || $TERM = screen || $TERM = screen-256color ]] && printf '\e[?2004h' +# Run at zle-line-init +_bracketed_paste_zle_init() { + _bracketed_paste_content='' + # Tell terminal to send escape codes around pastes + if [[ $TERM =~ '^(rxvt-unicode|xterm(-256color)?|screen(-256color)?)$' ]]; then + printf '\e[?2004h' + fi } -function _zle_line_finish() { - # Tell it to stop when we leave zle, so pasting in other programs - # doesn't get the ^[[200~ codes around the pasted text. - [[ $TERM == rxvt-unicode || $TERM == xterm || $TERM = xterm-256color || $TERM = screen || $TERM = screen-256color ]] && printf '\e[?2004l' +# Run at zle-line-finish +_bracketed_paste_zle_finish() { + # Turn off bracketed paste when we leave ZLE, so pasting in other programs + # doesn't get the ^[[200~ codes around the pasted text + if [[ $TERM =~ '^(rxvt-unicode|xterm(-256color)?|screen(-256color)?)$' ]]; then + printf '\e[?2004l' + fi } diff --git a/plugins/systemadmin/README.md b/plugins/systemadmin/README.md index edca4d87d..243db03f2 100644 --- a/plugins/systemadmin/README.md +++ b/plugins/systemadmin/README.md @@ -16,8 +16,8 @@ plugins=(... systemadmin) | clr | `clear; echo Currently logged in on $TTY, as $USER in directory $PWD.` | Clears the screen and prints the current user, TTY, and directory | | path | `print -l $path` | Displays PATH with each entry on a separate line | | mkdir | `mkdir -pv` | Automatically create parent directories and display verbose output | -| psmem | `ps -e -orss=,args= \| sort -b -k1,1n` | Display the processes using the most memory | -| psmem10 | `ps -e -orss=,args= \| sort -b -k1,1n \| head -10` | Display the top 10 processes using the most memory | +| psmem | `ps -e -orss=,args= \| sort -b -k1 -nr` | Display the processes using the most memory | +| psmem10 | `ps -e -orss=,args= \| sort -b -k1 -nr \| head -10` | Display the top 10 processes using the most memory | | pscpu | `ps -e -o pcpu,cpu,nice,state,cputime,args \|sort -k1 -nr` | Display the top processes using the most CPU | | pscpu10 | `ps -e -o pcpu,cpu,nice,state,cputime,args \|sort -k1 -nr \| head -10` | Display the top 10 processes using the most CPU | | hist10 | `print -l ${(o)history%% *} \| uniq -c \| sort -nr \| head -n 10` | Display the top 10 most used commands in the history | diff --git a/plugins/systemadmin/systemadmin.plugin.zsh b/plugins/systemadmin/systemadmin.plugin.zsh index ded25c3a9..03064c035 100644 --- a/plugins/systemadmin/systemadmin.plugin.zsh +++ b/plugins/systemadmin/systemadmin.plugin.zsh @@ -25,8 +25,8 @@ alias clr='clear; echo Currently logged in on $TTY, as $USER in directory $PWD.' alias path='print -l $path' alias mkdir='mkdir -pv' # get top process eating memory -alias psmem='ps -e -orss=,args= | sort -b -k1,1n' -alias psmem10='ps -e -orss=,args= | sort -b -k1,1n| head -10' +alias psmem='ps -e -orss=,args= | sort -b -k1 -nr' +alias psmem10='ps -e -orss=,args= | sort -b -k1 -nr | head -10' # get top process eating cpu if not work try excute : 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 -10' diff --git a/plugins/wd/wd.sh b/plugins/wd/wd.sh index d5d38f25b..9085c5b7b 100644 --- a/plugins/wd/wd.sh +++ b/plugins/wd/wd.sh @@ -71,7 +71,7 @@ wd_print_msg() wd_print_usage() { - cat <<- EOF + command cat <<- EOF Usage: wd [command] [point] Commands: @@ -175,9 +175,9 @@ wd_add() elif [[ $point =~ "[[:space:]]+" ]] then wd_exit_fail "Warp point should not contain whitespace" - elif [[ $point == *:* ]] + elif [[ $point =~ : ]] || [[ $point =~ / ]] then - wd_exit_fail "Warp point cannot contain colons" + wd_exit_fail "Warp point contains illegal character (:/)" elif [[ ${points[$point]} == "" ]] || [ ! -z "$force" ] then wd_remove "$point" > /dev/null @@ -185,7 +185,7 @@ wd_add() if (whence sort >/dev/null); then local config_tmp=$(mktemp "${TMPDIR:-/tmp}/wd.XXXXXXXXXX") # use 'cat' below to ensure we respect $WD_CONFIG as a symlink - sort -o "${config_tmp}" "$WD_CONFIG" && cat "${config_tmp}" > "$WD_CONFIG" && rm "${config_tmp}" + command sort -o "${config_tmp}" "$WD_CONFIG" && command cat "${config_tmp}" > "$WD_CONFIG" && command rm "${config_tmp}" fi wd_export_static_named_directories @@ -270,7 +270,7 @@ wd_ls() wd_path() { wd_getdir "$1" - echo "$(echo "$dir" | sed "s:${HOME}:~:g")" + echo "$(echo "$dir" | sed "s:~:${HOME}:g")" } wd_show() diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme index b658adac0..90e603ccc 100644 --- a/themes/agnoster.zsh-theme +++ b/themes/agnoster.zsh-theme @@ -131,7 +131,7 @@ prompt_git() { zstyle ':vcs_info:*' get-revision true zstyle ':vcs_info:*' check-for-changes true zstyle ':vcs_info:*' stagedstr '✚' - zstyle ':vcs_info:*' unstagedstr '●' + zstyle ':vcs_info:*' unstagedstr '±' zstyle ':vcs_info:*' formats ' %u%c' zstyle ':vcs_info:*' actionformats ' %u%c' vcs_info |