19 Commits
Author SHA1 Message Date
Suraj N. Kurapati 0f80b8eb33 GH-92: also try bindkey with $terminfo for arrows 2019-05-12 17:35:54 -07:00
Suraj N. KurapatiandGitHub 2c36e4dd3a Merge pull request #98 from FranciscoBorges/master
Declare `query_part` as local to avoid warnings due to `WARN_CREATE_GLOBAL`
2019-05-12 17:18:38 -07:00
Suraj N. KurapatiandGitHub 79d3619704 Merge pull request #99 from d10n/fix-zsh-4.3-regressions
Fix zsh 4.3 regressions
2019-05-12 17:17:45 -07:00
d10n 19cb0eb8be Quote variable to highlight right words on zsh 4.3
When the variable is not quoted, there seems to be some difference in
evaluating the line between zsh 4.3 and 5.6
2018-12-26 19:43:49 -05:00
d10n 36505c46c7 Explicitly disable word splitting when not fuzzy
This prevents shell configuration from breaking fuzzy search
configuration
2018-12-26 19:42:36 -05:00
Francisco Borges 8d4a409c89 Declare query_part as local to avoid warnings due to WARN_CREATE_GLOBAL 2018-12-11 10:21:28 +01:00
Bastian HeistandSuraj N. Kurapati 47a7d416c6 Fix typo in README.md (#91)
The plugin line needed to contain "history-substring-search" (not zsh-history-substring-search) to work for me.
2018-02-21 10:15:09 -08:00
David SuileaandSuraj N. Kurapati d44159b5e8 support for installing as Oh-My-Zsh plugin (#87) 2017-08-03 11:15:30 -07:00
Suraj N. KurapatiandGitHub 4594acaa4f Merge pull request #86 from iroedius/master
also ignore files ending in .zwc.old
2017-08-02 11:20:53 -07:00
iroedius c35b4d1e8c also ignore files ending in .zwc.old 2017-07-20 14:52:31 +02:00
VithonandGeza Lore 933733e867 Update README.md
With Homebrew/homebrew-core#13567 script is now installed in a different location. updating README.md to reflect
2017-05-20 20:40:29 +01:00
Geza Lore be0fe1fca9 Clean up global variable declarations
- Remove duplicate declarations
- Separate internal variables from configuration variables
2017-05-16 20:07:06 +01:00
Bengt BrodersenandGeza Lore fd27842cad feat: add fuzzy search 2017-05-16 19:49:29 +01:00
Bengt BrodersenandSuraj N. Kurapati 563c88c4ca README: add installation instructions for Homebrew 2017-05-15 22:42:16 -07:00
Geza LoreandGitHub c750a17757 Merge pull request #67 from gezalore/master
Fix breakage with setopt ERR_RETURN (Issue #60)
2017-05-05 21:45:55 +01:00
Geza Lore 07011f632b Fix breakage with setopt ERR_RETURN (Issue #60) 2017-05-05 19:20:48 +01:00
Suraj N. KurapatiandGitHub 2b6451de03 README: upgrade to CommonMark; move <C-v> note up 2017-05-05 03:34:00 -07:00
Suraj N. KurapatiandGitHub 21c025eb33 Merge pull request #78 from RuRo/patch-1
Updated README.md keybinding instructions.
2017-05-05 03:24:21 -07:00
RuRoandGitHub 34fdd6b1b2 Updated README.md keybinding instructions.
The solution I propose to add to the README was found in issue https://github.com/zsh-users/zsh-history-substring-search/issues/64#issuecomment-289208209 .
2017-05-03 00:50:18 +03:00
4 changed files with 104 additions and 55 deletions
+2 -2
View File
@@ -1,2 +1,2 @@
# zsh word code files (zcompile)
*.zwc
# zsh word code files (zcompile and zrecompile)
*.zwc*
+42 -8
View File
@@ -17,6 +17,27 @@ Requirements
* [ZSH](http://zsh.sourceforge.net) 4.3 or newer
Install
------------------------------------------------------------------------------
Using the [Homebrew]( https://brew.sh ) package manager:
brew install zsh-history-substring-search
echo 'source /usr/local/share/zsh-history-substring-search/zsh-history-substring-search.zsh' >> ~/.zshrc
Using [Oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh):
1. Clone this repository in oh-my-zsh's plugins directory:
git clone https://github.com/zsh-users/zsh-history-substring-search ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-history-substring-search
2. Activate the plugin in `~/.zshrc`:
plugins=( [plugins...] history-substring-search)
3. Source `~/.zshrc` to take changes into account:
source ~/.zshrc
Usage
------------------------------------------------------------------------------
@@ -35,24 +56,32 @@ Usage
Users typically bind their UP and DOWN arrow keys to this script, thus:
* Run `cat -v` in your favorite terminal emulator to observe key codes.
     (**NOTE:** In some cases, `cat -v` shows the wrong key codes. If the
key codes shown by `cat -v` don't work for you, press `<C-v><UP>` and
`<C-v><DOWN>` at your ZSH command line prompt for correct key codes.)
* Press the UP arrow key and observe what is printed in your terminal.
* Press the DOWN arrow key and observe what is printed in your terminal.
* Press the Control and C keys simultaneously to terminate the `cat -v`.
* Use your observations from the previous steps to create key bindings.
For example, if you observed `^[[A` for UP and `^[[B` for DOWN, then:
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down
You might also want to bind the Control-P/N keys for use in EMACS mode:
However, if the observed values don't work, you can try using terminfo:
bindkey -M emacs '^P' history-substring-search-up
bindkey -M emacs '^N' history-substring-search-down
bindkey "$terminfo[kcuu1]" history-substring-search-up
bindkey "$terminfo[kcud1]" history-substring-search-down
You might also want to bind the `k` and `j` keys for use in VI mode:
You might also want to bind the Control-P/N keys for use in EMACS mode:
bindkey -M vicmd 'k' history-substring-search-up
bindkey -M vicmd 'j' history-substring-search-down
bindkey -M emacs '^P' history-substring-search-up
bindkey -M emacs '^N' history-substring-search-down
You might also want to bind the `k` and `j` keys for use in 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:
@@ -107,6 +136,11 @@ default values only after having loaded this script into your ZSH session.
Flags" section in the zshexpn(1) man page to learn about the kinds of
values you may assign to this variable.
* `HISTORY_SUBSTRING_SEARCH_FUZZY` is a global variable that defines
how the command history will be searched for your query. If set to a non-empty
value, causes this script to perform a fuzzy search by words, matching in
given order e.g. `ab c` will match `*ab*c*`
* `HISTORY_SUBSTRING_SEARCH_ENSURE_UNIQUE` is a global variable that defines
whether all search results returned are _unique_. If set to a non-empty
value, then only unique search results are presented. This behaviour is off
+2
View File
@@ -0,0 +1,2 @@
0=${(%):-%N}
source ${0:A:h}/zsh-history-substring-search.zsh
+58 -45
View File
@@ -7,6 +7,7 @@
# Copyright (c) 2011 Sorin Ionescu
# Copyright (c) 2011 Vincent Guerci
# Copyright (c) 2016 Geza Lore
# Copyright (c) 2017 Bengt Brodersen
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
@@ -39,34 +40,30 @@
##############################################################################
#-----------------------------------------------------------------------------
# declare global variables
#-----------------------------------------------------------------------------
typeset -g BUFFER MATCH MBEGIN MEND CURSOR
typeset -g HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND
typeset -g HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND
typeset -g HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS
typeset -g HISTORY_SUBSTRING_SEARCH_ENSURE_UNIQUE
typeset -g _history_substring_search_refresh_display
typeset -g _history_substring_search_query_highlight
typeset -g _history_substring_search_result
typeset -g _history_substring_search_query
typeset -g -A _history_substring_search_raw_matches
typeset -g _history_substring_search_raw_match_index
typeset -g -A _history_substring_search_matches
typeset -g -A _history_substring_search_unique_filter
typeset -g _history_substring_search_match_index
#-----------------------------------------------------------------------------
# configuration variables
# declare global configuration variables
#-----------------------------------------------------------------------------
typeset -g HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND='bg=magenta,fg=white,bold'
typeset -g HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND='bg=red,fg=white,bold'
typeset -g HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS='i'
typeset -g HISTORY_SUBSTRING_SEARCH_ENSURE_UNIQUE=''
typeset -g _history_substring_search_{refresh_display,query_highlight,result,query,match_index,raw_match_index}
typeset -ga _history_substring_search{,_raw}_matches
typeset -g HISTORY_SUBSTRING_SEARCH_FUZZY=''
#-----------------------------------------------------------------------------
# declare internal global variables
#-----------------------------------------------------------------------------
typeset -g BUFFER MATCH MBEGIN MEND CURSOR
typeset -g _history_substring_search_refresh_display
typeset -g _history_substring_search_query_highlight
typeset -g _history_substring_search_result
typeset -g _history_substring_search_query
typeset -g -a _history_substring_search_query_parts
typeset -g -a _history_substring_search_raw_matches
typeset -g -i _history_substring_search_raw_match_index
typeset -g -a _history_substring_search_matches
typeset -g -i _history_substring_search_match_index
typeset -g -A _history_substring_search_unique_filter
#-----------------------------------------------------------------------------
# the main ZLE widgets
@@ -223,6 +220,7 @@ _history-substring-search-begin() {
# speed things up a little.
#
_history_substring_search_query=
_history_substring_search_query_parts=()
_history_substring_search_raw_matches=()
else
@@ -233,20 +231,31 @@ _history-substring-search-begin() {
_history_substring_search_query=$BUFFER
#
# $BUFFER contains the text that is in the command-line currently.
# we put an extra "\\" before meta characters such as "\(" and "\)",
# so that they become "\\\(" and "\\\)".
# compose search pattern
#
local escaped_query=${BUFFER//(#m)[\][()|\\*?#<>~^]/\\$MATCH}
if [[ -n $HISTORY_SUBSTRING_SEARCH_FUZZY ]]; then
#
# `=` split string in arguments
#
_history_substring_search_query_parts=(${=_history_substring_search_query})
else
_history_substring_search_query_parts=(${==_history_substring_search_query})
fi
#
# Find all occurrences of the search query in the history file.
# Escape and join query parts with wildcard character '*' as seperator
# `(j:CHAR:)` join array to string with CHAR as seperator
#
local search_pattern="*${(j:*:)_history_substring_search_query_parts[@]//(#m)[\][()|\\*?#<>~^]/\\$MATCH}*"
#
# Find all occurrences of the search pattern in the history file.
#
# (k) returns the "keys" (history index numbers) instead of the values
# (R) returns values in reverse older, so the index of the youngest
# matching history entry is at the head of the list.
#
_history_substring_search_raw_matches=(${(k)history[(R)(#$HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS)*${escaped_query}*]})
_history_substring_search_raw_matches=(${(k)history[(R)(#$HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS)${search_pattern}]})
fi
#
@@ -265,8 +274,7 @@ _history-substring-search-begin() {
#
_history_substring_search_raw_match_index=0
_history_substring_search_matches=()
unset _history_substring_search_unique_filter
typeset -A -g _history_substring_search_unique_filter
_history_substring_search_unique_filter=()
#
# If $_history_substring_search_match_index is equal to
@@ -309,16 +317,21 @@ _history-substring-search-end() {
_zsh_highlight
# highlight the search query inside the command line
if [[ -n $_history_substring_search_query_highlight && -n $_history_substring_search_query ]]; then
#
# The following expression yields a variable $MBEGIN, which
# indicates the begin position + 1 of the first occurrence
# of _history_substring_search_query in $BUFFER.
#
: ${(S)BUFFER##(#m$HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS)($_history_substring_search_query##)}
local begin=$(( MBEGIN - 1 ))
local end=$(( begin + $#_history_substring_search_query ))
region_highlight+=("$begin $end $_history_substring_search_query_highlight")
if [[ -n $_history_substring_search_query_highlight ]]; then
# highlight first matching query parts
local highlight_start_index=0
local highlight_end_index=0
local query_part
for query_part in $_history_substring_search_query_parts; do
local escaped_query_part=${query_part//(#m)[\][()|\\*?#<>~^]/\\$MATCH}
# (i) get index of pattern
local query_part_match_index="${${BUFFER:$highlight_start_index}[(i)(#$HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS)${escaped_query_part}]}"
if [[ $query_part_match_index -le ${#BUFFER:$highlight_start_index} ]]; then
highlight_start_index=$(( $highlight_start_index + $query_part_match_index ))
highlight_end_index=$(( $highlight_start_index + ${#query_part} ))
region_highlight+=("$(($highlight_start_index - 1)) $(($highlight_end_index - 1)) $_history_substring_search_query_highlight")
fi
done
fi
# For debugging purposes:
@@ -447,7 +460,7 @@ _history_substring_search_process_raw_matches() {
#
# Move on to the next raw entry and get its history index.
#
(( _history_substring_search_raw_match_index++ ))
_history_substring_search_raw_match_index+=1
local index=${_history_substring_search_raw_matches[$_history_substring_search_raw_match_index]}
#
@@ -627,7 +640,7 @@ _history-substring-search-up-search() {
# 1. Move index to point to the next match.
# 2. Update display to indicate search found.
#
(( _history_substring_search_match_index++ ))
_history_substring_search_match_index+=1
_history-substring-search-found
else
@@ -638,7 +651,7 @@ _history-substring-search-up-search() {
# _history_substring_search_matches.
# 2. Update display to indicate search not found.
#
(( _history_substring_search_match_index++ ))
_history_substring_search_match_index+=1
_history-substring-search-not-found
fi
@@ -707,7 +720,7 @@ _history-substring-search-down-search() {
# 1. Move index to point to the previous match.
# 2. Update display to indicate search found.
#
(( _history_substring_search_match_index-- ))
_history_substring_search_match_index+=-1
_history-substring-search-found
else
@@ -718,7 +731,7 @@ _history-substring-search-down-search() {
# _history_substring_search_matches.
# 2. Update display to indicate search not found.
#
(( _history_substring_search_match_index-- ))
_history_substring_search_match_index+=-1
_history-substring-search-not-found
fi