summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/bundler/bundler.plugin.zsh1
-rw-r--r--plugins/capistrano/_capistrano6
-rw-r--r--plugins/capistrano/capistrano.plugin.zsh2
-rw-r--r--plugins/dircycle/dircycle.plugin.zsh16
-rw-r--r--plugins/github/README.md46
-rw-r--r--plugins/github/_github40
-rw-r--r--plugins/github/github.plugin.zsh101
-rw-r--r--plugins/gradle/gradle.plugin.zsh40
-rw-r--r--plugins/history-substring-search/README.markdown7
-rw-r--r--plugins/history-substring-search/README.md149
-rw-r--r--plugins/history-substring-search/history-substring-search.plugin.zsh15
-rw-r--r--plugins/history-substring-search/history-substring-search.zsh321
-rwxr-xr-xplugins/history-substring-search/update-from-upstream.zsh127
-rw-r--r--plugins/mercurial/README.md24
-rwxr-xr-xplugins/wd/wd.sh28
-rw-r--r--plugins/wp-cli/README.md4
-rw-r--r--plugins/wp-cli/wp-cli.plugin.zsh4
-rw-r--r--plugins/z/README43
-rw-r--r--plugins/z/z.135
-rw-r--r--plugins/z/z.sh425
20 files changed, 832 insertions, 602 deletions
diff --git a/plugins/bundler/bundler.plugin.zsh b/plugins/bundler/bundler.plugin.zsh
index dfff6956e..382a1a471 100644
--- a/plugins/bundler/bundler.plugin.zsh
+++ b/plugins/bundler/bundler.plugin.zsh
@@ -2,6 +2,7 @@ alias be="bundle exec"
alias bl="bundle list"
alias bp="bundle package"
alias bo="bundle open"
+alias bout="bundle outdated"
alias bu="bundle update"
alias bi="bundle_install"
alias bcn="bundle clean"
diff --git a/plugins/capistrano/_capistrano b/plugins/capistrano/_capistrano
index c19c20b7a..a79e47b2f 100644
--- a/plugins/capistrano/_capistrano
+++ b/plugins/capistrano/_capistrano
@@ -1,7 +1,7 @@
-#compdef shipit
+#compdef capit
#autoload
-# Added `shipit` because `cap` is a reserved word. `cap` completion doesn't work.
+# Added `capit` because `cap` is a reserved word. `cap` completion doesn't work.
# http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module
local curcontext="$curcontext" state line ret=1
@@ -14,7 +14,7 @@ _arguments -C \
_cap_tasks() {
if [[ -f config/deploy.rb || -f Capfile ]]; then
if [[ ! -f .cap_tasks~ ]]; then
- shipit --tasks | sed 's/\(\[\)\(.*\)\(\]\)/\2:/' | awk '{command=$2; $1=$2=$3=""; gsub(/^[ \t\r\n]+/, "", $0); gsub(":", "\\:", command); print command"["$0"]"}' > .cap_tasks~
+ capit --tasks | sed 's/\(\[\)\(.*\)\(\]\)/\2:/' | awk '{command=$2; $1=$2=$3=""; gsub(/^[ \t\r\n]+/, "", $0); gsub(":", "\\:", command); print command"["$0"]"}' > .cap_tasks~
fi
OLD_IFS=$IFS
diff --git a/plugins/capistrano/capistrano.plugin.zsh b/plugins/capistrano/capistrano.plugin.zsh
index c85eb474c..0b5559791 100644
--- a/plugins/capistrano/capistrano.plugin.zsh
+++ b/plugins/capistrano/capistrano.plugin.zsh
@@ -1,7 +1,7 @@
# Added `shipit` because `cap` is a reserved word. `cap` completion doesn't work.
# http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module
-func shipit() {
+func capit() {
if [ -f Gemfile ]
then
bundle exec cap $*
diff --git a/plugins/dircycle/dircycle.plugin.zsh b/plugins/dircycle/dircycle.plugin.zsh
index 1e31105b1..8a406b54d 100644
--- a/plugins/dircycle/dircycle.plugin.zsh
+++ b/plugins/dircycle/dircycle.plugin.zsh
@@ -27,11 +27,11 @@ insert-cycledright () {
zle -N insert-cycledright
-# add key bindings for iTerm2
-if [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then
- bindkey "^[[1;6D" insert-cycledleft
- bindkey "^[[1;6C" insert-cycledright
-else
- bindkey "\e[1;6D" insert-cycledleft
- bindkey "\e[1;6C" insert-cycledright
-fi \ No newline at end of file
+# These sequences work for xterm, Apple Terminal.app, and probably others.
+# Not for rxvt-unicode, but it doesn't seem differentiate Ctrl-Shift-Arrow
+# from plain Shift-Arrow, at least by default.
+# iTerm2 does not have these key combinations defined by default; you will need
+# to add them under "Keys" in your profile if you want to use this. You can do
+# this conveniently by loading the "xterm with Numeric Keypad" preset.
+bindkey "\e[1;6D" insert-cycledleft
+bindkey "\e[1;6C" insert-cycledright
diff --git a/plugins/github/README.md b/plugins/github/README.md
new file mode 100644
index 000000000..21b7367f7
--- /dev/null
+++ b/plugins/github/README.md
@@ -0,0 +1,46 @@
+# github
+
+This plugin supports working with GitHub the command line. It provides a few things:
+
+* Sets up the `hub` wrapper and completions for the `git` command if you have `hub` installed.
+* Completion for the `github` Ruby gem.
+* Convenience functions for working with repos and URLs.
+
+### Functions
+
+* `empty_gh` - Creates a new empty repo (with a `README.md`) and pushes it to GitHub
+* `new_gh` - Initializes an existing directory as a repo and pushes it to GitHub
+* `exist_gh` - Takes an existing repo and pushes it to GitHub
+* `git.io` - Shortens a URL using [git.io](http://git.io)
+
+
+## Installation
+
+[Hub](http://github.com/github/hub) needs to be installed if you want to use it. On OS X with Homebrew, this can be done with `brew install hub`. The `hub` completion definition needs to be added to your `$FPATH` before initializing OMZ.
+
+The [`github` Ruby gem](http://github.com/defunkt/github-gem) needs to be installed if you want to use it.
+
+### Configuration
+
+These settings affect `github`'s behavior.
+
+#### Environment variables
+
+* `$GITHUB_USER`
+* `$GITHUB_PASSWORD`
+
+#### Git configuration options
+
+* `github.user` - GitHub username for repo operations
+
+See `man hub` for more details.
+
+### Homebrew installation note
+
+If you have installed `hub` using Homebrew, its completions may not be on your `$FPATH` if you are using the system `zsh`. Homebrew installs `zsh` completion definitions to `/usr/local/share/zsh/site-functions`, which on `$FPATH` for the Homebrew-installed `zsh`, but not for the system `zsh`. If you want it to work with the system `zsh`, add this to your `~/.zshrc` before it sources `oh-my-zsh.sh`.
+
+```zsh
+if (( ! ${fpath[(I)/usr/local/share/zsh/site-functions]} )); then
+ FPATH=/usr/local/share/zsh/site-functions:$FPATH
+fi
+```
diff --git a/plugins/github/_github b/plugins/github/_github
deleted file mode 100644
index 83e1713c7..000000000
--- a/plugins/github/_github
+++ /dev/null
@@ -1,40 +0,0 @@
-#compdef github
-#autoload
-
-# in order to make this work, you will need to have the github gem installed
-# http://github.com/defunkt/github-gem
-
-# github zsh completion, based on homebrew completion
-
-local -a _1st_arguments
-_1st_arguments=(
- 'browse:Open this repo in a web browser'
- 'clone:Clone a repo'
- 'config:Automatically set configuration info, or pass args to specify'
- 'create-from-local:Create a new GitHub repository from the current local repository'
- 'create:Create a new empty GitHub repository'
- 'fetch:Fetch from a remote to a local branch'
- 'fetch_all:Fetch all refs from a user'
- 'fork:Forks a GitHub repository'
- 'home:Open this repos master branch in a web browser'
- 'ignore:Ignore a SHA from github network commits'
- 'info:Info about this project'
- 'issues:Project issues tools'
- 'network:Project network tools - sub-commands : web [user], list, fetch, commits'
- 'open:Open the given user/project in a web browser'
- 'pull-request:Generate the text for a pull request'
- 'pull:Pull from a remote'
- 'search:Search GitHub for the given repository name'
- 'track:Track another users repository'
-)
-
-local expl
-local -a pkgs installed_pkgs
-
-_arguments \
- '*:: :->subcmds' && return 0
-
-if (( CURRENT == 1 )); then
- _describe -t commands "github subcommand" _1st_arguments
- return
-fi
diff --git a/plugins/github/github.plugin.zsh b/plugins/github/github.plugin.zsh
index bd69b1bd5..ca19901fd 100644
--- a/plugins/github/github.plugin.zsh
+++ b/plugins/github/github.plugin.zsh
@@ -1,56 +1,25 @@
-# Setup hub function for git, if it is available; http://github.com/defunkt/hub
-if [ "$commands[(I)hub]" ] && [ "$commands[(I)ruby]" ]; then
- # Autoload _git completion functions
- if declare -f _git > /dev/null; then
- _git
- fi
-
- if declare -f _git_commands > /dev/null; then
- _hub_commands=(
- 'alias:show shell instructions for wrapping git'
- 'pull-request:open a pull request on GitHub'
- 'fork:fork origin repo on GitHub'
- 'create:create new repo on GitHub for the current project'
- 'browse:browse the project on GitHub'
- 'compare:open GitHub compare view'
- )
- # Extend the '_git_commands' function with hub commands
- eval "$(declare -f _git_commands | sed -e 's/base_commands=(/base_commands=(${_hub_commands} /')"
- fi
- # eval `hub alias -s zsh`
- function git(){
- if ! (( $+_has_working_hub )); then
- hub --version &> /dev/null
- _has_working_hub=$(($? == 0))
- fi
- if (( $_has_working_hub )) ; then
- hub "$@"
- else
- command git "$@"
- fi
- }
+# Set up hub wrapper for git, if it is available; http://github.com/github/hub
+if [ "$commands[(I)hub]" ]; then
+ if hub --version &>/dev/null; then
+ eval $(hub alias -s zsh)
+ fi
fi
# Functions #################################################################
-# https://github.com/dbb
+# Based on https://github.com/dbb/githome/blob/master/.config/zsh/functions
-
-# empty_gh [NAME_OF_REPO]
+# empty_gh <NAME_OF_REPO>
#
# Use this when creating a new repo from scratch.
+# Creates a new repo with a blank README.md in it and pushes it up to GitHub.
empty_gh() { # [NAME_OF_REPO]
- repo=$1
- ghuser=$( git config github.user )
+ emulate -L zsh
+ local repo=$1
- mkdir "$repo"
- cd "$repo"
- git init
- touch README
- git add README
- git commit -m 'Initial commit.'
- git remote add origin git@github.com:${ghuser}/${repo}.git
- git push -u origin master
+ mkdir "$repo"
+ touch "$repo/README.md"
+ new_gh "$repo"
}
# new_gh [DIRECTORY]
@@ -58,16 +27,25 @@ empty_gh() { # [NAME_OF_REPO]
# Use this when you have a directory that is not yet set up for git.
# This function will add all non-hidden files to git.
new_gh() { # [DIRECTORY]
- cd "$1"
- ghuser=$( git config github.user )
+ emulate -L zsh
+ local repo="$1"
+ cd "$repo" \
+ || return
- git init
- # add all non-dot files
- print '.*'"\n"'*~' >> .gitignore
- git add ^.*
- git commit -m 'Initial commit.'
- git remote add origin git@github.com:${ghuser}/${repo}.git
- git push -u origin master
+ git init \
+ || return
+ # add all non-dot files
+ print '.*'"\n"'*~' >> .gitignore
+ git add [^.]* \
+ || return
+ git add .gitignore \
+ || return
+ git commit -m 'Initial commit.' \
+ || return
+ hub create \
+ || return
+ git push -u origin master \
+ || return
}
# exist_gh [DIRECTORY]
@@ -75,13 +53,13 @@ new_gh() { # [DIRECTORY]
# Use this when you have a git repo that's ready to go and you want to add it
# to your GitHub.
exist_gh() { # [DIRECTORY]
- cd "$1"
- name=$( git config user.name )
- ghuser=$( git config github.user )
- repo=$1
+ emulate -L zsh
+ local repo=$1
+ cd "$repo"
- git remote add origin git@github.com:${ghuser}/${repo}.git
- git push -u origin master
+ hub create \
+ || return
+ git push -u origin master
}
# git.io "GitHub URL"
@@ -91,7 +69,10 @@ exist_gh() { # [DIRECTORY]
# source: https://github.com/nvogel/dotzsh
# documentation: https://github.com/blog/985-git-io-github-url-shortener
#
-git.io() {curl -i -s http://git.io -F "url=$1" | grep "Location" | cut -f 2 -d " "}
+git.io() {
+ emulate -L zsh
+ curl -i -s http://git.io -F "url=$1" | grep "Location" | cut -f 2 -d " "
+}
# End Functions #############################################################
diff --git a/plugins/gradle/gradle.plugin.zsh b/plugins/gradle/gradle.plugin.zsh
index 661c29d5b..a908eaeaa 100644
--- a/plugins/gradle/gradle.plugin.zsh
+++ b/plugins/gradle/gradle.plugin.zsh
@@ -1,4 +1,3 @@
-#!zsh
##############################################################################
# A descriptive listing of core Gradle commands
############################################################################
@@ -54,22 +53,11 @@ function _gradle_arguments() {
##############################################################################
-# Are we in a directory containing a build.gradle file?
-############################################################################
-function in_gradle() {
- if [[ -f build.gradle ]]; then
- echo 1
- fi
-}
-
-############################################################################## Examine the build.gradle file to see if its
-# timestamp has changed, and if so, regen
-# the .gradle_tasks cache file
+# Examine the build.gradle file to see if its timestamp has changed;
+# and if so, regenerate the .gradle_tasks cache file
############################################################################
_gradle_does_task_list_need_generating () {
- [ ! -f .gradletasknamecache ] && return 0;
- [ build.gradle -nt .gradletasknamecache ] && return 0;
- return 1;
+ [[ ! -f .gradletasknamecache ]] || [[ build.gradle -nt .gradletasknamecache ]]
}
@@ -77,22 +65,22 @@ _gradle_does_task_list_need_generating () {
# Discover the gradle tasks by running "gradle tasks --all"
############################################################################
_gradle_tasks () {
- if [ in_gradle ]; then
+ if [[ -f build.gradle ]]; then
_gradle_arguments
if _gradle_does_task_list_need_generating; then
- gradle tasks --all | grep "^[ ]*[a-zA-Z0-9:]*\ -\ " | sed "s/ - .*$//" | sed "s/[\ ]*//" > .gradletasknamecache
+ gradle tasks --all | awk '/[a-zA-Z0-9:-]* - / {print $1}' > .gradletasknamecache
fi
- compadd -X "==== Gradle Tasks ====" `cat .gradletasknamecache`
+ compadd -X "==== Gradle Tasks ====" $(cat .gradletasknamecache)
fi
}
_gradlew_tasks () {
- if [ in_gradle ]; then
+ if [[ -f build.gradle ]]; then
_gradle_arguments
if _gradle_does_task_list_need_generating; then
- ./gradlew tasks --all | grep "^[ ]*[a-zA-Z0-9:]*\ -\ " | sed "s/ - .*$//" | sed "s/[\ ]*//" > .gradletasknamecache
+ ./gradlew tasks --all | awk '/[a-zA-Z0-9:-]* - / {print $1}' > .gradletasknamecache
fi
- compadd -X "==== Gradlew Tasks ====" `cat .gradletasknamecache`
+ compadd -X "==== Gradlew Tasks ====" $(cat .gradletasknamecache)
fi
}
@@ -102,13 +90,3 @@ _gradlew_tasks () {
############################################################################
compdef _gradle_tasks gradle
compdef _gradlew_tasks gradlew
-
-
-##############################################################################
-# Open questions for future improvements:
-# 1) Should 'gradle tasks' use --all or just the regular set?
-# 2) Should gradlew use the same approach as gradle?
-# 3) Should only the " - " be replaced with a colon so it can work
-# with the richer descriptive method of _arguments?
-# gradle tasks | grep "^[a-zA-Z0-9]*\ -\ " | sed "s/ - /\:/"
-#############################################################################
diff --git a/plugins/history-substring-search/README.markdown b/plugins/history-substring-search/README.markdown
deleted file mode 100644
index c154afdce..000000000
--- a/plugins/history-substring-search/README.markdown
+++ /dev/null
@@ -1,7 +0,0 @@
-To activate this script, please include it the `plugins` variable within `~/.zshrc`
-
- `plugins=(git history-substring-search)`
-
-See the "history-substring-search.zsh" file for more information:
-
- `sed -n '2,/^$/s/^#//p' history-substring-search.zsh | more`
diff --git a/plugins/history-substring-search/README.md b/plugins/history-substring-search/README.md
new file mode 100644
index 000000000..0c02e91b1
--- /dev/null
+++ b/plugins/history-substring-search/README.md
@@ -0,0 +1,149 @@
+zsh-history-substring-search
+==============================================================================
+
+This is a clean-room implementation of the [Fish shell][1]'s history search
+feature, where you can type in any part of any previously entered command
+and press the UP and DOWN arrow keys to cycle through the matching commands.
+You can also use K and J in VI mode or ^P and ^N in EMACS mode for the same.
+
+[1]: http://fishshell.com
+[2]: http://www.zsh.org/mla/users/2009/msg00818.html
+[3]: http://sourceforge.net/projects/fizsh/
+[4]: https://github.com/robbyrussell/oh-my-zsh/pull/215
+[5]: https://github.com/zsh-users/zsh-history-substring-search
+[6]: https://github.com/zsh-users/zsh-syntax-highlighting
+
+------------------------------------------------------------------------------
+Requirements
+------------------------------------------------------------------------------
+
+* [ZSH](http://zsh.sourceforge.net) 4.3 or newer
+
+------------------------------------------------------------------------------
+Usage
+------------------------------------------------------------------------------
+
+1. Load this script into your interactive ZSH session:
+
+ % source zsh-history-substring-search.zsh
+
+ If you want to use [zsh-syntax-highlighting][6] along with this script,
+ then make sure that you load it *before* you load this script:
+
+ % source zsh-syntax-highlighting.zsh
+ % source zsh-history-substring-search.zsh
+
+2. Bind keyboard shortcuts to this script's functions:
+
+ # bind UP and DOWN arrow keys
+ zmodload zsh/terminfo
+ bindkey "$terminfo[kcuu1]" history-substring-search-up
+ bindkey "$terminfo[kcud1]" history-substring-search-down
+
+ # bind UP and DOWN arrow keys (compatibility fallback
+ # for Ubuntu 12.04, Fedora 21, and MacOSX 10.9 users)
+ bindkey '^[[A' history-substring-search-up
+ bindkey '^[[B' history-substring-search-down
+
+ # bind P and N for EMACS mode
+ bindkey -M emacs '^P' history-substring-search-up
+ bindkey -M emacs '^N' history-substring-search-down
+
+ # bind k and j for VI mode
+ bindkey -M vicmd 'k' history-substring-search-up
+ bindkey -M vicmd 'j' history-substring-search-down
+
+3. Type any part of any previous command and then:
+
+ * Press the UP arrow key to select the nearest command that (1) contains
+ your query and (2) is older than the current command in the command
+ history.
+
+ * Press the DOWN arrow key to select the nearest command that (1)
+ contains your query and (2) is newer than the current command in the
+ command history.
+
+ * Press ^U (the Control and U keys simultaneously) to abort the search.
+
+4. If a matching command spans more than one line of text, press the LEFT
+ arrow key to move the cursor away from the end of the command, and then:
+
+ * Press the UP arrow key to move the cursor to the line above. When the
+ cursor reaches the first line of the command, pressing the UP arrow
+ key again will cause this script to perform another search.
+
+ * Press the DOWN arrow key to move the cursor to the line below. When
+ the cursor reaches the last line of the command, pressing the DOWN
+ arrow key again will cause this script to perform another search.
+
+------------------------------------------------------------------------------
+Configuration
+------------------------------------------------------------------------------
+
+This script defines the following global variables. You may override their
+default values only after having loaded this script into your ZSH session.
+
+* HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND is a global variable that defines
+ how the query should be highlighted inside a matching command. Its default
+ value causes this script to highlight using bold, white text on a magenta
+ background. See the "Character Highlighting" section in the zshzle(1) man
+ page to learn about the kinds of values you may assign to this variable.
+
+* HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND is a global variable that
+ defines how the query should be highlighted when no commands in the
+ history match it. Its default value causes this script to highlight using
+ bold, white text on a red background. See the "Character Highlighting"
+ section in the zshzle(1) man page to learn about the kinds of values you
+ may assign to this variable.
+
+* HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS is a global variable that defines
+ how the command history will be searched for your query. Its default value
+ causes this script to perform a case-insensitive search. See the "Globbing
+ Flags" section in the zshexpn(1) man page to learn about the kinds of
+ values you may assign to this variable.
+
+To always receive _unique_ search results, use `setopt HIST_IGNORE_ALL_DUPS`.
+Alternatively, use `setopt HIST_FIND_NO_DUPS` which makes this plugin skip
+duplicate _adjacent_ search results as you cycle through them---however, this
+does not guarantee that search results are unique: if your search results were
+"Dog", "Dog", "HotDog", "Dog", then cycling them gives "Dog", "HotDog", "Dog".
+Notice that the "Dog" search result appeared twice as you cycled through them!
+If you wish to avoid this limitation, then use `setopt HIST_IGNORE_ALL_DUPS`.
+
+------------------------------------------------------------------------------
+History
+------------------------------------------------------------------------------
+
+This script was originally written by [Peter Stephenson][2], who published it
+to the ZSH users mailing list (thereby making it public domain) in September
+2009. It was later revised by Guido van Steen and released under the BSD
+license (see below) as part of [the fizsh project][3] in January 2011.
+
+It was later extracted from fizsh release 1.0.1, refactored heavily, and
+repackaged as both an [oh-my-zsh plugin][4] and as an independently loadable
+[ZSH script][5] by Suraj N. Kurapati in 2011.
+
+It was [further developed][4] by Guido van Steen, Suraj N. Kurapati, Sorin
+Ionescu, and Vincent Guerci in 2011.
+
+------------------------------------------------------------------------------
+Oh My Zsh Distribution Notes
+------------------------------------------------------------------------------
+
+What you are looking at now is Oh My Zsh's repackaging of zsh-history-substring-search
+as an OMZ module inside the Oh My Zsh distribution.
+
+The upstream repo, zsh-users/zsh-history-substring-search, can be found on GitHub at
+https://github.com/zsh-users/zsh-history-substring-search.
+
+This downstream copy was last updated from the following upstream commit:
+
+ SHA: 2c295432175990c1bb4e90bc13f609daa67a25d6
+ Commit date: 2015-09-28 10:47:34 -0700
+
+Everything above this section is a copy of the original upstream's README, so things
+may differ slightly when you're using this inside OMZ. In particular, you do not
+need to set up key bindings for the up and down arrows yourself in `~/.zshrc`; the OMZ
+plugin does that for you. You may still want to set up additional emacs- or vi-specific
+bindings as mentioned above.
+
diff --git a/plugins/history-substring-search/history-substring-search.plugin.zsh b/plugins/history-substring-search/history-substring-search.plugin.zsh
index 99a5922c5..25fd3a2da 100644
--- a/plugins/history-substring-search/history-substring-search.plugin.zsh
+++ b/plugins/history-substring-search/history-substring-search.plugin.zsh
@@ -1,6 +1,6 @@
-# This file integrates the history-substring-search script into oh-my-zsh.
+# This file integrates the zsh-history-substring-search script into oh-my-zsh.
-source "$ZSH/plugins/history-substring-search/history-substring-search.zsh"
+source "${0:r:r}.zsh"
if test "$CASE_SENSITIVE" = true; then
unset HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS
@@ -10,3 +10,14 @@ if test "$DISABLE_COLOR" = true; then
unset HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND
unset HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND
fi
+
+
+# Bind terminal-specific up and down keys
+
+if [[ -n "$terminfo[kcuu1]" ]]; then
+ bindkey "$terminfo[kcuu1]" history-substring-search-up
+fi
+if [[ -n "$terminfo[kcud1]" ]]; then
+ bindkey "$terminfo[kcud1]" history-substring-search-down
+fi
+
diff --git a/plugins/history-substring-search/history-substring-search.zsh b/plugins/history-substring-search/history-substring-search.zsh
index 65f0750db..ad316acc8 100644
--- a/plugins/history-substring-search/history-substring-search.zsh
+++ b/plugins/history-substring-search/history-substring-search.zsh
@@ -1,95 +1,4 @@
#!/usr/bin/env zsh
-#
-# This is a clean-room implementation of the Fish[1] shell's history search
-# feature, where you can type in any part of any previously entered command
-# and press the UP and DOWN arrow keys to cycle through the matching commands.
-#
-#-----------------------------------------------------------------------------
-# Usage
-#-----------------------------------------------------------------------------
-#
-# 1. Load this script into your interactive ZSH session:
-#
-# % source history-substring-search.zsh
-#
-# If you want to use the zsh-syntax-highlighting[6] script along with this
-# script, then make sure that you load it *before* you load this script:
-#
-# % source zsh-syntax-highlighting.zsh
-# % source history-substring-search.zsh
-#
-# 2. Type any part of any previous command and then:
-#
-# * Press the UP arrow key to select the nearest command that (1) contains
-# your query and (2) is older than the current command in the command
-# history.
-#
-# * Press the DOWN arrow key to select the nearest command that (1)
-# contains your query and (2) is newer than the current command in the
-# command history.
-#
-# * Press ^U (the Control and U keys simultaneously) to abort the search.
-#
-# 3. If a matching command spans more than one line of text, press the LEFT
-# arrow key to move the cursor away from the end of the command, and then:
-#
-# * Press the UP arrow key to move the cursor to the line above. When the
-# cursor reaches the first line of the command, pressing the UP arrow
-# key again will cause this script to perform another search.
-#
-# * Press the DOWN arrow key to move the cursor to the line below. When
-# the cursor reaches the last line of the command, pressing the DOWN
-# arrow key again will cause this script to perform another search.
-#
-#-----------------------------------------------------------------------------
-# Configuration
-#-----------------------------------------------------------------------------
-#
-# This script defines the following global variables. You may override their
-# default values only after having loaded this script into your ZSH session.
-#
-# * HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND is a global variable that defines
-# how the query should be highlighted inside a matching command. Its default
-# value causes this script to highlight using bold, white text on a magenta
-# background. See the "Character Highlighting" section in the zshzle(1) man
-# page to learn about the kinds of values you may assign to this variable.
-#
-# * HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND is a global variable that
-# defines how the query should be highlighted when no commands in the
-# history match it. Its default value causes this script to highlight using
-# bold, white text on a red background. See the "Character Highlighting"
-# section in the zshzle(1) man page to learn about the kinds of values you
-# may assign to this variable.
-#
-# * HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS is a global variable that defines
-# how the command history will be searched for your query. Its default value
-# causes this script to perform a case-insensitive search. See the "Globbing
-# Flags" section in the zshexpn(1) man page to learn about the kinds of
-# values you may assign to this variable.
-#
-#-----------------------------------------------------------------------------
-# History
-#-----------------------------------------------------------------------------
-#
-# This script was originally written by Peter Stephenson[2], who published it
-# to the ZSH users mailing list (thereby making it public domain) in September
-# 2009. It was later revised by Guido van Steen and released under the BSD
-# license (see below) as part of the fizsh[3] project in January 2011.
-#
-# It was later extracted from fizsh[3] release 1.0.1, refactored heavily, and
-# repackaged as both an oh-my-zsh plugin[4] and as an independently loadable
-# ZSH script[5] by Suraj N. Kurapati in 2011.
-#
-# It was further developed[4] by Guido van Steen, Suraj N. Kurapati, Sorin
-# Ionescu, and Vincent Guerci in 2011.
-#
-# [1]: http://fishshell.com
-# [2]: http://www.zsh.org/mla/users/2009/msg00818.html
-# [3]: http://sourceforge.net/projects/fizsh/
-# [4]: https://github.com/robbyrussell/oh-my-zsh/pull/215
-# [5]: https://github.com/sunaku/zsh-history-substring-search
-# [6]: https://github.com/nicoulaj/zsh-syntax-highlighting
-#
##############################################################################
#
# Copyright (c) 2009 Peter Stephenson
@@ -140,7 +49,7 @@ HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS='i'
# the main ZLE widgets
#-----------------------------------------------------------------------------
-function history-substring-search-up() {
+history-substring-search-up() {
_history-substring-search-begin
_history-substring-search-up-history ||
@@ -150,7 +59,7 @@ function history-substring-search-up() {
_history-substring-search-end
}
-function history-substring-search-down() {
+history-substring-search-down() {
_history-substring-search-begin
_history-substring-search-down-history ||
@@ -163,14 +72,6 @@ function history-substring-search-down() {
zle -N history-substring-search-up
zle -N history-substring-search-down
-zmodload zsh/terminfo
-if [[ -n "$terminfo[kcuu1]" ]]; then
- bindkey "$terminfo[kcuu1]" history-substring-search-up
-fi
-if [[ -n "$terminfo[kcud1]" ]]; then
- bindkey "$terminfo[kcud1]" history-substring-search-down
-fi
-
#-----------------------------------------------------------------------------
# implementation details
#-----------------------------------------------------------------------------
@@ -185,32 +86,20 @@ zmodload -F zsh/parameter
#
if [[ $+functions[_zsh_highlight] -eq 0 ]]; then
#
- # Dummy implementation of _zsh_highlight()
- # that simply removes existing highlights
- #
- function _zsh_highlight() {
- region_highlight=()
- }
-
- #
- # Remove existing highlights when the user
- # inserts printable characters into $BUFFER
+ # Dummy implementation of _zsh_highlight() that
+ # simply removes any existing highlights when the
+ # user inserts printable characters into $BUFFER.
#
- function ordinary-key-press() {
+ _zsh_highlight() {
if [[ $KEYS == [[:print:]] ]]; then
region_highlight=()
fi
- zle .self-insert
}
- zle -N self-insert ordinary-key-press
#
- # Override ZLE widgets to invoke _zsh_highlight()
+ # The following snippet was taken from the zsh-syntax-highlighting project:
#
- # https://github.com/nicoulaj/zsh-syntax-highlighting/blob/
- # bb7fcb79fad797a40077bebaf6f4e4a93c9d8163/zsh-syntax-highlighting.zsh#L121
- #
- #--------------8<-------------------8<-------------------8<-----------------
+ # https://github.com/zsh-users/zsh-syntax-highlighting/blob/56b134f5d62ae3d4e66c7f52bd0cc2595f9b305b/zsh-syntax-highlighting.zsh#L126-161
#
# Copyright (c) 2010-2011 zsh-syntax-highlighting contributors
# All rights reserved.
@@ -241,50 +130,53 @@ if [[ $+functions[_zsh_highlight] -eq 0 ]]; then
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- # Load ZSH module zsh/zleparameter, needed to override user defined widgets.
- zmodload zsh/zleparameter 2>/dev/null || {
- echo 'zsh-syntax-highlighting: failed loading zsh/zleparameter, exiting.' >&2
- return -1
- }
-
- # Override ZLE widgets to make them invoke _zsh_highlight.
- for event in ${${(f)"$(zle -la)"}:#(_*|orig-*|.run-help|.which-command)}; do
- if [[ "$widgets[$event]" == completion:* ]]; then
- eval "zle -C orig-$event ${${${widgets[$event]}#*:}/:/ } ; $event() { builtin zle orig-$event && _zsh_highlight } ; zle -N $event"
- else
- case $event in
- accept-and-menu-complete)
- eval "$event() { builtin zle .$event && _zsh_highlight } ; zle -N $event"
- ;;
-
- # The following widgets should NOT remove any previously
- # applied highlighting. Therefore we do not remap them.
- .forward-char|.backward-char|.up-line-or-history|.down-line-or-history)
- ;;
-
- .*)
- clean_event=$event[2,${#event}] # Remove the leading dot in the event name
- case ${widgets[$clean_event]-} in
- (completion|user):*)
- ;;
- *)
- eval "$clean_event() { builtin zle $event && _zsh_highlight } ; zle -N $clean_event"
- ;;
- esac
- ;;
- *)
- ;;
+ #
+ #--------------8<-------------------8<-------------------8<-----------------
+ # Rebind all ZLE widgets to make them invoke _zsh_highlights.
+ _zsh_highlight_bind_widgets()
+ {
+ # Load ZSH module zsh/zleparameter, needed to override user defined widgets.
+ zmodload zsh/zleparameter 2>/dev/null || {
+ echo 'zsh-syntax-highlighting: failed loading zsh/zleparameter.' >&2
+ return 1
+ }
+
+ # Override ZLE widgets to make them invoke _zsh_highlight.
+ local cur_widget
+ for cur_widget in ${${(f)"$(builtin zle -la)"}:#(.*|_*|orig-*|run-help|which-command|beep|yank*)}; do
+ case $widgets[$cur_widget] in
+
+ # Already rebound event: do nothing.
+ user:$cur_widget|user:_zsh_highlight_widget_*);;
+
+ # User defined widget: override and rebind old one with prefix "orig-".
+ user:*) eval "zle -N orig-$cur_widget ${widgets[$cur_widget]#*:}; \
+ _zsh_highlight_widget_$cur_widget() { builtin zle orig-$cur_widget -- \"\$@\" && _zsh_highlight }; \
+ zle -N $cur_widget _zsh_highlight_widget_$cur_widget";;
+
+ # Completion widget: override and rebind old one with prefix "orig-".
+ completion:*) eval "zle -C orig-$cur_widget ${${widgets[$cur_widget]#*:}/:/ }; \
+ _zsh_highlight_widget_$cur_widget() { builtin zle orig-$cur_widget -- \"\$@\" && _zsh_highlight }; \
+ zle -N $cur_widget _zsh_highlight_widget_$cur_widget";;
+
+ # Builtin widget: override and make it call the builtin ".widget".
+ builtin) eval "_zsh_highlight_widget_$cur_widget() { builtin zle .$cur_widget -- \"\$@\" && _zsh_highlight }; \
+ zle -N $cur_widget _zsh_highlight_widget_$cur_widget";;
+
+ # Default: unhandled case.
+ *) echo "zsh-syntax-highlighting: unhandled ZLE widget '$cur_widget'" >&2 ;;
esac
- fi
- done
- unset event clean_event
+ done
+ }
#-------------->8------------------->8------------------->8-----------------
+
+ _zsh_highlight_bind_widgets
fi
-function _history-substring-search-begin() {
+_history-substring-search-begin() {
setopt localoptions extendedglob
- _history_substring_search_move_cursor_eol=false
+
+ _history_substring_search_refresh_display=
_history_substring_search_query_highlight=
#
@@ -308,12 +200,10 @@ function _history-substring-search-begin() {
#
# Find all occurrences of the search query in the history file.
#
- # (k) turns it an array of line numbers.
- #
- # (on) seems to remove duplicates, which are default
- # options. They can be turned off by (ON).
+ # (k) returns the "keys" (history index numbers) instead of the values
+ # (Oa) reverses the order, because (R) returns results reversed.
#
- _history_substring_search_matches=(${(kon)history[(R)(#$HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS)*${_history_substring_search_query_escaped}*]})
+ _history_substring_search_matches=(${(kOa)history[(R)(#$HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS)*${_history_substring_search_query_escaped}*]})
#
# Define the range of values that $_history_substring_search_match_index
@@ -349,12 +239,15 @@ function _history-substring-search-begin() {
fi
}
-function _history-substring-search-end() {
+_history-substring-search-end() {
setopt localoptions extendedglob
+
_history_substring_search_result=$BUFFER
- # move the cursor to the end of the command line
- if [[ $_history_substring_search_move_cursor_eol == true ]]; then
+ # the search was succesful so display the result properly by clearing away
+ # existing highlights and moving the cursor to the end of the result buffer
+ if [[ $_history_substring_search_refresh_display -eq 1 ]]; then
+ region_highlight=()
CURSOR=${#BUFFER}
fi
@@ -379,10 +272,10 @@ function _history-substring-search-end() {
# read -k -t 200 && zle -U $REPLY
# Exit successfully from the history-substring-search-* widgets.
- true
+ return 0
}
-function _history-substring-search-up-buffer() {
+_history-substring-search-up-buffer() {
#
# Check if the UP arrow was pressed to move the cursor within a multi-line
# buffer. This amounts to three tests:
@@ -405,13 +298,13 @@ function _history-substring-search-up-buffer() {
if [[ $#buflines -gt 1 && $CURSOR -ne $#BUFFER && $#xlbuflines -ne 1 ]]; then
zle up-line-or-history
- return true
+ return 0
fi
- false
+ return 1
}
-function _history-substring-search-down-buffer() {
+_history-substring-search-down-buffer() {
#
# Check if the DOWN arrow was pressed to move the cursor within a multi-line
# buffer. This amounts to three tests:
@@ -434,13 +327,13 @@ function _history-substring-search-down-buffer() {
if [[ $#buflines -gt 1 && $CURSOR -ne $#BUFFER && $#xrbuflines -ne 1 ]]; then
zle down-line-or-history
- return true
+ return 0
fi
- false
+ return 1
}
-function _history-substring-search-up-history() {
+_history-substring-search-up-history() {
#
# Behave like up in ZSH, except clear the $BUFFER
# when beginning of history is reached like in Fish.
@@ -453,16 +346,16 @@ function _history-substring-search-up-history() {
# going up from somewhere below the top of history
else
- zle up-history
+ zle up-line-or-history
fi
- return true
+ return 0
fi
- false
+ return 1
}
-function _history-substring-search-down-history() {
+_history-substring-search-down-history() {
#
# Behave like down-history in ZSH, except clear the
# $BUFFER when end of history is reached like in Fish.
@@ -472,21 +365,31 @@ function _history-substring-search-down-history() {
# going down from the absolute top of history
if [[ $HISTNO -eq 1 && -z $BUFFER ]]; then
BUFFER=${history[1]}
- _history_substring_search_move_cursor_eol=true
+ _history_substring_search_refresh_display=1
# going down from somewhere above the bottom of history
else
- zle down-history
+ zle down-line-or-history
fi
- return true
+ return 0
fi
- false
+ return 1
+}
+
+_history-substring-search-not-found() {
+ #
+ # Nothing matched the search query, so put it back into the $BUFFER while
+ # highlighting it accordingly so the user can revise it and search again.
+ #
+ _history_substring_search_old_buffer=$BUFFER
+ BUFFER=$_history_substring_search_query
+ _history_substring_search_query_highlight=$HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND
}
-function _history-substring-search-up-search() {
- _history_substring_search_move_cursor_eol=true
+_history-substring-search-up-search() {
+ _history_substring_search_refresh_display=1
#
# Highlight matches during history-substring-up-search:
@@ -542,9 +445,7 @@ function _history-substring-search-up-search() {
# to highlight the current buffer.
#
(( _history_substring_search_match_index-- ))
- _history_substring_search_old_buffer=$BUFFER
- BUFFER=$_history_substring_search_query
- _history_substring_search_query_highlight=$HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND
+ _history-substring-search-not-found
elif [[ $_history_substring_search_match_index -eq $_history_substring_search_matches_count_plus ]]; then
#
@@ -561,11 +462,30 @@ function _history-substring-search-up-search() {
(( _history_substring_search_match_index-- ))
BUFFER=$_history_substring_search_old_buffer
_history_substring_search_query_highlight=$HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND
+
+ else
+ #
+ # We are at the beginning of history and there are no further matches.
+ #
+ _history-substring-search-not-found
+ return
+ fi
+
+ #
+ # When HIST_FIND_NO_DUPS is set, meaning that only unique command lines from
+ # history should be matched, make sure the new and old results are different.
+ # But when HIST_IGNORE_ALL_DUPS is set, ZSH already ensures a unique history.
+ #
+ if [[ ! -o HIST_IGNORE_ALL_DUPS && -o HIST_FIND_NO_DUPS && $BUFFER == $_history_substring_search_result ]]; then
+ #
+ # Repeat the current search so that a different (unique) match is found.
+ #
+ _history-substring-search-up-search
fi
}
-function _history-substring-search-down-search() {
- _history_substring_search_move_cursor_eol=true
+_history-substring-search-down-search() {
+ _history_substring_search_refresh_display=1
#
# Highlight matches during history-substring-up-search:
@@ -622,9 +542,7 @@ function _history-substring-search-down-search() {
# to highlight the current buffer.
#
(( _history_substring_search_match_index++ ))
- _history_substring_search_old_buffer=$BUFFER
- BUFFER=$_history_substring_search_query
- _history_substring_search_query_highlight=$HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND
+ _history-substring-search-not-found
elif [[ $_history_substring_search_match_index -eq 0 ]]; then
#
@@ -641,6 +559,25 @@ function _history-substring-search-down-search() {
(( _history_substring_search_match_index++ ))
BUFFER=$_history_substring_search_old_buffer
_history_substring_search_query_highlight=$HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND
+
+ else
+ #
+ # We are at the end of history and there are no further matches.
+ #
+ _history-substring-search-not-found
+ return
+ fi
+
+ #
+ # When HIST_FIND_NO_DUPS is set, meaning that only unique command lines from
+ # history should be matched, make sure the new and old results are different.
+ # But when HIST_IGNORE_ALL_DUPS is set, ZSH already ensures a unique history.
+ #
+ if [[ ! -o HIST_IGNORE_ALL_DUPS && -o HIST_FIND_NO_DUPS && $BUFFER == $_history_substring_search_result ]]; then
+ #
+ # Repeat the current search so that a different (unique) match is found.
+ #
+ _history-substring-search-down-search
fi
}
diff --git a/plugins/history-substring-search/update-from-upstream.zsh b/plugins/history-substring-search/update-from-upstream.zsh
new file mode 100755
index 000000000..6e6cca5d5
--- /dev/null
+++ b/plugins/history-substring-search/update-from-upstream.zsh
@@ -0,0 +1,127 @@
+#!/usr/bin/env zsh
+#
+# update-from-upstream.zsh
+#
+# This script updates the Oh My Zsh version of the zsh-history-substring-search
+# plugin from the independent upstream repo. This is to be run by OMZ developers
+# when they want to pull in new changes from upstream to OMZ. It is not run
+# during normal use of the plugin.
+#
+# The official upstream repo is zsh-users/zsh-history-substring-search
+# https://github.com/zsh-users/zsh-history-substring-search
+#
+# This is a zsh script, not a function. Call it with `zsh update-from-upstream.zsh`
+# from the command line, running it from within the plugin directory.
+#
+# You can set the environment variable REPO_PATH to point it at an upstream
+# repo you have already prepared. Otherwise, it will do a clean checkout of
+# upstream's HEAD to a temporary local repo and use that.
+
+
+# Just bail on any error so we don't have to do extra checking.
+# This is a developer-use script, so terse output like that should
+# be fine.
+set -e
+
+
+upstream_basename=zsh-history-substring-search
+plugin_basename=history-substring-search
+UPSTREAM_REPO=zsh-users/$upstream_basename
+need_repo_cleanup=false
+upstream_github_url="https://github.com/$UPSTREAM_REPO"
+
+if [[ -z "$UPSTREAM_REPO_PATH" ]]; then
+ # Do a clean checkout
+ my_tempdir=$(mktemp -d -t omz-update-histsubstrsrch)
+ UPSTREAM_REPO_PATH="$my_tempdir/$upstream_basename"
+ git clone "$upstream_github_url" "$UPSTREAM_REPO_PATH"
+ need_repo_cleanup=true
+ print "Checked out upstream repo to $UPSTREAM_REPO_PATH"
+else
+ print "Using existing $upstream_basename repo at $UPSTREAM_REPO_PATH"
+fi
+
+upstream="$UPSTREAM_REPO_PATH"
+
+# Figure out what we're pulling in
+upstream_sha=$(cd $upstream && git rev-parse HEAD)
+upstream_commit_date=$(cd $upstream && git log -1 --pretty=format:%ci)
+upstream_just_date=${${=upstream_commit_date}[1]}
+print "upstream SHA: $upstream_sha"
+print "upstream commit time: $upstream_commit_date"
+print "upstream commit date: $upstream_just_date"
+print
+
+# Copy the files over, using the OMZ plugin's names where needed
+cp -v "$upstream"/* .
+mv -v zsh-history-substring-search.zsh $plugin_basename.zsh
+mv -v zsh-history-substring-search.plugin.zsh $plugin_basename.plugin.zsh
+
+if [[ $need_repo_cleanup == true ]]; then
+ print "Removing temporary repo at $my_tempdir"
+ rm -rf "$my_tempdir"
+fi
+
+# Do OMZ-specific edits
+
+print
+print "Updating files with OMZ-specific stuff"
+print
+
+# OMZ binds the keys as part of the plugin loading
+
+cat >> $plugin_basename.plugin.zsh <<EOF
+
+
+# Bind terminal-specific up and down keys
+
+if [[ -n "\$terminfo[kcuu1]" ]]; then
+ bindkey "\$terminfo[kcuu1]" history-substring-search-up
+fi
+if [[ -n "\$terminfo[kcud1]" ]]; then
+ bindkey "\$terminfo[kcud1]" history-substring-search-down
+fi
+
+EOF
+
+# Tack OMZ-specific notes on to readme
+
+thin_line="------------------------------------------------------------------------------"
+cat >> README.md <<EOF
+
+$thin_line
+Oh My Zsh Distribution Notes
+$thin_line
+
+What you are looking at now is Oh My Zsh's repackaging of zsh-history-substring-search
+as an OMZ module inside the Oh My Zsh distribution.
+
+The upstream repo, $UPSTREAM_REPO, can be found on GitHub at
+$upstream_github_url.
+
+This downstream copy was last updated from the following upstream commit:
+
+ SHA: $upstream_sha
+ Commit date: $upstream_commit_date
+
+Everything above this section is a copy of the original upstream's README, so things
+may differ slightly when you're using this inside OMZ. In particular, you do not
+need to set up key bindings for the up and down arrows yourself in \`~/.zshrc\`; the OMZ
+plugin does that for you. You may still want to set up additional emacs- or vi-specific
+bindings as mentioned above.
+
+EOF
+
+# Announce success and generate git commit messages
+
+cat <<EOF
+Done OK
+
+Now you can check the results and commit like this:
+
+ git add *
+ git commit -m "history-substring-search: update to upstream version $upstream_just_date" \\
+ -m "Updates OMZ's copy to commit $upstream_sha from $UPSTREAM_REPO"
+
+EOF
+
diff --git a/plugins/mercurial/README.md b/plugins/mercurial/README.md
index 89e1c1743..f42212d68 100644
--- a/plugins/mercurial/README.md
+++ b/plugins/mercurial/README.md
@@ -2,23 +2,20 @@
### Usage
Update .zshrc:
-1. Add name to the list of plugins, e.g. `plugins = (..., mercurial, ...)`
+1. Add name to the list of plugins, e.g. `plugins=(... mercurial ...)`
(that is pretty obvious).
-2. Change PROMPT variable of current theme to contain current folder mercurial repo info:
+2. Switch to a theme which uses `hg_prompt_info`.
- robbyrussel theme is used by default, so you need to modify PROMPT var
- from [this file](https://github.com/robbyrussell/oh-my-zsh/blob/master/themes/robbyrussell.zsh-theme)
- by adding `$(hg_prompt_info)` after `$(git_prompt_info)`, so currently it
- looks next:
+ Or, customize the `$PROMPT` variable of your current theme to contain current folder mercurial repo info. This can be done by putting a custom version of the theme in `$ZSH_CUSTOM` or by changing `$PROMPT` in `.zshrc` after loading the theme.
- ```diff
- - PROMPT='${ret_status}%{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}'
- + PROMPT='${ret_status}%{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)$(hg_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}'
+ The `robbyrussell` theme is used by default, so you need to modify `$PROMPT` var by adding `$(hg_prompt_info)` after `$(git_prompt_info)`, so it looks like this:
+
+ ```zsh
+ PROMPT='${ret_status}%{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)$(hg_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}'
```
-
- and put modified var at the end of **.zshrc**.
+
3. Initialize additional vars used in plugin. So in short put next in **.zshrc**:
-
+
```
ZSH_THEME_HG_PROMPT_PREFIX="%{$fg_bold[magenta]%}hg:(%{$fg[red]%}"
ZSH_THEME_HG_PROMPT_SUFFIX="%{$reset_color%}"
@@ -55,8 +52,7 @@ Update .zshrc:
#### Displays repo branch and directory status in prompt
This is the same as git plugin does.
-**Note**: additional changes to **.zshrc** are required in order for this to
-work.
+**Note**: Additional changes to **.zshrc**, or using a theme designed to use `hg_prompt_info`, are required in order for this to work.
### Mantainers
[ptrv](https://github.com/ptrv) - original creator
diff --git a/plugins/wd/wd.sh b/plugins/wd/wd.sh
index 3b9548168..cf54713bd 100755
--- a/plugins/wd/wd.sh
+++ b/plugins/wd/wd.sh
@@ -8,7 +8,7 @@
# @github.com/mfaerevaag/wd
# version
-readonly WD_VERSION=0.4
+readonly WD_VERSION=0.4.2
# colors
readonly WD_BLUE="\033[96m"
@@ -143,7 +143,7 @@ wd_warp()
fi
elif [[ ${points[$point]} != "" ]]
then
- cd ${points[$point]}
+ cd ${points[$point]/#\~/$HOME}
else
wd_exit_fail "Unknown warp point '${point}'"
fi
@@ -169,7 +169,7 @@ wd_add()
elif [[ ${points[$2]} == "" ]] || $force
then
wd_remove $point > /dev/null
- printf "%q:%s\n" "${point}" "${PWD}" >> $WD_CONFIG
+ printf "%q:%s\n" "${point}" "${PWD/#$HOME/~}" >> $WD_CONFIG
wd_print_msg $WD_GREEN "Warp point added"
@@ -203,6 +203,21 @@ wd_list_all()
{
wd_print_msg $WD_BLUE "All warp points:"
+ entries=$(sed "s:${HOME}:~:g" $WD_CONFIG)
+
+ max_warp_point_length=0
+ while IFS= read -r line
+ do
+ arr=(${(s,:,)line})
+ key=${arr[1]}
+
+ length=${#key}
+ if [[ length -gt max_warp_point_length ]]
+ then
+ max_warp_point_length=$length
+ fi
+ done <<< $entries
+
while IFS= read -r line
do
if [[ $line != "" ]]
@@ -213,16 +228,16 @@ wd_list_all()
if [[ -z $wd_quiet_mode ]]
then
- printf "%20s -> %s\n" $key $val
+ printf "%${max_warp_point_length}s -> %s\n" $key $val
fi
fi
- done <<< $(sed "s:${HOME}:~:g" $WD_CONFIG)
+ done <<< $entries
}
wd_ls()
{
wd_getdir $1
- ls $dir
+ ls ${dir/#\~/$HOME}
}
wd_path()
@@ -248,6 +263,7 @@ wd_show()
local wd_matches
wd_matches=()
# do a reverse lookup to check whether PWD is in $points
+ PWD="${PWD/$HOME/~}"
if [[ ${points[(r)$PWD]} == $PWD ]]
then
for name in ${(k)points}
diff --git a/plugins/wp-cli/README.md b/plugins/wp-cli/README.md
index 6dda07d17..1a79d60fc 100644
--- a/plugins/wp-cli/README.md
+++ b/plugins/wp-cli/README.md
@@ -43,7 +43,7 @@ WP-CLI is a set of command-line tools for managing WordPress installations. You
- wpps='search'
- wppst='status'
- wppt='toggle'
-- wppu='uninstall'
+- wppun='uninstall'
- wppu='update'
### Post
@@ -55,7 +55,7 @@ WP-CLI is a set of command-line tools for managing WordPress installations. You
- wppol='wp post list'
- wppom='wp post meta'
- wppou='wp post update'
-- wppou='wp post url'
+- wppourl='wp post url'
### Sidebar
- wpsbl='wp sidebar list'
diff --git a/plugins/wp-cli/wp-cli.plugin.zsh b/plugins/wp-cli/wp-cli.plugin.zsh
index 6c70a7a09..7b41c3257 100644
--- a/plugins/wp-cli/wp-cli.plugin.zsh
+++ b/plugins/wp-cli/wp-cli.plugin.zsh
@@ -63,7 +63,7 @@ alias wppp='wp plugin path'
alias wpps='wp plugin search'
alias wppst='wp plugin status'
alias wppt='wp plugin toggle'
-alias wppu='wp plugin uninstall'
+alias wppun='wp plugin uninstall'
alias wppu='wp plugin update'
# Post
@@ -75,7 +75,7 @@ alias wppog='wp post get'
alias wppol='wp post list'
alias wppom='wp post meta'
alias wppou='wp post update'
-alias wppou='wp post url'
+alias wppourl='wp post url'
# Rewrite
diff --git a/plugins/z/README b/plugins/z/README
index ec5abc6f5..7de82a4c7 100644
--- a/plugins/z/README
+++ b/plugins/z/README
@@ -6,7 +6,7 @@ NAME
z - jump around
SYNOPSIS
- z [-chlrt] [regex1 regex2 ... regexn]
+ z [-chlrtx] [regex1 regex2 ... regexn]
AVAILABILITY
bash, zsh
@@ -15,10 +15,13 @@ DESCRIPTION
Tracks your most used directories, based on 'frecency'.
After a short learning phase, z will take you to the most 'frecent'
- directory that matches ALL of the regexes given on the command line.
+ directory that matches ALL of the regexes given on the command line, in
+ order.
+
+ For example, z foo bar would match /foo/bar but not /bar/foo.
OPTIONS
- -c restrict matches to subdirectories of the current directory.
+ -c restrict matches to subdirectories of the current directory
-h show a brief help message
@@ -28,10 +31,12 @@ OPTIONS
-t match by recent access only
+ -x remove the current directory from the datafile
+
EXAMPLES
z foo cd to most frecent dir matching foo
- z foo bar cd to most frecent dir matching foo and bar
+ z foo bar cd to most frecent dir matching foo, then bar
z -r foo cd to highest ranked dir matching foo
@@ -55,8 +60,9 @@ NOTES
Set $_Z_NO_RESOLVE_SYMLINKS to prevent symlink resolution.
Set $_Z_NO_PROMPT_COMMAND to handle PROMPT_COMMAND/precmd your-
self.
- Set $_Z_EXCLUDE_DIRS to an array of directories to exclude.
- (These settings should go in .bashrc/.zshrc before the lines
+ Set $_Z_EXCLUDE_DIRS to an array of directory trees to exclude.
+ Set $_Z_OWNER to allow usage when in 'sudo -s' mode.
+ (These settings should go in .bashrc/.zshrc before the line
added above.)
Install the provided man page z.1 somewhere like
/usr/local/man/man1.
@@ -64,12 +70,12 @@ NOTES
Aging:
The rank of directories maintained by z undergoes aging based on a sim-
ple formula. The rank of each entry is incremented every time it is
- accessed. When the sum of ranks is greater than 6000, all ranks are
- multiplied by 0.99. Entries with a rank lower than 1 are forgotten.
+ accessed. When the sum of ranks is over 9000, all ranks are multiplied
+ by 0.99. Entries with a rank lower than 1 are forgotten.
Frecency:
- Frecency is a portmantaeu of 'recent' and 'frequency'. It is a weighted
- rank that depends on how often and how recently something occured. As
+ Frecency is a portmanteau of 'recent' and 'frequency'. It is a weighted
+ rank that depends on how often and how recently something occurred. As
far as I know, Mozilla came up with the term.
To z, a directory that has low ranking but has been accessed recently
@@ -107,20 +113,23 @@ ENVIRONMENT
resolving of symlinks. If it is not set, symbolic links will be
resolved when added to the datafile.
- In bash, z prepends a command to the PROMPT_COMMAND environment vari-
- able to maintain its database. In zsh, z appends a function _z_precmd
- to the precmd_functions array.
+ In bash, z appends a command to the PROMPT_COMMAND environment variable
+ to maintain its database. In zsh, z appends a function _z_precmd to the
+ precmd_functions array.
The environment variable $_Z_NO_PROMPT_COMMAND can be set if you want
to handle PROMPT_COMMAND or precmd yourself.
The environment variable $_Z_EXCLUDE_DIRS can be set to an array of
- directories to exclude from tracking. $HOME is always excluded. Direc-
- tories must be full paths without trailing slashes.
+ directory trees to exclude from tracking. $HOME is always excluded.
+ Directories must be full paths without trailing slashes.
+
+ The environment variable $_Z_OWNER can be set to your username, to
+ allow usage of z when your sudo enviroment keeps $HOME set.
FILES
- Data is stored in $HOME/.z. This can be overridden by setting the
- $_Z_DATA environment variable. When initialized, z will raise an error
+ Data is stored in $HOME/.z. This can be overridden by setting the
+ $_Z_DATA environment variable. When initialized, z will raise an error
if this path is a directory, and not function correctly.
A man page (z.1) is provided.
diff --git a/plugins/z/z.1 b/plugins/z/z.1
index 022a4b35d..cc99910bf 100644
--- a/plugins/z/z.1
+++ b/plugins/z/z.1
@@ -4,7 +4,7 @@ NAME
z \- jump around
.SH
SYNOPSIS
-z [\-chlrt] [regex1 regex2 ... regexn]
+z [\-chlrtx] [regex1 regex2 ... regexn]
.SH
AVAILABILITY
bash, zsh
@@ -13,12 +13,14 @@ DESCRIPTION
Tracks your most used directories, based on 'frecency'.
.P
After a short learning phase, \fBz\fR will take you to the most 'frecent'
-directory that matches ALL of the regexes given on the command line.
+directory that matches ALL of the regexes given on the command line, in order.
+
+For example, \fBz foo bar\fR would match \fB/foo/bar\fR but not \fB/bar/foo\fR.
.SH
OPTIONS
.TP
\fB\-c\fR
-restrict matches to subdirectories of the current directory.
+restrict matches to subdirectories of the current directory
.TP
\fB\-h\fR
show a brief help message
@@ -31,13 +33,16 @@ match by rank only
.TP
\fB\-t\fR
match by recent access only
+.TP
+\fB\-x\fR
+remove the current directory from the datafile
.SH EXAMPLES
.TP 14
\fBz foo\fR
cd to most frecent dir matching foo
.TP 14
\fBz foo bar\fR
-cd to most frecent dir matching foo and bar
+cd to most frecent dir matching foo, then bar
.TP 14
\fBz -r foo\fR
cd to highest ranked dir matching foo
@@ -76,10 +81,13 @@ Set \fB$_Z_NO_RESOLVE_SYMLINKS\fR to prevent symlink resolution.
Set \fB$_Z_NO_PROMPT_COMMAND\fR to handle \fBPROMPT_COMMAND/precmd\fR yourself.
.RE
.RS
-Set \fB$_Z_EXCLUDE_DIRS\fR to an array of directories to exclude.
+Set \fB$_Z_EXCLUDE_DIRS\fR to an array of directory trees to exclude.
+.RE
+.RS
+Set \fB$_Z_OWNER\fR to allow usage when in 'sudo -s' mode.
.RE
.RS
-(These settings should go in .bashrc/.zshrc before the lines added above.)
+(These settings should go in .bashrc/.zshrc before the line added above.)
.RE
.RS
Install the provided man page \fBz.1\fR somewhere like \fB/usr/local/man/man1\fR.
@@ -88,12 +96,12 @@ Install the provided man page \fBz.1\fR somewhere like \fB/usr/local/man/man1\fR
Aging:
The rank of directories maintained by \fBz\fR undergoes aging based on a simple
formula. The rank of each entry is incremented every time it is accessed. When
-the sum of ranks is greater than 6000, all ranks are multiplied by 0.99. Entries
-with a rank lower than 1 are forgotten.
+the sum of ranks is over 9000, all ranks are multiplied by 0.99. Entries with a
+rank lower than 1 are forgotten.
.SS
Frecency:
-Frecency is a portmantaeu of 'recent' and 'frequency'. It is a weighted rank
-that depends on how often and how recently something occured. As far as I
+Frecency is a portmanteau of 'recent' and 'frequency'. It is a weighted rank
+that depends on how often and how recently something occurred. As far as I
know, Mozilla came up with the term.
.P
To \fBz\fR, a directory that has low ranking but has been accessed recently
@@ -131,7 +139,7 @@ The environment variable \fB$_Z_NO_RESOLVE_SYMLINKS\fR can be set to prevent
resolving of symlinks. If it is not set, symbolic links will be resolved when
added to the datafile.
.P
-In bash, \fBz\fR prepends a command to the \fBPROMPT_COMMAND\fR environment
+In bash, \fBz\fR appends a command to the \fBPROMPT_COMMAND\fR environment
variable to maintain its database. In zsh, \fBz\fR appends a function
\fB_z_precmd\fR to the \fBprecmd_functions\fR array.
.P
@@ -139,8 +147,11 @@ The environment variable \fB$_Z_NO_PROMPT_COMMAND\fR can be set if you want to
handle \fBPROMPT_COMMAND\fR or \fBprecmd\fR yourself.
.P
The environment variable \fB$_Z_EXCLUDE_DIRS\fR can be set to an array of
-directories to exclude from tracking. \fB$HOME\fR is always excluded.
+directory trees to exclude from tracking. \fB$HOME\fR is always excluded.
Directories must be full paths without trailing slashes.
+.P
+The environment variable \fB$_Z_OWNER\fR can be set to your username, to
+allow usage of \fBz\fR when your sudo enviroment keeps \fB$HOME\fR set.
.SH
FILES
Data is stored in \fB$HOME/.z\fR. This can be overridden by setting the
diff --git a/plugins/z/z.sh b/plugins/z/z.sh
index 7e444ef46..d0eeb97ef 100644
--- a/plugins/z/z.sh
+++ b/plugins/z/z.sh
@@ -3,29 +3,25 @@
# maintains a jump-list of the directories you actually use
#
# INSTALL:
-# * put something like this in your .bashrc/.zshrc:
-# . /path/to/z.sh
-# * cd around for a while to build up the db
-# * PROFIT!!
-# * optionally:
-# set $_Z_CMD in .bashrc/.zshrc to change the command (default z).
-# set $_Z_DATA in .bashrc/.zshrc to change the datafile (default ~/.z).
-# set $_Z_NO_RESOLVE_SYMLINKS to prevent symlink resolution.
-# set $_Z_NO_PROMPT_COMMAND if you're handling PROMPT_COMMAND yourself.
-# set $_Z_EXCLUDE_DIRS to an array of directories to exclude.
+# * put something like this in your .bashrc/.zshrc:
+# . /path/to/z.sh
+# * cd around for a while to build up the db
+# * PROFIT!!
+# * optionally:
+# set $_Z_CMD in .bashrc/.zshrc to change the command (default z).
+# set $_Z_DATA in .bashrc/.zshrc to change the datafile (default ~/.z).
+# set $_Z_NO_RESOLVE_SYMLINKS to prevent symlink resolution.
+# set $_Z_NO_PROMPT_COMMAND if you're handling PROMPT_COMMAND yourself.
+# set $_Z_EXCLUDE_DIRS to an array of directories to exclude.
+# set $_Z_OWNER to your username if you want use z while sudo with $HOME kept
#
# USE:
-# * z foo # cd to most frecent dir matching foo
-# * z foo bar # cd to most frecent dir matching foo and bar
-# * z -r foo # cd to highest ranked dir matching foo
-# * z -t foo # cd to most recently accessed dir matching foo
-# * z -l foo # list matches instead of cd
-# * z -c foo # restrict matches to subdirs of $PWD
-
-case $- in
- *i*) ;;
- *) echo 'ERROR: z.sh is meant to be sourced, not directly executed.'
-esac
+# * z foo # cd to most frecent dir matching foo
+# * z foo bar # cd to most frecent dir matching foo and bar
+# * z -r foo # cd to highest ranked dir matching foo
+# * z -t foo # cd to most recently accessed dir matching foo
+# * z -l foo # list matches instead of cd
+# * z -c foo # restrict matches to subdirs of $PWD
[ -d "${_Z_DATA:-$HOME/.z}" ] && {
echo "ERROR: z.sh's datafile (${_Z_DATA:-$HOME/.z}) is a directory."
@@ -33,196 +29,215 @@ esac
_z() {
- local datafile="${_Z_DATA:-$HOME/.z}"
-
- # bail out if we don't own ~/.z (we're another user but our ENV is still set)
- [ -f "$datafile" -a ! -O "$datafile" ] && return
-
- # add entries
- if [ "$1" = "--add" ]; then
- shift
-
- # $HOME isn't worth matching
- [ "$*" = "$HOME" ] && return
-
- # don't track excluded dirs
- local exclude
- for exclude in "${_Z_EXCLUDE_DIRS[@]}"; do
- [ "$*" = "$exclude" ] && return
- done
-
- # maintain the file
- local tempfile
- tempfile="$(mktemp "$datafile.XXXXXX")" || return
- while read line; do
- [ -d "${line%%\|*}" ] && echo $line
- done < "$datafile" | awk -v path="$*" -v now="$(date +%s)" -F"|" '
- BEGIN {
- rank[path] = 1
- time[path] = now
- }
- $2 >= 1 {
- if( $1 == path ) {
- rank[$1] = $2 + 1
- time[$1] = now
- } else {
- rank[$1] = $2
- time[$1] = $3
- }
- count += $2
- }
- END {
- if( count > 6000 ) {
- for( i in rank ) print i "|" 0.99*rank[i] "|" time[i] # aging
- } else for( i in rank ) print i "|" rank[i] "|" time[i]
- }
- ' 2>/dev/null >| "$tempfile"
- if [ $? -ne 0 -a -f "$datafile" ]; then
- env rm -f "$tempfile"
- else
- env mv -f "$tempfile" "$datafile"
- fi
-
- # tab completion
- elif [ "$1" = "--complete" ]; then
- while read line; do
- [ -d "${line%%\|*}" ] && echo $line
- done < "$datafile" | awk -v q="$2" -F"|" '
- BEGIN {
- if( q == tolower(q) ) nocase = 1
- split(substr(q,3),fnd," ")
- }
- {
- if( nocase ) {
- for( i in fnd ) tolower($1) !~ tolower(fnd[i]) && $1 = ""
- } else {
- for( i in fnd ) $1 !~ fnd[i] && $1 = ""
- }
- if( $1 ) print $1
- }
- ' 2>/dev/null
-
- else
- # list/go
- while [ "$1" ]; do case "$1" in
- --) while [ "$1" ]; do shift; local fnd="$fnd $1";done;;
- -*) local opt=${1:1}; while [ "$opt" ]; do case ${opt:0:1} in
- c) local fnd="^$PWD $fnd";;
- h) echo "${_Z_CMD:-z} [-chlrt] args" >&2; return;;
- l) local list=1;;
- r) local typ="rank";;
- t) local typ="recent";;
- esac; opt=${opt:1}; done;;
- *) local fnd="$fnd $1";;
- esac; local last=$1; shift; done
- [ "$fnd" -a "$fnd" != "^$PWD " ] || local list=1
-
- # if we hit enter on a completion just go there
- case "$last" in
- # completions will always start with /
- /*) [ -z "$list" -a -d "$last" ] && cd "$last" && return;;
- esac
-
- # no file yet
- [ -f "$datafile" ] || return
-
- local cd
- cd="$(while read line; do
- [ -d "${line%%\|*}" ] && echo $line
- done < "$datafile" | awk -v t="$(date +%s)" -v list="$list" -v typ="$typ" -v q="$fnd" -F"|" '
- function frecent(rank, time) {
- dx = t-time
- if( dx < 3600 ) return rank*4
- if( dx < 86400 ) return rank*2
- if( dx < 604800 ) return rank/2
- return rank/4
- }
- function output(files, toopen, override) {
- if( list ) {
- cmd = "sort -n >&2"
- for( i in files ) if( files[i] ) printf "%-10s %s\n", files[i], i | cmd
- if( override ) printf "%-10s %s\n", "common:", override > "/dev/stderr"
- } else {
- if( override ) toopen = override
- print toopen
- }
- }
- function common(matches) {
- # shortest match
- for( i in matches ) {
- if( matches[i] && (!short || length(i) < length(short)) ) short = i
- }
- if( short == "/" ) return
- # shortest match must be common to each match. escape special characters in
- # a copy when testing, so we can return the original.
- clean_short = short
- gsub(/[\(\)\[\]\|]/, "\\\\&", clean_short)
- for( i in matches ) if( matches[i] && i !~ clean_short ) return
- return short
- }
- BEGIN { split(q, a, " "); oldf = noldf = -9999999999 }
- {
- if( typ == "rank" ) {
- f = $2
- } else if( typ == "recent" ) {
- f = $3-t
- } else f = frecent($2, $3)
- wcase[$1] = nocase[$1] = f
- for( i in a ) {
- if( $1 !~ a[i] ) delete wcase[$1]
- if( tolower($1) !~ tolower(a[i]) ) delete nocase[$1]
- }
- if( wcase[$1] && wcase[$1] > oldf ) {
- cx = $1
- oldf = wcase[$1]
- } else if( nocase[$1] && nocase[$1] > noldf ) {
- ncx = $1
- noldf = nocase[$1]
- }
- }
- END {
- if( cx ) {
- output(wcase, cx, common(wcase))
- } else if( ncx ) output(nocase, ncx, common(nocase))
- }
- ')"
- [ $? -gt 0 ] && return
- [ "$cd" ] && cd "$cd"
- fi
+ local datafile="${_Z_DATA:-$HOME/.z}"
+
+ # bail if we don't own ~/.z and $_Z_OWNER not set
+ [ -z "$_Z_OWNER" -a -f "$datafile" -a ! -O "$datafile" ] && return
+
+ # add entries
+ if [ "$1" = "--add" ]; then
+ shift
+
+ # $HOME isn't worth matching
+ [ "$*" = "$HOME" ] && return
+
+ # don't track excluded directory trees
+ local exclude
+ for exclude in "${_Z_EXCLUDE_DIRS[@]}"; do
+ case "$*" in "$exclude*") return;; esac
+ done
+
+ # maintain the data file
+ local tempfile="$datafile.$RANDOM"
+ while read line; do
+ # only count directories
+ [ -d "${line%%\|*}" ] && echo $line
+ done < "$datafile" | awk -v path="$*" -v now="$(date +%s)" -F"|" '
+ BEGIN {
+ rank[path] = 1
+ time[path] = now
+ }
+ $2 >= 1 {
+ # drop ranks below 1
+ if( $1 == path ) {
+ rank[$1] = $2 + 1
+ time[$1] = now
+ } else {
+ rank[$1] = $2
+ time[$1] = $3
+ }
+ count += $2
+ }
+ END {
+ if( count > 9000 ) {
+ # aging
+ for( x in rank ) print x "|" 0.99*rank[x] "|" time[x]
+ } else for( x in rank ) print x "|" rank[x] "|" time[x]
+ }
+ ' 2>/dev/null >| "$tempfile"
+ # do our best to avoid clobbering the datafile in a race condition
+ if [ $? -ne 0 -a -f "$datafile" ]; then
+ env rm -f "$tempfile"
+ else
+ [ "$_Z_OWNER" ] && chown $_Z_OWNER:$(id -ng $_Z_OWNER) "$tempfile"
+ env mv -f "$tempfile" "$datafile" || env rm -f "$tempfile"
+ fi
+
+ # tab completion
+ elif [ "$1" = "--complete" -a -s "$datafile" ]; then
+ while read line; do
+ [ -d "${line%%\|*}" ] && echo $line
+ done < "$datafile" | awk -v q="$2" -F"|" '
+ BEGIN {
+ if( q == tolower(q) ) imatch = 1
+ q = substr(q, 3)
+ gsub(" ", ".*", q)
+ }
+ {
+ if( imatch ) {
+ if( tolower($1) ~ tolower(q) ) print $1
+ } else if( $1 ~ q ) print $1
+ }
+ ' 2>/dev/null
+
+ else
+ # list/go
+ while [ "$1" ]; do case "$1" in
+ --) while [ "$1" ]; do shift; local fnd="$fnd${fnd:+ }$1";done;;
+ -*) local opt=${1:1}; while [ "$opt" ]; do case ${opt:0:1} in
+ c) local fnd="^$PWD $fnd";;
+ h) echo "${_Z_CMD:-z} [-chlrtx] args" >&2; return;;
+ x) sed -i -e "\:^${PWD}|.*:d" "$datafile";;
+ l) local list=1;;
+ r) local typ="rank";;
+ t) local typ="recent";;
+ esac; opt=${opt:1}; done;;
+ *) local fnd="$fnd${fnd:+ }$1";;
+ esac; local last=$1; [ "$#" -gt 0 ] && shift; done
+ [ "$fnd" -a "$fnd" != "^$PWD " ] || local list=1
+
+ # if we hit enter on a completion just go there
+ case "$last" in
+ # completions will always start with /
+ /*) [ -z "$list" -a -d "$last" ] && cd "$last" && return;;
+ esac
+
+ # no file yet
+ [ -f "$datafile" ] || return
+
+ local cd
+ cd="$(while read line; do
+ [ -d "${line%%\|*}" ] && echo $line
+ done < "$datafile" | awk -v t="$(date +%s)" -v list="$list" -v typ="$typ" -v q="$fnd" -F"|" '
+ function frecent(rank, time) {
+ # relate frequency and time
+ dx = t - time
+ if( dx < 3600 ) return rank * 4
+ if( dx < 86400 ) return rank * 2
+ if( dx < 604800 ) return rank / 2
+ return rank / 4
+ }
+ function output(files, out, common) {
+ # list or return the desired directory
+ if( list ) {
+ cmd = "sort -n >&2"
+ for( x in files ) {
+ if( files[x] ) printf "%-10s %s\n", files[x], x | cmd
+ }
+ if( common ) {
+ printf "%-10s %s\n", "common:", common > "/dev/stderr"
+ }
+ } else {
+ if( common ) out = common
+ print out
+ }
+ }
+ function common(matches) {
+ # find the common root of a list of matches, if it exists
+ for( x in matches ) {
+ if( matches[x] && (!short || length(x) < length(short)) ) {
+ short = x
+ }
+ }
+ if( short == "/" ) return
+ # use a copy to escape special characters, as we want to return
+ # the original. yeah, this escaping is awful.
+ clean_short = short
+ gsub(/\[\(\)\[\]\|\]/, "\\\\&", clean_short)
+ for( x in matches ) if( matches[x] && x !~ clean_short ) return
+ return short
+ }
+ BEGIN {
+ gsub(" ", ".*", q)
+ hi_rank = ihi_rank = -9999999999
+ }
+ {
+ if( typ == "rank" ) {
+ rank = $2
+ } else if( typ == "recent" ) {
+ rank = $3 - t
+ } else rank = frecent($2, $3)
+ if( $1 ~ q ) {
+ matches[$1] = rank
+ } else if( tolower($1) ~ tolower(q) ) imatches[$1] = rank
+ if( matches[$1] && matches[$1] > hi_rank ) {
+ best_match = $1
+ hi_rank = matches[$1]
+ } else if( imatches[$1] && imatches[$1] > ihi_rank ) {
+ ibest_match = $1
+ ihi_rank = imatches[$1]
+ }
+ }
+ END {
+ # prefer case sensitive
+ if( best_match ) {
+ output(matches, best_match, common(matches))
+ } else if( ibest_match ) {
+ output(imatches, ibest_match, common(imatches))
+ }
+ }
+ ')"
+ [ $? -gt 0 ] && return
+ [ "$cd" ] && cd "$cd"
+ fi
}
alias ${_Z_CMD:-z}='_z 2>&1'
[ "$_Z_NO_RESOLVE_SYMLINKS" ] || _Z_RESOLVE_SYMLINKS="-P"
-if compctl &> /dev/null; then
- [ "$_Z_NO_PROMPT_COMMAND" ] || {
- # zsh populate directory list, avoid clobbering any other precmds
- if [ "$_Z_NO_RESOLVE_SYMLINKS" ]; then
- _z_precmd() {
- _z --add "${PWD:a}"
+if type compctl >/dev/null 2>&1; then
+ # zsh
+ [ "$_Z_NO_PROMPT_COMMAND" ] || {
+ # populate directory list, avoid clobbering any other precmds.
+ if [ "$_Z_NO_RESOLVE_SYMLINKS" ]; then
+ _z_precmd() {
+ _z --add "${PWD:a}"
+ }
+ else
+ _z_precmd() {
+ _z --add "${PWD:A}"
+ }
+ fi
+ [[ -n "${precmd_functions[(r)_z_precmd]}" ]] || {
+ precmd_functions[$(($#precmd_functions+1))]=_z_precmd
+ }
+ }
+ _z_zsh_tab_completion() {
+ # tab completion
+ local compl
+ read -l compl
+ reply=(${(f)"$(_z --complete "$compl")"})
}
- else
- _z_precmd() {
- _z --add "${PWD:A}"
+ compctl -U -K _z_zsh_tab_completion _z
+elif type complete >/dev/null 2>&1; then
+ # bash
+ # tab completion
+ complete -o filenames -C '_z --complete "$COMP_LINE"' ${_Z_CMD:-z}
+ [ "$_Z_NO_PROMPT_COMMAND" ] || {
+ # populate directory list. avoid clobbering other PROMPT_COMMANDs.
+ grep "_z --add" <<< "$PROMPT_COMMAND" >/dev/null || {
+ PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''_z --add "$(command pwd '$_Z_RESOLVE_SYMLINKS' 2>/dev/null)" 2>/dev/null;'
+ }
}
- fi
- precmd_functions+=(_z_precmd)
- }
- # zsh tab completion
- _z_zsh_tab_completion() {
- local compl
- read -l compl
- reply=(${(f)"$(_z --complete "$compl")"})
- }
- compctl -U -K _z_zsh_tab_completion _z
-elif complete &> /dev/null; then
- # bash tab completion
- complete -o filenames -C '_z --complete "$COMP_LINE"' ${_Z_CMD:-z}
- [ "$_Z_NO_PROMPT_COMMAND" ] || {
- # bash populate directory list. avoid clobbering other PROMPT_COMMANDs.
- echo $PROMPT_COMMAND | grep -q "_z --add" || {
- PROMPT_COMMAND='_z --add "$(pwd '$_Z_RESOLVE_SYMLINKS' 2>/dev/null)" 2>/dev/null;'"$PROMPT_COMMAND"
- }
- }
fi