From f90d040784fa67d7bc5e9aca5bdd6517db0bc40e Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Sat, 25 Jan 2020 07:44:44 -0700 Subject: [PATCH 01/36] cleanup: Use more idiomatic method of checking if var is set We are already using this method in other places. For example: `ZSH_AUTOSUGGEST_USE_ASYNC` --- src/widgets.zsh | 4 ++-- zsh-autosuggestions.zsh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/widgets.zsh b/src/widgets.zsh index 8f09792..f9c55de 100644 --- a/src/widgets.zsh +++ b/src/widgets.zsh @@ -20,7 +20,7 @@ _zsh_autosuggest_enable() { # Toggle suggestions (enable/disable) _zsh_autosuggest_toggle() { - if [[ -n "${_ZSH_AUTOSUGGEST_DISABLED+x}" ]]; then + if (( ${+_ZSH_AUTOSUGGEST_DISABLED} )); then _zsh_autosuggest_enable else _zsh_autosuggest_disable @@ -79,7 +79,7 @@ _zsh_autosuggest_modify() { fi # Bail out if suggestions are disabled - if [[ -n "${_ZSH_AUTOSUGGEST_DISABLED+x}" ]]; then + if (( ${+_ZSH_AUTOSUGGEST_DISABLED} )); then return $? fi diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index a8ef6c4..01c5392 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -282,7 +282,7 @@ _zsh_autosuggest_enable() { # Toggle suggestions (enable/disable) _zsh_autosuggest_toggle() { - if [[ -n "${_ZSH_AUTOSUGGEST_DISABLED+x}" ]]; then + if (( ${+_ZSH_AUTOSUGGEST_DISABLED} )); then _zsh_autosuggest_enable else _zsh_autosuggest_disable @@ -341,7 +341,7 @@ _zsh_autosuggest_modify() { fi # Bail out if suggestions are disabled - if [[ -n "${_ZSH_AUTOSUGGEST_DISABLED+x}" ]]; then + if (( ${+_ZSH_AUTOSUGGEST_DISABLED} )); then return $? fi From 7682c13860597ce09e672faeae7d3429d5460dcc Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Sat, 25 Jan 2020 07:47:23 -0700 Subject: [PATCH 02/36] cleanup: Pull built-in widget actions into global variable --- src/widgets.zsh | 26 +++++++++++++++++--------- zsh-autosuggestions.zsh | 26 +++++++++++++++++--------- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/widgets.zsh b/src/widgets.zsh index 8f09792..3c543d9 100644 --- a/src/widgets.zsh +++ b/src/widgets.zsh @@ -205,8 +205,21 @@ _zsh_autosuggest_partial_accept() { } () { + typeset -ga _ZSH_AUTOSUGGEST_BUILTIN_ACTIONS + + _ZSH_AUTOSUGGEST_BUILTIN_ACTIONS=( + clear + fetch + suggest + accept + execute + enable + disable + toggle + ) + local action - for action in clear modify fetch suggest accept partial_accept execute enable disable toggle; do + for action in $_ZSH_AUTOSUGGEST_BUILTIN_ACTIONS modify partial_accept; do eval "_zsh_autosuggest_widget_$action() { local -i retval @@ -223,12 +236,7 @@ _zsh_autosuggest_partial_accept() { }" done - zle -N autosuggest-fetch _zsh_autosuggest_widget_fetch - zle -N autosuggest-suggest _zsh_autosuggest_widget_suggest - zle -N autosuggest-accept _zsh_autosuggest_widget_accept - zle -N autosuggest-clear _zsh_autosuggest_widget_clear - zle -N autosuggest-execute _zsh_autosuggest_widget_execute - zle -N autosuggest-enable _zsh_autosuggest_widget_enable - zle -N autosuggest-disable _zsh_autosuggest_widget_disable - zle -N autosuggest-toggle _zsh_autosuggest_widget_toggle + for action in $_ZSH_AUTOSUGGEST_BUILTIN_ACTIONS; do + zle -N autosuggest-$action _zsh_autosuggest_widget_$action + done } diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index a8ef6c4..3354988 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -467,8 +467,21 @@ _zsh_autosuggest_partial_accept() { } () { + typeset -ga _ZSH_AUTOSUGGEST_BUILTIN_ACTIONS + + _ZSH_AUTOSUGGEST_BUILTIN_ACTIONS=( + clear + fetch + suggest + accept + execute + enable + disable + toggle + ) + local action - for action in clear modify fetch suggest accept partial_accept execute enable disable toggle; do + for action in $_ZSH_AUTOSUGGEST_BUILTIN_ACTIONS modify partial_accept; do eval "_zsh_autosuggest_widget_$action() { local -i retval @@ -485,14 +498,9 @@ _zsh_autosuggest_partial_accept() { }" done - zle -N autosuggest-fetch _zsh_autosuggest_widget_fetch - zle -N autosuggest-suggest _zsh_autosuggest_widget_suggest - zle -N autosuggest-accept _zsh_autosuggest_widget_accept - zle -N autosuggest-clear _zsh_autosuggest_widget_clear - zle -N autosuggest-execute _zsh_autosuggest_widget_execute - zle -N autosuggest-enable _zsh_autosuggest_widget_enable - zle -N autosuggest-disable _zsh_autosuggest_widget_disable - zle -N autosuggest-toggle _zsh_autosuggest_widget_toggle + for action in $_ZSH_AUTOSUGGEST_BUILTIN_ACTIONS; do + zle -N autosuggest-$action _zsh_autosuggest_widget_$action + done } #--------------------------------------------------------------------# From c114bd2298dcb8a4d30f2c9c61393bf2bd1186dd Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Sat, 25 Jan 2020 07:47:58 -0700 Subject: [PATCH 03/36] Be more specific about the built-in widgets we want to avoid wrapping To avoid wrapping the built-in widgets (e.g. `autosuggest-fetch`, `autosuggest-toggle`), we were ignoring all widgets whose names start with `autosuggest-`. This had the downside of preventing wrapping of user-defined widgets whose names happened to also start with that prefix. By being more specific about the exact built-in widgets we want to avoid wrapping, we can allow users to define widgets whose names start with `autosuggest-`. See GitHub issue #496. --- src/bind.zsh | 2 +- zsh-autosuggestions.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bind.zsh b/src/bind.zsh index fc2da9e..1dde137 100644 --- a/src/bind.zsh +++ b/src/bind.zsh @@ -69,7 +69,7 @@ _zsh_autosuggest_bind_widgets() { ignore_widgets=( .\* _\* - autosuggest-\* + ${_ZSH_AUTOSUGGEST_BUILTIN_ACTIONS/#/autosuggest-} $ZSH_AUTOSUGGEST_ORIGINAL_WIDGET_PREFIX\* $ZSH_AUTOSUGGEST_IGNORE_WIDGETS ) diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 3354988..3edf01f 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -199,7 +199,7 @@ _zsh_autosuggest_bind_widgets() { ignore_widgets=( .\* _\* - autosuggest-\* + ${_ZSH_AUTOSUGGEST_BUILTIN_ACTIONS/#/autosuggest-} $ZSH_AUTOSUGGEST_ORIGINAL_WIDGET_PREFIX\* $ZSH_AUTOSUGGEST_IGNORE_WIDGETS ) From 19e375bbc81d32aed85596dc73ccfe46aae7bbd5 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Sun, 26 Jan 2020 21:15:47 -0700 Subject: [PATCH 04/36] cleanup: Consolidate `autoload`s --- src/start.zsh | 4 +++- src/strategies/completion.zsh | 2 -- zsh-autosuggestions.zsh | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/start.zsh b/src/start.zsh index 5991039..221e932 100644 --- a/src/start.zsh +++ b/src/start.zsh @@ -18,6 +18,8 @@ _zsh_autosuggest_start() { _zsh_autosuggest_bind_widgets } +# Mark for auto-loading the functions that we use +autoload -Uz add-zsh-hook is-at-least + # Start the autosuggestion widgets on the next precmd -autoload -Uz add-zsh-hook add-zsh-hook precmd _zsh_autosuggest_start diff --git a/src/strategies/completion.zsh b/src/strategies/completion.zsh index 4290f0c..e2d114c 100644 --- a/src/strategies/completion.zsh +++ b/src/strategies/completion.zsh @@ -45,8 +45,6 @@ _zsh_autosuggest_capture_completion_widget() { zle -N autosuggest-capture-completion _zsh_autosuggest_capture_completion_widget _zsh_autosuggest_capture_setup() { - autoload -Uz is-at-least - # There is a bug in zpty module in older zsh versions by which a # zpty that exits will kill all zpty processes that were forked # before it. Here we set up a zsh exit hook to SIGKILL the zpty diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index a8ef6c4..3277dbb 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -541,8 +541,6 @@ _zsh_autosuggest_capture_completion_widget() { zle -N autosuggest-capture-completion _zsh_autosuggest_capture_completion_widget _zsh_autosuggest_capture_setup() { - autoload -Uz is-at-least - # There is a bug in zpty module in older zsh versions by which a # zpty that exits will kill all zpty processes that were forked # before it. Here we set up a zsh exit hook to SIGKILL the zpty @@ -853,6 +851,8 @@ _zsh_autosuggest_start() { _zsh_autosuggest_bind_widgets } +# Mark for auto-loading the functions that we use +autoload -Uz add-zsh-hook is-at-least + # Start the autosuggestion widgets on the next precmd -autoload -Uz add-zsh-hook add-zsh-hook precmd _zsh_autosuggest_start From 6c634c1e35cd6093ad01bb6002f63aa5c0f6a3b6 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Sun, 26 Jan 2020 21:18:01 -0700 Subject: [PATCH 05/36] Enable async mode by default in newer versions of zsh Allow users to override the default by unsetting (or setting) the ZSH_AUTOSUGGEST_USE_ASYNC variable. See GitHub issue #498. --- README.md | 6 ++++-- spec/options/use_async_spec.rb | 7 ------- src/start.zsh | 8 ++++++++ zsh-autosuggestions.zsh | 8 ++++++++ 4 files changed, 20 insertions(+), 9 deletions(-) delete mode 100644 spec/options/use_async_spec.rb diff --git a/README.md b/README.md index 06d26e3..90ec32f 100644 --- a/README.md +++ b/README.md @@ -79,9 +79,11 @@ Widgets that modify the buffer and are not found in any of these arrays will fet Set `ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE` to an integer value to disable autosuggestion for large buffers. The default is unset, which means that autosuggestion will be tried for any buffer size. Recommended value is 20. This can be useful when pasting large amount of text in the terminal, to avoid triggering autosuggestion for strings that are too long. -### Enable Asynchronous Mode +### Asynchronous Mode -As of `v0.4.0`, suggestions can be fetched asynchronously. To enable this behavior, set the `ZSH_AUTOSUGGEST_USE_ASYNC` variable (it can be set to anything). +Suggestions are fetched asynchronously by default in zsh versions 5.0.8 and greater. To disable asynchronous suggestions and fetch them synchronously instead, `unset ZSH_AUTOSUGGEST_USE_ASYNC` after sourcing the plugin. + +Alternatively, if you are using a version of zsh older than 5.0.8 and want to enable asynchronous mode, set the `ZSH_AUTOSUGGEST_USE_ASYNC` variable after sourcing the plugin (it can be set to anything). Note that there is [a bug](https://github.com/zsh-users/zsh-autosuggestions/issues/364#issuecomment-481423232) in versions of zsh older than 5.0.8 where ctrl + c will fail to reset the prompt immediately after fetching a suggestion asynchronously. ### Disabling automatic widget re-binding diff --git a/spec/options/use_async_spec.rb b/spec/options/use_async_spec.rb deleted file mode 100644 index 420dcc3..0000000 --- a/spec/options/use_async_spec.rb +++ /dev/null @@ -1,7 +0,0 @@ -describe 'suggestion fetching' do - it 'is performed synchronously' - - context 'when ZSH_AUTOSUGGEST_USE_ASYNC is set' do - it 'is performed asynchronously' - end -end diff --git a/src/start.zsh b/src/start.zsh index 221e932..5d4ee52 100644 --- a/src/start.zsh +++ b/src/start.zsh @@ -21,5 +21,13 @@ _zsh_autosuggest_start() { # Mark for auto-loading the functions that we use autoload -Uz add-zsh-hook is-at-least +# Automatically enable asynchronous mode in newer versions of zsh. Disable for +# older versions because there is a bug when using async mode where ^C does not +# work immediately after fetching a suggestion. +# See https://github.com/zsh-users/zsh-autosuggestions/issues/364 +if is-at-least 5.0.8; then + typeset -g ZSH_AUTOSUGGEST_USE_ASYNC= +fi + # Start the autosuggestion widgets on the next precmd add-zsh-hook precmd _zsh_autosuggest_start diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 3277dbb..7f43f10 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -854,5 +854,13 @@ _zsh_autosuggest_start() { # Mark for auto-loading the functions that we use autoload -Uz add-zsh-hook is-at-least +# Automatically enable asynchronous mode in newer versions of zsh. Disable for +# older versions because there is a bug when using async mode where ^C does not +# work immediately after fetching a suggestion. +# See https://github.com/zsh-users/zsh-autosuggestions/issues/364 +if is-at-least 5.0.8; then + typeset -g ZSH_AUTOSUGGEST_USE_ASYNC= +fi + # Start the autosuggestion widgets on the next precmd add-zsh-hook precmd _zsh_autosuggest_start From a83c7cf9d6a23175079fe28d986e54634e32e0c2 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Sun, 26 Jan 2020 21:26:38 -0700 Subject: [PATCH 06/36] Add links to documentation on zsh glob patterns to the readme See GitHub issue #503 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 06d26e3..ae9ab53 100644 --- a/README.md +++ b/README.md @@ -89,13 +89,13 @@ Set `ZSH_AUTOSUGGEST_MANUAL_REBIND` (it can be set to anything) to disable autom ### Ignoring history suggestions that match a pattern -Set `ZSH_AUTOSUGGEST_HISTORY_IGNORE` to a glob pattern to prevent offering suggestions for history entries that match the pattern. For example, set it to `"cd *"` to never suggest any `cd` commands from history. Or set to `"?(#c50,)"` to never suggest anything 50 characters or longer. +Set `ZSH_AUTOSUGGEST_HISTORY_IGNORE` to a [glob pattern](http://zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Operators) to prevent offering suggestions for history entries that match the pattern. For example, set it to `"cd *"` to never suggest any `cd` commands from history. Or set to `"?(#c50,)"` to never suggest anything 50 characters or longer. **Note:** This only affects the `history` and `match_prev_cmd` suggestion strategies. ### Skipping completion suggestions for certain cases -Set `ZSH_AUTOSUGGEST_COMPLETION_IGNORE` to a glob pattern to prevent offering completion suggestions when the buffer matches that pattern. For example, set it to `"git *"` to disable completion suggestions for git subcommands. +Set `ZSH_AUTOSUGGEST_COMPLETION_IGNORE` to a [glob pattern](http://zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Operators) to prevent offering completion suggestions when the buffer matches that pattern. For example, set it to `"git *"` to disable completion suggestions for git subcommands. **Note:** This only affects the `completion` suggestion strategy. From e715ffb1ae48b04a30a83c3556194d7d5e83daa4 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Wed, 6 May 2020 07:23:55 -0600 Subject: [PATCH 07/36] Rewrite `with_history` test helper to be more robust Write mock history to a temp file and load it directly with `fc -R` instead of running each command individually to build up the history. --- spec/multi_line_spec.rb | 7 +------ spec/spec_helper.rb | 23 +++++++++++++---------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/spec/multi_line_spec.rb b/spec/multi_line_spec.rb index 4ff2ae1..364780a 100644 --- a/spec/multi_line_spec.rb +++ b/spec/multi_line_spec.rb @@ -1,11 +1,6 @@ describe 'a multi-line suggestion' do it 'should be displayed on multiple lines' do - with_history(-> { - session.send_string('echo "') - session.send_keys('enter') - session.send_string('"') - session.send_keys('enter') - }) do + with_history("echo \"\n\"") do session.send_keys('e') wait_for { session.content }.to eq("echo \"\n\"") end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index cb149ef..dc1abb0 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,6 +1,7 @@ require 'pry' require 'rspec/wait' require 'terminal_session' +require 'tempfile' RSpec.shared_context 'terminal session' do let(:term_opts) { {} } @@ -21,18 +22,20 @@ RSpec.shared_context 'terminal session' do end def with_history(*commands, &block) - session.run_command('fc -p') + Tempfile.create do |f| + f.write(commands.map{|c| c.gsub("\n", "\\\n")}.join("\n")) + f.flush - commands.each do |c| - c.respond_to?(:call) ? c.call : session.run_command(c) + session.run_command('fc -p') + session.run_command("fc -R #{f.path}") + + session.clear_screen + + yield block + + session.send_keys('C-c') + session.run_command('fc -P') end - - session.clear_screen - - yield block - - session.send_keys('C-c') - session.run_command('fc -P') end end From 05f22fa8a32634534afc2efbefd4458632d5569f Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Wed, 6 May 2020 23:36:22 -0600 Subject: [PATCH 08/36] Fix flaky special char specs by not using `with_history` twice per test There's something funny occasionally happening when `with_history` is used twice in the same test. It seems to be happening more frequently since asynchronous mode was enabled by default. My guess is it has something to do with the `C-c` keys being sent toward the end not consistently terminating the prompt. But I'm really not sure how it would ever get into a `then` block like it seems to: ``` Failure/Error: wait_for { session.content }.to eq('echo "hello\nworld"') expected: "echo \"hello\\nworld\"" got: "then> echo \"hello\\" ``` Sticking to only one `with_history` per terminal session (per test) seems to fix the flakiness. I also removed an old test case because I could not understand why it was necessary and so couldn't write a good description for it. Could be we'll need to add it back in at some point. --- spec/strategies/special_characters_helper.rb | 27 +++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/spec/strategies/special_characters_helper.rb b/spec/strategies/special_characters_helper.rb index 8771861..eb1f0cd 100644 --- a/spec/strategies/special_characters_helper.rb +++ b/spec/strategies/special_characters_helper.rb @@ -1,58 +1,71 @@ shared_examples 'special characters' do - describe 'a special character in the buffer' do - it 'should be treated like any other character' do + describe 'a special character in the buffer should be treated like any other character' do + it 'asterisk' do with_history('echo "hello*"', 'echo "hello."') do session.send_string('echo "hello*') wait_for { session.content }.to eq('echo "hello*"') end + end + it 'question mark' do with_history('echo "hello?"', 'echo "hello."') do session.send_string('echo "hello?') wait_for { session.content }.to eq('echo "hello?"') end + end + it 'backslash' do with_history('echo "hello\nworld"') do session.send_string('echo "hello\\') wait_for { session.content }.to eq('echo "hello\nworld"') end + end + it 'double backslash' do with_history('echo "\\\\"') do session.send_string('echo "\\\\') wait_for { session.content }.to eq('echo "\\\\"') end + end + it 'tilde' do with_history('echo ~/foo') do session.send_string('echo ~') wait_for { session.content }.to eq('echo ~/foo') end + end + it 'parentheses' do with_history('echo "$(ls foo)"') do session.send_string('echo "$(') wait_for { session.content }.to eq('echo "$(ls foo)"') end + end + it 'square bracket' do with_history('echo "$history[123]"') do session.send_string('echo "$history[') wait_for { session.content }.to eq('echo "$history[123]"') session.send_string('123]') wait_for { session.content }.to eq('echo "$history[123]"') end + end + it 'octothorpe' do with_history('echo "#yolo"') do session.send_string('echo "#') wait_for { session.content }.to eq('echo "#yolo"') end + end - with_history('echo "#foo"', 'echo $#abc') do - session.send_string('echo "#') - wait_for { session.content }.to eq('echo "#foo"') - end - + it 'caret' do with_history('echo "^A"', 'echo "^B"') do session.send_string('echo "^A') wait_for { session.content }.to eq('echo "^A"') end + end + it 'dash' do with_history('-foo() {}') do session.send_string('-') wait_for { session.content }.to eq('-foo() {}') From e0b96e1bd6810a1303a0869658916974a6674187 Mon Sep 17 00:00:00 2001 From: Roman Perepelitsa Date: Fri, 29 May 2020 09:39:26 +0200 Subject: [PATCH 09/36] fix a bug in partial acceptance of suggestions To reproduce: 1. Run `zsh -f`. 2. Run this: function bye() { BUFFER=bye } zle -N bye bindkey '^B' bye print -s 'hibye unexpected' source ~/zsh-autosuggestions/zsh-autosuggestions.zsh 3. Type `hi` and press Ctrl-B. Expected: POSTBUFFER is empty. Actual: POSTBUFFER is " unexpected". --- src/widgets.zsh | 17 +++-------------- zsh-autosuggestions.zsh | 17 +++-------------- 2 files changed, 6 insertions(+), 28 deletions(-) diff --git a/src/widgets.zsh b/src/widgets.zsh index 8f09792..d4b36e8 100644 --- a/src/widgets.zsh +++ b/src/widgets.zsh @@ -61,20 +61,9 @@ _zsh_autosuggest_modify() { return $retval fi - # Optimize if manually typing in the suggestion - if (( $#BUFFER > $#orig_buffer )); then - local added=${BUFFER#$orig_buffer} - - # If the string added matches the beginning of the postdisplay - if [[ "$added" = "${orig_postdisplay:0:$#added}" ]]; then - POSTDISPLAY="${orig_postdisplay:$#added}" - return $retval - fi - fi - - # Don't fetch a new suggestion if the buffer hasn't changed - if [[ "$BUFFER" = "$orig_buffer" ]]; then - POSTDISPLAY="$orig_postdisplay" + # Optimize if manually typing in the suggestion or if buffer hasn't changed + if [[ "$BUFFER" = "$orig_buffer"* && "$orig_postdisplay" = "${BUFFER:$#orig_buffer}"* ]]; then + POSTDISPLAY="${orig_postdisplay:$(($#BUFFER - $#orig_buffer))}" return $retval fi diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index a8ef6c4..7121fe0 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -323,20 +323,9 @@ _zsh_autosuggest_modify() { return $retval fi - # Optimize if manually typing in the suggestion - if (( $#BUFFER > $#orig_buffer )); then - local added=${BUFFER#$orig_buffer} - - # If the string added matches the beginning of the postdisplay - if [[ "$added" = "${orig_postdisplay:0:$#added}" ]]; then - POSTDISPLAY="${orig_postdisplay:$#added}" - return $retval - fi - fi - - # Don't fetch a new suggestion if the buffer hasn't changed - if [[ "$BUFFER" = "$orig_buffer" ]]; then - POSTDISPLAY="$orig_postdisplay" + # Optimize if manually typing in the suggestion or if buffer hasn't changed + if [[ "$BUFFER" = "$orig_buffer"* && "$orig_postdisplay" = "${BUFFER:$#orig_buffer}"* ]]; then + POSTDISPLAY="${orig_postdisplay:$(($#BUFFER - $#orig_buffer))}" return $retval fi From 9ad305c906bf3e227236e890fd51423c2a689ab3 Mon Sep 17 00:00:00 2001 From: keskinsaf Date: Mon, 8 Mar 2021 14:44:01 +0300 Subject: [PATCH 10/36] Update INSTALL.md [fix] install this plugin aside other plugins --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 9d2915e..3c0ac3a 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -39,7 +39,7 @@ 2. Add the plugin to the list of plugins for Oh My Zsh to load (inside `~/.zshrc`): ```sh - plugins=(zsh-autosuggestions) + plugins=( [plugins...] zsh-autosuggestions) ``` 3. Start a new terminal session. From bb18c4f677b95c2a324ca848fa6c3b9ed1515415 Mon Sep 17 00:00:00 2001 From: keskinsaf Date: Tue, 9 Mar 2021 11:08:18 +0300 Subject: [PATCH 11/36] Update INSTALL.md --- INSTALL.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 3c0ac3a..196524f 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -39,7 +39,10 @@ 2. Add the plugin to the list of plugins for Oh My Zsh to load (inside `~/.zshrc`): ```sh - plugins=( [plugins...] zsh-autosuggestions) + plugins=( + # other plugins... + zsh-autosuggestions + ) ``` 3. Start a new terminal session. From 590c1cd84ca0157bf41fdd8ad87313125644ea5f Mon Sep 17 00:00:00 2001 From: Andrew Tropin Date: Sat, 15 May 2021 08:22:14 +0300 Subject: [PATCH 12/36] Disable ^C async workaround for zsh version 5.8 and later --- src/async.zsh | 3 ++- zsh-autosuggestions.zsh | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/async.zsh b/src/async.zsh index 4314e8c..218eb26 100644 --- a/src/async.zsh +++ b/src/async.zsh @@ -44,7 +44,8 @@ _zsh_autosuggest_async_request() { # There's a weird bug here where ^C stops working unless we force a fork # See https://github.com/zsh-users/zsh-autosuggestions/issues/364 - command true + autoload -Uz is-at-least + is-at-least 5.8 || command true # Read the pid from the child process read _ZSH_AUTOSUGGEST_CHILD_PID <&$_ZSH_AUTOSUGGEST_ASYNC_FD diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index ee9d800..21a4b42 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -810,7 +810,8 @@ _zsh_autosuggest_async_request() { # There's a weird bug here where ^C stops working unless we force a fork # See https://github.com/zsh-users/zsh-autosuggestions/issues/364 - command true + autoload -Uz is-at-least + is-at-least 5.8 || command true # Read the pid from the child process read _ZSH_AUTOSUGGEST_CHILD_PID <&$_ZSH_AUTOSUGGEST_ASYNC_FD From 89c600c873a7e64b075c916850e80bfd62f81de9 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Fri, 4 Jun 2021 13:47:01 -0600 Subject: [PATCH 13/36] Support new zsh version: 5.8 --- ZSH_VERSIONS | 1 + 1 file changed, 1 insertion(+) diff --git a/ZSH_VERSIONS b/ZSH_VERSIONS index ed7b882..18ed7a6 100644 --- a/ZSH_VERSIONS +++ b/ZSH_VERSIONS @@ -14,3 +14,4 @@ 5.5.1 5.6.2 5.7.1 +5.8 From 3ecc53dfe29442ecc4bcb7f3af6c3a263407ab7c Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Fri, 4 Jun 2021 16:01:04 -0600 Subject: [PATCH 14/36] Update license copyright year --- LICENSE | 2 +- zsh-autosuggestions.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index ef7cfb6..7ea78cc 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,5 @@ Copyright (c) 2013 Thiago de Arruda -Copyright (c) 2016-2019 Eric Freese +Copyright (c) 2016-2021 Eric Freese Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 1eda1b1..fa37293 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -2,7 +2,7 @@ # https://github.com/zsh-users/zsh-autosuggestions # v0.6.4 # Copyright (c) 2013 Thiago de Arruda -# Copyright (c) 2016-2019 Eric Freese +# Copyright (c) 2016-2021 Eric Freese # # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and associated documentation From 74ba3739bb1d202d7fe4e309e2e907df228b4325 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Fri, 4 Jun 2021 15:57:51 -0600 Subject: [PATCH 15/36] Update changelog for v0.7.0 release --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc2a1fa..15d65a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## v0.7.0 +- Enable asynchronous mode by default (#498) +- No longer wrap user widgets starting with `autosuggest-` prefix (#496) +- Fix a bug wrapping widgets that modify the buffer (#541) + + ## v0.6.4 - Fix `vi-forward-char` triggering a bell when using it to accept a suggestion (#488) - New configuration option to skip completion suggestions when buffer matches a pattern (#487) From fcca87555fe5c0c93c5ba865505a7e5d7a1a95cb Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Fri, 4 Jun 2021 16:00:37 -0600 Subject: [PATCH 16/36] v0.7.0 --- VERSION | 2 +- zsh-autosuggestions.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 2fc7b36..8b20e48 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v0.6.4 +v0.7.0 diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index fa37293..b19cac7 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -1,6 +1,6 @@ # Fish-like fast/unobtrusive autosuggestions for zsh. # https://github.com/zsh-users/zsh-autosuggestions -# v0.6.4 +# v0.7.0 # Copyright (c) 2013 Thiago de Arruda # Copyright (c) 2016-2021 Eric Freese # From 69bf058c231ec94006c0c31c96343ce6a60d4ac9 Mon Sep 17 00:00:00 2001 From: JeeBak Kim Date: Sat, 28 Aug 2021 21:13:32 -0700 Subject: [PATCH 17/36] Ensure we're using the builtin exec --- src/async.zsh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/async.zsh b/src/async.zsh index 218eb26..a4fb047 100644 --- a/src/async.zsh +++ b/src/async.zsh @@ -11,7 +11,7 @@ _zsh_autosuggest_async_request() { # If we've got a pending request, cancel it if [[ -n "$_ZSH_AUTOSUGGEST_ASYNC_FD" ]] && { true <&$_ZSH_AUTOSUGGEST_ASYNC_FD } 2>/dev/null; then # Close the file descriptor and remove the handler - exec {_ZSH_AUTOSUGGEST_ASYNC_FD}<&- + builtin exec {_ZSH_AUTOSUGGEST_ASYNC_FD}<&- zle -F $_ZSH_AUTOSUGGEST_ASYNC_FD # We won't know the pid unless the user has zsh/system module installed @@ -32,7 +32,7 @@ _zsh_autosuggest_async_request() { fi # Fork a process to fetch a suggestion and open a pipe to read from it - exec {_ZSH_AUTOSUGGEST_ASYNC_FD}< <( + builtin exec {_ZSH_AUTOSUGGEST_ASYNC_FD}< <( # Tell parent process our pid echo $sysparams[pid] @@ -68,7 +68,7 @@ _zsh_autosuggest_async_response() { zle autosuggest-suggest -- "$suggestion" # Close the fd - exec {1}<&- + builtin exec {1}<&- fi # Always remove the handler From 8072e52d969409f3a9d5b6e977443e69bc6fe568 Mon Sep 17 00:00:00 2001 From: JeeBak Kim Date: Sat, 28 Aug 2021 21:14:03 -0700 Subject: [PATCH 18/36] Run: make --- zsh-autosuggestions.zsh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index b19cac7..1b95a62 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -766,7 +766,7 @@ _zsh_autosuggest_async_request() { # If we've got a pending request, cancel it if [[ -n "$_ZSH_AUTOSUGGEST_ASYNC_FD" ]] && { true <&$_ZSH_AUTOSUGGEST_ASYNC_FD } 2>/dev/null; then # Close the file descriptor and remove the handler - exec {_ZSH_AUTOSUGGEST_ASYNC_FD}<&- + builtin exec {_ZSH_AUTOSUGGEST_ASYNC_FD}<&- zle -F $_ZSH_AUTOSUGGEST_ASYNC_FD # We won't know the pid unless the user has zsh/system module installed @@ -787,7 +787,7 @@ _zsh_autosuggest_async_request() { fi # Fork a process to fetch a suggestion and open a pipe to read from it - exec {_ZSH_AUTOSUGGEST_ASYNC_FD}< <( + builtin exec {_ZSH_AUTOSUGGEST_ASYNC_FD}< <( # Tell parent process our pid echo $sysparams[pid] @@ -823,7 +823,7 @@ _zsh_autosuggest_async_response() { zle autosuggest-suggest -- "$suggestion" # Close the fd - exec {1}<&- + builtin exec {1}<&- fi # Always remove the handler From 56f10c3b5dac558a7fcc7aa47459e4ac0eec3dc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Cegli=C5=84ski?= Date: Fri, 17 Sep 2021 00:07:03 +0200 Subject: [PATCH 19/36] Always reset file descriptor after consuming it This prevents the request cancelling logic from closing an unrelated fd that happens to reuse the same number. --- src/async.zsh | 1 + zsh-autosuggestions.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/src/async.zsh b/src/async.zsh index 218eb26..9a02280 100644 --- a/src/async.zsh +++ b/src/async.zsh @@ -73,4 +73,5 @@ _zsh_autosuggest_async_response() { # Always remove the handler zle -F "$1" + _ZSH_AUTOSUGGEST_ASYNC_FD= } diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index b19cac7..98d1ec2 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -828,6 +828,7 @@ _zsh_autosuggest_async_response() { # Always remove the handler zle -F "$1" + _ZSH_AUTOSUGGEST_ASYNC_FD= } #--------------------------------------------------------------------# From 7795a357e6dbeabe0fcfbe9cd144b93e648144ae Mon Sep 17 00:00:00 2001 From: Jakub Jirutka Date: Tue, 15 Mar 2022 22:52:50 +0100 Subject: [PATCH 20/36] Install: Add Alpine Linux package --- INSTALL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/INSTALL.md b/INSTALL.md index 196524f..321dce3 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -9,6 +9,7 @@ | System | Package | | ------------- | ------------- | +| Alpine Linux | [zsh-autosuggestions](https://pkgs.alpinelinux.org/packages?name=zsh-autosuggestions) | | Debian / Ubuntu | [zsh-autosuggestions OBS repository](https://software.opensuse.org/download.html?project=shells%3Azsh-users%3Azsh-autosuggestions&package=zsh-autosuggestions) | | Fedora / CentOS / RHEL / Scientific Linux | [zsh-autosuggestions OBS repository](https://software.opensuse.org/download.html?project=shells%3Azsh-users%3Azsh-autosuggestions&package=zsh-autosuggestions) | | OpenSUSE / SLE | [zsh-autosuggestions OBS repository](https://software.opensuse.org/download.html?project=shells%3Azsh-users%3Azsh-autosuggestions&package=zsh-autosuggestions) | From fc391d6bf611ff00f0f145575bcc1c6168cf9e6b Mon Sep 17 00:00:00 2001 From: japanese-goblinn Date: Mon, 16 May 2022 22:11:12 +0300 Subject: [PATCH 21/36] fix: Makefile SRC_DIR spacing --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f6d13a7..6f5431e 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -SRC_DIR := ./src +SRC_DIR := ./src SRC_FILES := \ $(SRC_DIR)/config.zsh \ From c14ad9fc4656066fded0d7e2eca051ff805b5abe Mon Sep 17 00:00:00 2001 From: D <49444980+dpthegrey@users.noreply.github.com> Date: Wed, 12 Oct 2022 13:10:21 +0530 Subject: [PATCH 22/36] Update Install.md Adds steps to install zsh-autosuggestions via Homebrew Formulae. --- INSTALL.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/INSTALL.md b/INSTALL.md index 196524f..0733ada 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -3,6 +3,7 @@ * [Packages](#packages) * [Antigen](#antigen) * [Oh My Zsh](#oh-my-zsh) +* [HomeBrew](#homebrew) * [Manual](#manual-git-clone) ## Packages @@ -47,6 +48,21 @@ 3. Start a new terminal session. +## Homebrew + +1. Install command: + ```sh + brew install zsh-autosuggestions + ``` + +2. To activate the autosuggestions, add the following at the end of your .zshrc: + + ```sh + source $(brew --prefix)/share/zsh-autosuggestions/zsh-autosuggestions.zsh + ``` + +3. Start a new terminal session. + ## Manual (Git Clone) 1. Clone this repository somewhere on your machine. This guide will assume `~/.zsh/zsh-autosuggestions`. From f29bb7f032403d831140ee814aba051601248d70 Mon Sep 17 00:00:00 2001 From: migimigi Date: Tue, 14 Feb 2023 01:08:57 +0900 Subject: [PATCH 23/36] Create .gitignore for *.zwc --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d8decde --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# zsh word code files +*.zwc From 2cc34c015e581534e631b37d353b5fb7d34ed151 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Fri, 26 May 2023 17:36:17 -0600 Subject: [PATCH 24/36] Switch from Circle CI to GitHub Actions The testing docker image has been split up. Instead of having one image with all supported versions of zsh installed, we now have a separate image for each supported zsh version. We use GitHub Action matrices to run jobs in parallel for all of the supported versions. We no longer need to publish images to Docker Hub. The images are just built by CI (or developers) as needed from the Dockerfile in the repo. --- .circleci/config.yml | 15 --------- .github/workflows/integration.yml | 51 +++++++++++++++++++++++++++++++ Dockerfile | 9 +++--- README.md | 10 +++--- ZSH_VERSIONS | 4 --- install_test_zsh.sh | 31 +++++++++---------- 6 files changed, 74 insertions(+), 46 deletions(-) delete mode 100644 .circleci/config.yml create mode 100644 .github/workflows/integration.yml diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index d95fa98..0000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,15 +0,0 @@ -version: 2 -jobs: - build: - parallelism: 4 - shell: /bin/bash --login - docker: - - image: ericfreese/zsh-autosuggestions-test:latest - steps: - - checkout - - run: - name: Running tests - command: | - for v in $(grep "^[^#]" ZSH_VERSIONS | awk "(NR + $CIRCLE_NODE_INDEX) % $CIRCLE_NODE_TOTAL == 0"); do - TEST_ZSH_BIN=zsh-$v make test || exit 1 - done diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml new file mode 100644 index 0000000..ec7bc75 --- /dev/null +++ b/.github/workflows/integration.yml @@ -0,0 +1,51 @@ +on: [push, pull_request] +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +env: + IMAGE_CACHE_PATH: /tmp/.image-cache + IMAGE_CACHE_NAME: zsh-autosuggestions-test +jobs: + determine-versions: + runs-on: ubuntu-22.04 + outputs: + versions: ${{ steps.set-versions.outputs.versions }} + steps: + - uses: actions/checkout@v3 + - id: set-versions + run: | + echo "versions=$( + grep "^[^#]" ZSH_VERSIONS \ + | sed -E 's/(^|$)/"/g' \ + | paste -sd ',' - \ + | sed -e 's/^/[/' -e 's/$/]/' + )" >> $GITHUB_OUTPUT + test: + needs: determine-versions + runs-on: ubuntu-22.04 + strategy: + matrix: + version: ${{ fromJson(needs.determine-versions.outputs.versions) }} + steps: + - uses: actions/checkout@v3 + - name: Docker image cache + id: image-cache + uses: actions/cache@v3 + with: + path: ${{ env.IMAGE_CACHE_PATH }} + key: image-cache-${{ matrix.version }}-${{ hashFiles('Dockerfile', 'install_test_zsh.sh', 'Gemfile.lock') }} + - name: Load cached docker image if available + if: ${{ steps.image-cache.outputs.cache-hit }} + run: gunzip < $IMAGE_CACHE_PATH/$IMAGE_CACHE_NAME.tar.gz | docker load + - name: Build the docker image if necessary + if: ${{ !steps.image-cache.outputs.cache-hit }} + run: | + docker build --build-arg TEST_ZSH_VERSION=${{ matrix.version }} -t $IMAGE_CACHE_NAME . + mkdir -p $IMAGE_CACHE_PATH + docker save $IMAGE_CACHE_NAME | gzip > $IMAGE_CACHE_PATH/$IMAGE_CACHE_NAME.tar.gz + - name: Run the tests + run: | + docker run --rm \ + -v $PWD:/zsh-autosuggestions \ + $IMAGE_CACHE_NAME \ + make test diff --git a/Dockerfile b/Dockerfile index 0d51407..f5dd3c4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,8 @@ FROM ruby:2.5.3-alpine +ARG TEST_ZSH_VERSION +RUN : "${TEST_ZSH_VERSION:?}" + RUN apk add --no-cache autoconf RUN apk add --no-cache libtool RUN apk add --no-cache libcap-dev @@ -11,10 +14,8 @@ RUN apk add --no-cache tmux WORKDIR /zsh-autosuggestions -ADD ZSH_VERSIONS /zsh-autosuggestions/ZSH_VERSIONS -ADD install_test_zsh.sh /zsh-autosuggestions/install_test_zsh.sh +ADD install_test_zsh.sh ./ RUN ./install_test_zsh.sh -ADD Gemfile /zsh-autosuggestions/Gemfile -ADD Gemfile.lock /zsh-autosuggestions/Gemfile.lock +ADD Gemfile Gemfile.lock ./ RUN bundle install diff --git a/README.md b/README.md index 3cfd2e8..3ee17f3 100644 --- a/README.md +++ b/README.md @@ -170,18 +170,16 @@ Tests are written in ruby using the [`rspec`](http://rspec.info/) framework. The Test files live in `spec/`. To run the tests, run `make test`. To run a specific test, run `TESTS=spec/some_spec.rb make test`. You can also specify a `zsh` binary to use by setting the `TEST_ZSH_BIN` environment variable (ex: `TEST_ZSH_BIN=/bin/zsh make test`). -A docker image for testing is available [on docker hub](https://hub.docker.com/r/ericfreese/zsh-autosuggestions-test). It comes with ruby, the bundler dependencies, and all supported versions of zsh installed. - -Pull the docker image with: +It's possible to run the tests for any supported version of zsh in a Docker image by building an image from the provided Dockerfile. To build the docker image for a specific version of zsh (where `` below is substituted with the contents of a line from the [`ZSH_VERSIONS`](ZSH_VERSIONS) file), run: ```sh -docker pull ericfreese/zsh-autosuggestions-test +docker build --build-arg TEST_ZSH_VERSION= -t zsh-autosuggestions-test . ``` -To run the tests for a specific version of zsh (where `` below is substituted with the contents of a line from the [`ZSH_VERSIONS`](ZSH_VERSIONS) file): +After building the image, run the tests via: ```sh -docker run -it -e TEST_ZSH_BIN=zsh- -v $PWD:/zsh-autosuggestions zsh-autosuggestions-test make test +docker run -it -v $PWD:/zsh-autosuggestions zsh-autosuggestions-test make test ``` diff --git a/ZSH_VERSIONS b/ZSH_VERSIONS index 18ed7a6..0cc79f8 100644 --- a/ZSH_VERSIONS +++ b/ZSH_VERSIONS @@ -1,9 +1,5 @@ # Zsh releases to run tests against # See https://github.com/zsh-users/zsh/releases -# -# When modifying this file, rebuild and push docker image: -# $ docker build -t ericfreese/zsh-autosuggestions-test . -# $ docker push ericfreese/zsh-autosuggestions-test 4.3.11 5.0.2 5.0.8 diff --git a/install_test_zsh.sh b/install_test_zsh.sh index 40dc4c5..6cac9f5 100755 --- a/install_test_zsh.sh +++ b/install_test_zsh.sh @@ -2,25 +2,22 @@ set -ex -for v in $(grep "^[^#]" ZSH_VERSIONS); do - mkdir zsh-$v - cd zsh-$v +mkdir zsh-build +cd zsh-build - curl -L https://api.github.com/repos/zsh-users/zsh/tarball/zsh-$v | tar xz --strip=1 +curl -L https://api.github.com/repos/zsh-users/zsh/tarball/zsh-$TEST_ZSH_VERSION | tar xz --strip=1 - ./Util/preconfig - ./configure --enable-pcre \ - --enable-cap \ - --enable-multibyte \ - --with-term-lib='ncursesw tinfo' \ - --with-tcsetpgrp \ - --program-suffix="-$v" +./Util/preconfig +./configure --enable-pcre \ + --enable-cap \ + --enable-multibyte \ + --with-term-lib='ncursesw tinfo' \ + --with-tcsetpgrp - make install.bin - make install.modules - make install.fns +make install.bin +make install.modules +make install.fns - cd .. +cd .. - rm -rf zsh-$v -done +rm -rf zsh-build From c5044edd48a63166926861ec793759a6d985197c Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Fri, 26 May 2023 19:57:14 -0600 Subject: [PATCH 25/36] Support latest minor version of 5.8 --- ZSH_VERSIONS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ZSH_VERSIONS b/ZSH_VERSIONS index 0cc79f8..b697f29 100644 --- a/ZSH_VERSIONS +++ b/ZSH_VERSIONS @@ -10,4 +10,4 @@ 5.5.1 5.6.2 5.7.1 -5.8 +5.8.1 From 9b0272944fc31af2f5a940ac07acc9054ab14e02 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Fri, 26 May 2023 19:57:30 -0600 Subject: [PATCH 26/36] Add support for 5.9 --- ZSH_VERSIONS | 1 + 1 file changed, 1 insertion(+) diff --git a/ZSH_VERSIONS b/ZSH_VERSIONS index b697f29..23006db 100644 --- a/ZSH_VERSIONS +++ b/ZSH_VERSIONS @@ -11,3 +11,4 @@ 5.6.2 5.7.1 5.8.1 +5.9 From 2b97cf3b30df94afdaf55690d53d7b056ea5757c Mon Sep 17 00:00:00 2001 From: Rob Weir Date: Thu, 17 Aug 2023 23:42:12 +0100 Subject: [PATCH 27/36] Update README.md Clarify where to get `zpty` from. Info from https://apple.stackexchange.com/a/416099 and https://zsh.sourceforge.io/releases.html . --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3cfd2e8..94e0b58 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ For more info, read the Character Highlighting section of the zsh manual: `man z `ZSH_AUTOSUGGEST_STRATEGY` is an array that specifies how suggestions should be generated. The strategies in the array are tried successively until a suggestion is found. There are currently three built-in strategies to choose from: - `history`: Chooses the most recent match from history. -- `completion`: Chooses a suggestion based on what tab-completion would suggest. (requires `zpty` module) +- `completion`: Chooses a suggestion based on what tab-completion would suggest. (requires `zpty` module, which is included with zsh since 4.0.1) - `match_prev_cmd`: Like `history`, but chooses the most recent match whose preceding history item matches the most recently executed command ([more info](src/strategies/match_prev_cmd.zsh)). Note that this strategy won't work as expected with ZSH options that don't preserve the history order such as `HIST_IGNORE_ALL_DUPS` or `HIST_EXPIRE_DUPS_FIRST`. For example, setting `ZSH_AUTOSUGGEST_STRATEGY=(history completion)` will first try to find a suggestion from your history, but, if it can't find a match, will find a suggestion from the completion engine. From 309d32ac9ed5f68a63600d203b656b4100e5589f Mon Sep 17 00:00:00 2001 From: Mike Perrone Date: Sun, 3 Sep 2023 10:00:21 -0700 Subject: [PATCH 28/36] Update INSTALL link for Mac OS - homebrew moved under z/ --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 196524f..3ee58e6 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -15,7 +15,7 @@ | Arch Linux / Manjaro / Antergos / Hyperbola | [zsh-autosuggestions](https://www.archlinux.org/packages/zsh-autosuggestions), [zsh-autosuggestions-git](https://aur.archlinux.org/packages/zsh-autosuggestions-git) | | NixOS | [zsh-autosuggestions](https://github.com/NixOS/nixpkgs/blob/master/pkgs/shells/zsh/zsh-autosuggestions/default.nix) | | Void Linux | [zsh-autosuggestions](https://github.com/void-linux/void-packages/blob/master/srcpkgs/zsh-autosuggestions/template) | -| Mac OS | [homebrew](https://github.com/Homebrew/homebrew-core/blob/master/Formula/zsh-autosuggestions.rb) | +| Mac OS | [homebrew](https://github.com/Homebrew/homebrew-core/blob/master/Formula/z/zsh-autosuggestions.rb) | | NetBSD | [pkgsrc](http://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/shells/zsh-autosuggestions/README.html) | ## Antigen From 23f294345584162a73f43e9616556fcca4bd9ce0 Mon Sep 17 00:00:00 2001 From: Pablo Speciale Date: Sat, 10 Sep 2022 14:58:18 +0200 Subject: [PATCH 29/36] Add more common widgets to list of clear widgets Cherry-picked from PR #706 and updates made to src/config.zsh. Fixes issues #678 --- src/config.zsh | 2 ++ zsh-autosuggestions.zsh | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/config.zsh b/src/config.zsh index 5a0ebd8..32d32b2 100644 --- a/src/config.zsh +++ b/src/config.zsh @@ -28,6 +28,8 @@ typeset -g ZSH_AUTOSUGGEST_ORIGINAL_WIDGET_PREFIX=autosuggest-orig- history-search-backward history-beginning-search-forward history-beginning-search-backward + history-beginning-search-forward-end + history-beginning-search-backward-end history-substring-search-up history-substring-search-down up-line-or-beginning-search diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index b19cac7..cdd8ee2 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -54,6 +54,8 @@ typeset -g ZSH_AUTOSUGGEST_ORIGINAL_WIDGET_PREFIX=autosuggest-orig- history-search-backward history-beginning-search-forward history-beginning-search-backward + history-beginning-search-forward-end + history-beginning-search-backward-end history-substring-search-up history-substring-search-down up-line-or-beginning-search From 11d17e7fea9fba8067f992b3d95e884c20a4069c Mon Sep 17 00:00:00 2001 From: Joe Schaefer Date: Mon, 11 Oct 2021 14:16:42 -0400 Subject: [PATCH 30/36] Clear POSTDISPLAY instead of unsetting We don't have any particular reason to unset. Clearing should be good enough, and avoid any errors using unset parameters. Cherry-picked from PR #634 --- src/widgets.zsh | 10 +++++----- zsh-autosuggestions.zsh | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/widgets.zsh b/src/widgets.zsh index bd61666..7562897 100644 --- a/src/widgets.zsh +++ b/src/widgets.zsh @@ -30,7 +30,7 @@ _zsh_autosuggest_toggle() { # Clear the suggestion _zsh_autosuggest_clear() { # Remove the suggestion - unset POSTDISPLAY + POSTDISPLAY= _zsh_autosuggest_invoke_original_widget $@ } @@ -47,7 +47,7 @@ _zsh_autosuggest_modify() { local orig_postdisplay="$POSTDISPLAY" # Clear suggestion while waiting for next one - unset POSTDISPLAY + POSTDISPLAY= # Original widget may modify the buffer _zsh_autosuggest_invoke_original_widget $@ @@ -102,7 +102,7 @@ _zsh_autosuggest_suggest() { if [[ -n "$suggestion" ]] && (( $#BUFFER )); then POSTDISPLAY="${suggestion#$BUFFER}" else - unset POSTDISPLAY + POSTDISPLAY= fi } @@ -128,7 +128,7 @@ _zsh_autosuggest_accept() { BUFFER="$BUFFER$POSTDISPLAY" # Remove the suggestion - unset POSTDISPLAY + POSTDISPLAY= # Run the original widget before manually moving the cursor so that the # cursor movement doesn't make the widget do something unexpected @@ -151,7 +151,7 @@ _zsh_autosuggest_execute() { BUFFER="$BUFFER$POSTDISPLAY" # Remove the suggestion - unset POSTDISPLAY + POSTDISPLAY= # Call the original `accept-line` to handle syntax highlighting or # other potential custom behavior diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 91247b4..10aff06 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -294,7 +294,7 @@ _zsh_autosuggest_toggle() { # Clear the suggestion _zsh_autosuggest_clear() { # Remove the suggestion - unset POSTDISPLAY + POSTDISPLAY= _zsh_autosuggest_invoke_original_widget $@ } @@ -311,7 +311,7 @@ _zsh_autosuggest_modify() { local orig_postdisplay="$POSTDISPLAY" # Clear suggestion while waiting for next one - unset POSTDISPLAY + POSTDISPLAY= # Original widget may modify the buffer _zsh_autosuggest_invoke_original_widget $@ @@ -366,7 +366,7 @@ _zsh_autosuggest_suggest() { if [[ -n "$suggestion" ]] && (( $#BUFFER )); then POSTDISPLAY="${suggestion#$BUFFER}" else - unset POSTDISPLAY + POSTDISPLAY= fi } @@ -392,7 +392,7 @@ _zsh_autosuggest_accept() { BUFFER="$BUFFER$POSTDISPLAY" # Remove the suggestion - unset POSTDISPLAY + POSTDISPLAY= # Run the original widget before manually moving the cursor so that the # cursor movement doesn't make the widget do something unexpected @@ -415,7 +415,7 @@ _zsh_autosuggest_execute() { BUFFER="$BUFFER$POSTDISPLAY" # Remove the suggestion - unset POSTDISPLAY + POSTDISPLAY= # Call the original `accept-line` to handle syntax highlighting or # other potential custom behavior From 9aceef9646995c478e40c57a81a1ddbbaf9741b9 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Fri, 15 Nov 2024 12:28:27 -0700 Subject: [PATCH 31/36] Remove circle ci reference left over from switch to github actions --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 3ee17f3..552417f 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,6 @@ It suggests commands as you type based on history and completions. Requirements: Zsh v4.3.11 or later -[![CircleCI](https://img.shields.io/circleci/build/github/zsh-users/zsh-autosuggestions.svg)](https://circleci.com/gh/zsh-users/zsh-autosuggestions) [![Chat on Gitter](https://img.shields.io/gitter/room/zsh-users/zsh-autosuggestions.svg)](https://gitter.im/zsh-users/zsh-autosuggestions) From a50468ef4bf8301231a9db0cb5b8b5896b95c9ac Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Fri, 15 Nov 2024 12:35:58 -0700 Subject: [PATCH 32/36] Update changelog for v0.7.1 release --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15d65a9..30c7735 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## v0.7.1 +- Clear POSTDISPLAY instead of unsetting (#634) +- Always reset async file descriptor after consuming it (#630) +- Always use builtin `exec` (#628) +- Add `history-beginning-search-*-end` widgets to clear widget list (#619) +- Switch CI from Circle CI to GitHub Actions + ## v0.7.0 - Enable asynchronous mode by default (#498) - No longer wrap user widgets starting with `autosuggest-` prefix (#496) From f8907cf32b1aefc6868c4f0d1fb77286d1a0f9b3 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Fri, 15 Nov 2024 12:36:08 -0700 Subject: [PATCH 33/36] v0.7.1 --- VERSION | 2 +- zsh-autosuggestions.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 8b20e48..63f2359 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v0.7.0 +v0.7.1 diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 10aff06..e780225 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -1,6 +1,6 @@ # Fish-like fast/unobtrusive autosuggestions for zsh. # https://github.com/zsh-users/zsh-autosuggestions -# v0.7.0 +# v0.7.1 # Copyright (c) 2013 Thiago de Arruda # Copyright (c) 2016-2021 Eric Freese # From f9526195c50ddf2cec64e0ce6310bc5a68d4c340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Tesa=C5=99?= <33880579+tesar-tech@users.noreply.github.com> Date: Mon, 25 Nov 2024 18:04:58 +0100 Subject: [PATCH 34/36] Fixes link for nixos package --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 7b32af1..725a8f8 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -15,7 +15,7 @@ | Fedora / CentOS / RHEL / Scientific Linux | [zsh-autosuggestions OBS repository](https://software.opensuse.org/download.html?project=shells%3Azsh-users%3Azsh-autosuggestions&package=zsh-autosuggestions) | | OpenSUSE / SLE | [zsh-autosuggestions OBS repository](https://software.opensuse.org/download.html?project=shells%3Azsh-users%3Azsh-autosuggestions&package=zsh-autosuggestions) | | Arch Linux / Manjaro / Antergos / Hyperbola | [zsh-autosuggestions](https://www.archlinux.org/packages/zsh-autosuggestions), [zsh-autosuggestions-git](https://aur.archlinux.org/packages/zsh-autosuggestions-git) | -| NixOS | [zsh-autosuggestions](https://github.com/NixOS/nixpkgs/blob/master/pkgs/shells/zsh/zsh-autosuggestions/default.nix) | +| NixOS | [zsh-autosuggestions](https://github.com/NixOS/nixpkgs/blob/master/pkgs/by-name/zs/zsh-autosuggestions/package.nix) | | Void Linux | [zsh-autosuggestions](https://github.com/void-linux/void-packages/blob/master/srcpkgs/zsh-autosuggestions/template) | | Mac OS | [homebrew](https://github.com/Homebrew/homebrew-core/blob/master/Formula/z/zsh-autosuggestions.rb) | | NetBSD | [pkgsrc](http://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/shells/zsh-autosuggestions/README.html) | From a00927c6732da1162dbe207782f1857472067758 Mon Sep 17 00:00:00 2001 From: Julius Enriquez Date: Sat, 7 Jun 2025 01:04:21 +0800 Subject: [PATCH 35/36] INSTALL.md: Add FreeBSD --- INSTALL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/INSTALL.md b/INSTALL.md index 725a8f8..8f4e184 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -19,6 +19,7 @@ | Void Linux | [zsh-autosuggestions](https://github.com/void-linux/void-packages/blob/master/srcpkgs/zsh-autosuggestions/template) | | Mac OS | [homebrew](https://github.com/Homebrew/homebrew-core/blob/master/Formula/z/zsh-autosuggestions.rb) | | NetBSD | [pkgsrc](http://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/shells/zsh-autosuggestions/README.html) | +| FreeBSD | [pkg](https://cgit.freebsd.org/ports/tree/shells/zsh-autosuggestions) | ## Antigen From da75fc226d80b732b482fbde1c21396d285ac3e3 Mon Sep 17 00:00:00 2001 From: ShoeBoom <15147944+ShoeBoom@users.noreply.github.com> Date: Sun, 22 Jun 2025 20:12:57 -0700 Subject: [PATCH 36/36] Update homebrew install link to point to homebrew website. the git file in the homebrew repo does not provide a clear path to install --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 725a8f8..fd5eb86 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -17,7 +17,7 @@ | Arch Linux / Manjaro / Antergos / Hyperbola | [zsh-autosuggestions](https://www.archlinux.org/packages/zsh-autosuggestions), [zsh-autosuggestions-git](https://aur.archlinux.org/packages/zsh-autosuggestions-git) | | NixOS | [zsh-autosuggestions](https://github.com/NixOS/nixpkgs/blob/master/pkgs/by-name/zs/zsh-autosuggestions/package.nix) | | Void Linux | [zsh-autosuggestions](https://github.com/void-linux/void-packages/blob/master/srcpkgs/zsh-autosuggestions/template) | -| Mac OS | [homebrew](https://github.com/Homebrew/homebrew-core/blob/master/Formula/z/zsh-autosuggestions.rb) | +| Mac OS | [homebrew](https://formulae.brew.sh/formula/zsh-autosuggestions) | | NetBSD | [pkgsrc](http://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/shells/zsh-autosuggestions/README.html) | ## Antigen