From 324aad0ac94b8b5e8bd06349f1bfac692255f610 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Tue, 2 Jul 2019 21:03:58 -0600 Subject: [PATCH 01/53] Add issue templates Configured through https://github.com/zsh-users/zsh-autosuggestions/issues/templates/edit --- .github/ISSUE_TEMPLATE/bug-report.md | 36 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 +++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000..7663df6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,36 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug +assignees: '' + +--- + +### Describe the bug + + +### To Reproduce +Steps to reproduce the behavior: + + + +```sh +% zsh -df +% source path/to/zsh-autosuggestions.zsh +% ... # what do you do to reproduce? +``` + +### Expected behavior + + +### Screenshots + + +### Desktop + - OS + distribution: + - Zsh version: + - Plugin version: + +### Additional context + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..5874625 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: enhancement +assignees: '' + +--- + +### Is your feature request related to a problem? Please describe. + + +### Describe the solution you'd like + + +### Describe alternatives you've considered + + +### Additional context + From 01dce8999f5b5e5d90763e8fe59bd40b93f5207a Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Tue, 2 Jul 2019 21:20:48 -0600 Subject: [PATCH 02/53] Add package links to install docs (#222) Copied from zsh-users/zsh-completions. Removed missing packages for Gentoo, Slackware, and MacPorts. --- INSTALL.md | 56 +++++++++++++++++------------------------------------- 1 file changed, 17 insertions(+), 39 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index d06db2b..9d2915e 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,26 +1,22 @@ # Installation -* [Manual](#manual-git-clone) +* [Packages](#packages) * [Antigen](#antigen) * [Oh My Zsh](#oh-my-zsh) -* [Arch Linux](#arch-linux) -* [macOS via Homebrew](#macos-via-homebrew) +* [Manual](#manual-git-clone) -## Manual (Git Clone) +## Packages -1. Clone this repository somewhere on your machine. This guide will assume `~/.zsh/zsh-autosuggestions`. - - ```sh - git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions - ``` - -2. Add the following to your `.zshrc`: - - ```sh - source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh - ``` - -3. Start a new terminal session. +| System | Package | +| ------------- | ------------- | +| 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) | +| 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) | +| NetBSD | [pkgsrc](http://ftp.netbsd.org/pub/pkgsrc/current/pkgsrc/shells/zsh-autosuggestions/README.html) | ## Antigen @@ -48,36 +44,18 @@ 3. Start a new terminal session. -## Arch Linux +## Manual (Git Clone) -1. Install [`zsh-autosuggestions`](https://www.archlinux.org/packages/community/any/zsh-autosuggestions/) from the `community` repository. +1. Clone this repository somewhere on your machine. This guide will assume `~/.zsh/zsh-autosuggestions`. ```sh - pacman -S zsh-autosuggestions - ``` - - or, to use a package based on the `master` branch, install [`zsh-autosuggestions-git`](https://aur.archlinux.org/packages/zsh-autosuggestions-git/) from the [AUR](https://wiki.archlinux.org/index.php/Arch_User_Repository). - -2. Add the following to your `.zshrc`: - - ```sh - source /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh - ``` - -3. Start a new terminal session. - -## macOS via Homebrew - -1. Install the `zsh-autosuggestions` package using [Homebrew](https://brew.sh/). - - ```sh - brew install zsh-autosuggestions + git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions ``` 2. Add the following to your `.zshrc`: ```sh - source /usr/local/share/zsh-autosuggestions/zsh-autosuggestions.zsh + source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh ``` 3. Start a new terminal session. From b87a4972c8be188af347fb3e29b8c47a923c4f75 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Sat, 29 Jun 2019 21:44:29 -0600 Subject: [PATCH 03/53] Allow configuring to ignore history entries matching a pattern Set ZSH_AUTOSUGGEST_HISTORY_IGNORE to a glob pattern to have the history and match_prev_cmd suggestion strategies never make suggestions matching that pattern. For example, set to "cd *" to never suggest any `cd` commands from history (see issues #340 and #425). Or set to "?(#c50,)" to never suggest anything 50 characters or longer (see issue #429). --- README.md | 6 ++++++ spec/strategies/history_spec.rb | 11 ++++++++++ spec/strategies/match_prev_cmd_spec.rb | 29 +++++++++++++++++++------- src/strategies/history.zsh | 13 +++++++++--- src/strategies/match_prev_cmd.zsh | 13 +++++++++--- zsh-autosuggestions.zsh | 26 +++++++++++++++++------ 6 files changed, 78 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index fad9bf5..2f4f973 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,12 @@ As of `v0.4.0`, suggestions can be fetched asynchronously. To enable this behavi Set `ZSH_AUTOSUGGEST_MANUAL_REBIND` (it can be set to anything) to disable automatic widget re-binding on each precmd. This can be a big boost to performance, but you'll need to handle re-binding yourself if any of the widget lists change or if you or another plugin wrap any of the autosuggest widgets. To re-bind widgets, run `_zsh_autosuggest_bind_widgets`. +### 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. + +**Note:** This only affects the `history` and `match_prev_cmd` suggestion strategies. + ### Key Bindings diff --git a/spec/strategies/history_spec.rb b/spec/strategies/history_spec.rb index f8ae526..eee8efd 100644 --- a/spec/strategies/history_spec.rb +++ b/spec/strategies/history_spec.rb @@ -8,5 +8,16 @@ describe 'the `history` suggestion strategy' do end end + context 'when ZSH_AUTOSUGGEST_HISTORY_IGNORE is set to a pattern' do + let(:options) { ['ZSH_AUTOSUGGEST_HISTORY_IGNORE="* bar"'] } + + it 'does not make suggestions that match the pattern' do + with_history('ls foo', 'ls bar', 'echo baz') do + session.send_string('ls') + wait_for { session.content }.to eq('ls foo') + end + end + end + include_examples 'special characters' end diff --git a/spec/strategies/match_prev_cmd_spec.rb b/spec/strategies/match_prev_cmd_spec.rb index 5a143b8..c435f16 100644 --- a/spec/strategies/match_prev_cmd_spec.rb +++ b/spec/strategies/match_prev_cmd_spec.rb @@ -3,19 +3,32 @@ require 'strategies/special_characters_helper' describe 'the `match_prev_cmd` strategy' do let(:options) { ['ZSH_AUTOSUGGEST_STRATEGY=match_prev_cmd'] } + let(:history) { [ + 'echo what', + 'ls foo', + 'echo what', + 'ls bar', + 'ls baz', + 'echo what' + ] } + it 'suggests the last matching history entry after the previous command' do - with_history( - 'echo what', - 'ls foo', - 'echo what', - 'ls bar', - 'ls baz', - 'echo what' - ) do + with_history(*history) do session.send_string('ls') wait_for { session.content }.to eq('ls bar') end end + context 'when ZSH_AUTOSUGGEST_HISTORY_IGNORE is set to a pattern' do + let(:options) { ['ZSH_AUTOSUGGEST_STRATEGY=match_prev_cmd', 'ZSH_AUTOSUGGEST_HISTORY_IGNORE="* bar"'] } + + it 'does not make suggestions that match the pattern' do + with_history(*history) do + session.send_string('ls') + wait_for { session.content }.to eq('ls foo') + end + end + end + include_examples 'special characters' end diff --git a/src/strategies/history.zsh b/src/strategies/history.zsh index a2755a5..0672a13 100644 --- a/src/strategies/history.zsh +++ b/src/strategies/history.zsh @@ -10,7 +10,7 @@ _zsh_autosuggest_strategy_history() { # Reset options to defaults and enable LOCAL_OPTIONS emulate -L zsh - # Enable globbing flags so that we can use (#m) + # Enable globbing flags so that we can use (#m) and (x~y) glob operator setopt EXTENDED_GLOB # Escape backslashes and all of the glob operators so we can use @@ -19,7 +19,14 @@ _zsh_autosuggest_strategy_history() { # TODO: Use (b) flag when we can drop support for zsh older than v5.0.8 local prefix="${1//(#m)[\\*?[\]<>()|^~#]/\\$MATCH}" - # Get the history items that match + # Get the history items that match the prefix, excluding those that match + # the ignore pattern + local pattern="$prefix*" + if [[ -n $ZSH_AUTOSUGGEST_HISTORY_IGNORE ]]; then + pattern="($pattern)~($ZSH_AUTOSUGGEST_HISTORY_IGNORE)" + fi + + # Give the first history item matching the pattern as the suggestion # - (r) subscript flag makes the pattern match on values - typeset -g suggestion="${history[(r)${prefix}*]}" + typeset -g suggestion="${history[(r)$pattern]}" } diff --git a/src/strategies/match_prev_cmd.zsh b/src/strategies/match_prev_cmd.zsh index f76d3c1..b709783 100644 --- a/src/strategies/match_prev_cmd.zsh +++ b/src/strategies/match_prev_cmd.zsh @@ -24,16 +24,23 @@ _zsh_autosuggest_strategy_match_prev_cmd() { # Reset options to defaults and enable LOCAL_OPTIONS emulate -L zsh - # Enable globbing flags so that we can use (#m) + # Enable globbing flags so that we can use (#m) and (x~y) glob operator setopt EXTENDED_GLOB # TODO: Use (b) flag when we can drop support for zsh older than v5.0.8 local prefix="${1//(#m)[\\*?[\]<>()|^~#]/\\$MATCH}" + # Get the history items that match the prefix, excluding those that match + # the ignore pattern + local pattern="$prefix*" + if [[ -n $ZSH_AUTOSUGGEST_HISTORY_IGNORE ]]; then + pattern="($pattern)~($ZSH_AUTOSUGGEST_HISTORY_IGNORE)" + fi + # Get all history event numbers that correspond to history - # entries that match pattern $prefix* + # entries that match the pattern local history_match_keys - history_match_keys=(${(k)history[(R)$prefix*]}) + history_match_keys=(${(k)history[(R)$~pattern]}) # By default we use the first history number (most recent history entry) local histkey="${history_match_keys[1]}" diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 872b647..950cf5b 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -626,7 +626,7 @@ _zsh_autosuggest_strategy_history() { # Reset options to defaults and enable LOCAL_OPTIONS emulate -L zsh - # Enable globbing flags so that we can use (#m) + # Enable globbing flags so that we can use (#m) and (x~y) glob operator setopt EXTENDED_GLOB # Escape backslashes and all of the glob operators so we can use @@ -635,9 +635,16 @@ _zsh_autosuggest_strategy_history() { # TODO: Use (b) flag when we can drop support for zsh older than v5.0.8 local prefix="${1//(#m)[\\*?[\]<>()|^~#]/\\$MATCH}" - # Get the history items that match + # Get the history items that match the prefix, excluding those that match + # the ignore pattern + local pattern="$prefix*" + if [[ -n $ZSH_AUTOSUGGEST_HISTORY_IGNORE ]]; then + pattern="($pattern)~($ZSH_AUTOSUGGEST_HISTORY_IGNORE)" + fi + + # Give the first history item matching the pattern as the suggestion # - (r) subscript flag makes the pattern match on values - typeset -g suggestion="${history[(r)${prefix}*]}" + typeset -g suggestion="${history[(r)$pattern]}" } #--------------------------------------------------------------------# @@ -665,16 +672,23 @@ _zsh_autosuggest_strategy_match_prev_cmd() { # Reset options to defaults and enable LOCAL_OPTIONS emulate -L zsh - # Enable globbing flags so that we can use (#m) + # Enable globbing flags so that we can use (#m) and (x~y) glob operator setopt EXTENDED_GLOB # TODO: Use (b) flag when we can drop support for zsh older than v5.0.8 local prefix="${1//(#m)[\\*?[\]<>()|^~#]/\\$MATCH}" + # Get the history items that match the prefix, excluding those that match + # the ignore pattern + local pattern="$prefix*" + if [[ -n $ZSH_AUTOSUGGEST_HISTORY_IGNORE ]]; then + pattern="($pattern)~($ZSH_AUTOSUGGEST_HISTORY_IGNORE)" + fi + # Get all history event numbers that correspond to history - # entries that match pattern $prefix* + # entries that match the pattern local history_match_keys - history_match_keys=(${(k)history[(R)$prefix*]}) + history_match_keys=(${(k)history[(R)$~pattern]}) # By default we use the first history number (most recent history entry) local histkey="${history_match_keys[1]}" From fdc4292a7feaaf499527feee21d7a59028ceafbd Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Mon, 15 Jul 2019 11:18:31 -0600 Subject: [PATCH 04/53] Switch to shields badges --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fad9bf5..4fffe8b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ It suggests commands as you type based on history and completions. Requirements: Zsh v4.3.11 or later -[![CircleCI](https://circleci.com/gh/zsh-users/zsh-autosuggestions.svg?style=svg)](https://circleci.com/gh/zsh-users/zsh-autosuggestions) +[![CircleCI](https://img.shields.io/circleci/build/github/zsh-users/zsh-autosuggestions.svg)](https://circleci.com/gh/zsh-users/zsh-autosuggestions) From 43f3bc4010b2c697d2252fdd8b36a577ea125881 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Mon, 15 Jul 2019 11:36:07 -0600 Subject: [PATCH 05/53] Add gitter badge (#461) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4fffe8b..5dacd85 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ 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 eab0e9b574c205f6a9f43d009a076cfd5fe77c90 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Thu, 26 Sep 2019 09:58:36 -0600 Subject: [PATCH 06/53] Fix circle ci build issues We are getting errors on circle ci builds (e.g. see [1]): ``` CircleCI was unable to run the job runner because we were unable to execute commands in build container. This typically means that the build container entrypoint or command is terminating the container prematurely, or interfering with executed commands. Consider clearing entrypoint/command values and try again. ``` Folks in this thread [2] suggest removing the `command: /sbin/init` line initially added by the v1 => v2 migration script. --- 1: https://circleci.com/gh/zsh-users/zsh-autosuggestions/381 2: https://discuss.circleci.com/t/circleci-was-unable-to-run-the-job-runner/31894/18 --- .circleci/config.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8de098f..d95fa98 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,7 +5,6 @@ jobs: shell: /bin/bash --login docker: - image: ericfreese/zsh-autosuggestions-test:latest - command: /sbin/init steps: - checkout - run: From 4016ff795bb184461996c5539327befc8da2af6f Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Thu, 26 Sep 2019 09:58:36 -0600 Subject: [PATCH 07/53] Fix circle ci build issues We are getting errors on circle ci builds (e.g. see [1]): ``` CircleCI was unable to run the job runner because we were unable to execute commands in build container. This typically means that the build container entrypoint or command is terminating the container prematurely, or interfering with executed commands. Consider clearing entrypoint/command values and try again. ``` Folks in this thread [2] suggest removing the `command: /sbin/init` line initially added by the v1 => v2 migration script. --- 1: https://circleci.com/gh/zsh-users/zsh-autosuggestions/381 2: https://discuss.circleci.com/t/circleci-was-unable-to-run-the-job-runner/31894/18 --- .circleci/config.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 8de098f..d95fa98 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,7 +5,6 @@ jobs: shell: /bin/bash --login docker: - image: ericfreese/zsh-autosuggestions-test:latest - command: /sbin/init steps: - checkout - run: From 0f0f221180b1fec3254e74d8d657c3a929870b1b Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Wed, 25 Sep 2019 15:36:07 -0600 Subject: [PATCH 08/53] cleanup: Split on null bytes instead of pattern matching Follow-up to technique tried in commit d94475c after I learned about the `@` flag to keep empty strings in the array. --- src/strategies/completion.zsh | 2 +- zsh-autosuggestions.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strategies/completion.zsh b/src/strategies/completion.zsh index dfbf6eb..646f106 100644 --- a/src/strategies/completion.zsh +++ b/src/strategies/completion.zsh @@ -122,7 +122,7 @@ _zsh_autosuggest_strategy_completion() { # versions of zsh (older than 5.3), we sometimes get extra bytes after # the second null byte, so trim those off the end. # See http://www.zsh.org/mla/workers/2015/msg03290.html - suggestion="${${line#*$'\0'}%$'\0'*}" + suggestion="${${(@0)line}[2]}" } always { # Destroy the pty zpty -d $ZSH_AUTOSUGGEST_COMPLETIONS_PTY_NAME diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 950cf5b..66eae6f 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -608,7 +608,7 @@ _zsh_autosuggest_strategy_completion() { # versions of zsh (older than 5.3), we sometimes get extra bytes after # the second null byte, so trim those off the end. # See http://www.zsh.org/mla/workers/2015/msg03290.html - suggestion="${${line#*$'\0'}%$'\0'*}" + suggestion="${${(@0)line}[2]}" } always { # Destroy the pty zpty -d $ZSH_AUTOSUGGEST_COMPLETIONS_PTY_NAME From c6b636ea4ff7ab38ad41eb55c283f745cd18caf9 Mon Sep 17 00:00:00 2001 From: Greg Rickaby Date: Thu, 10 Oct 2019 09:15:15 -0500 Subject: [PATCH 09/53] (README) Link to 256 color chart Easy to see and choose a color, and then copy it over from the chart. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5dacd85..1301f1b 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ You may want to override the default global config variables. Default values of ### Suggestion Highlight Style -Set `ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE` to configure the style that the suggestion is shown with. The default is `fg=8`, which will set the foreground color to color 8 from the 256-color palette. If your terminal only supports 8 colors, you will need to use a number between 0 and 7. +Set `ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE` to configure the style that the suggestion is shown with. The default is `fg=8`, which will set the foreground color to color 8 from the [256-color palette](https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg). If your terminal only supports 8 colors, you will need to use a number between 0 and 7. Background color can also be set, and the suggestion can be styled bold, underlined, or standout. For example, this would show suggestions with bold, underlined, pink text on a cyan background: From ef657cb38cc197171c39caf2a93984176092f1ba Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Sun, 15 Dec 2019 07:01:12 -0700 Subject: [PATCH 10/53] cleanup: Combine two arithmetic conditionals --- src/widgets.zsh | 2 +- zsh-autosuggestions.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widgets.zsh b/src/widgets.zsh index 242d502..9d92816 100644 --- a/src/widgets.zsh +++ b/src/widgets.zsh @@ -56,7 +56,7 @@ _zsh_autosuggest_modify() { emulate -L zsh # Don't fetch a new suggestion if there's more input to be read immediately - if (( $PENDING > 0 )) || (( $KEYS_QUEUED_COUNT > 0 )); then + if (( $PENDING > 0 || $KEYS_QUEUED_COUNT > 0 )); then POSTDISPLAY="$orig_postdisplay" return $retval fi diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 950cf5b..84be34a 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -318,7 +318,7 @@ _zsh_autosuggest_modify() { emulate -L zsh # Don't fetch a new suggestion if there's more input to be read immediately - if (( $PENDING > 0 )) || (( $KEYS_QUEUED_COUNT > 0 )); then + if (( $PENDING > 0 || $KEYS_QUEUED_COUNT > 0 )); then POSTDISPLAY="$orig_postdisplay" return $retval fi From 5217ed52697157f5ccc961d9b6b1c7967abc418b Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Sun, 15 Dec 2019 06:49:50 -0700 Subject: [PATCH 11/53] cleanup: Switch to arithmetic comparison --- src/widgets.zsh | 2 +- zsh-autosuggestions.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/widgets.zsh b/src/widgets.zsh index 9d92816..164c751 100644 --- a/src/widgets.zsh +++ b/src/widgets.zsh @@ -128,7 +128,7 @@ _zsh_autosuggest_accept() { fi # Only accept if the cursor is at the end of the buffer - if [[ $CURSOR = $max_cursor_pos ]]; then + if (( $CURSOR == $max_cursor_pos )); then # Add the suggestion to the buffer BUFFER="$BUFFER$POSTDISPLAY" diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 84be34a..ffd5533 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -390,7 +390,7 @@ _zsh_autosuggest_accept() { fi # Only accept if the cursor is at the end of the buffer - if [[ $CURSOR = $max_cursor_pos ]]; then + if (( $CURSOR == $max_cursor_pos )); then # Add the suggestion to the buffer BUFFER="$BUFFER$POSTDISPLAY" From 54d7a9a84c88e12f28dd7e441b662088fa25b911 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Sun, 15 Dec 2019 06:55:14 -0700 Subject: [PATCH 12/53] cleanup: Switch to guard clause in accept widget handler --- src/widgets.zsh | 25 ++++++++++++++----------- zsh-autosuggestions.zsh | 25 ++++++++++++++----------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/widgets.zsh b/src/widgets.zsh index 164c751..c6f1137 100644 --- a/src/widgets.zsh +++ b/src/widgets.zsh @@ -127,20 +127,23 @@ _zsh_autosuggest_accept() { max_cursor_pos=$((max_cursor_pos - 1)) fi + if (( $CURSOR != $max_cursor_pos )); then + _zsh_autosuggest_invoke_original_widget $@ + return + fi + # Only accept if the cursor is at the end of the buffer - if (( $CURSOR == $max_cursor_pos )); then - # Add the suggestion to the buffer - BUFFER="$BUFFER$POSTDISPLAY" + # Add the suggestion to the buffer + BUFFER="$BUFFER$POSTDISPLAY" - # Remove the suggestion - unset POSTDISPLAY + # Remove the suggestion + unset POSTDISPLAY - # Move the cursor to the end of the buffer - if [[ "$KEYMAP" = "vicmd" ]]; then - CURSOR=$(($#BUFFER - 1)) - else - CURSOR=$#BUFFER - fi + # Move the cursor to the end of the buffer + if [[ "$KEYMAP" = "vicmd" ]]; then + CURSOR=$(($#BUFFER - 1)) + else + CURSOR=$#BUFFER fi _zsh_autosuggest_invoke_original_widget $@ diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index ffd5533..899dcf3 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -389,20 +389,23 @@ _zsh_autosuggest_accept() { max_cursor_pos=$((max_cursor_pos - 1)) fi + if (( $CURSOR != $max_cursor_pos )); then + _zsh_autosuggest_invoke_original_widget $@ + return + fi + # Only accept if the cursor is at the end of the buffer - if (( $CURSOR == $max_cursor_pos )); then - # Add the suggestion to the buffer - BUFFER="$BUFFER$POSTDISPLAY" + # Add the suggestion to the buffer + BUFFER="$BUFFER$POSTDISPLAY" - # Remove the suggestion - unset POSTDISPLAY + # Remove the suggestion + unset POSTDISPLAY - # Move the cursor to the end of the buffer - if [[ "$KEYMAP" = "vicmd" ]]; then - CURSOR=$(($#BUFFER - 1)) - else - CURSOR=$#BUFFER - fi + # Move the cursor to the end of the buffer + if [[ "$KEYMAP" = "vicmd" ]]; then + CURSOR=$(($#BUFFER - 1)) + else + CURSOR=$#BUFFER fi _zsh_autosuggest_invoke_original_widget $@ From 7afb7364f1ba5cb87eb616516c9a7fa4b86539b6 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Sun, 15 Dec 2019 08:07:59 -0700 Subject: [PATCH 13/53] Allow skipping completion suggestions when buffer matches a pattern Set ZSH_AUTOSUGGEST_COMPLETION_IGNORE to a glob pattern to have the completion suggestion strategy never make suggestions when the buffer matches the pattern. This can be helpful when some completion routines you have are particularly expensive and you want to prevent them from running automatically on every keystroke. See GitHub issue #463. --- README.md | 6 ++++++ spec/strategies/completion_spec.rb | 19 ++++++++++++++++++- src/strategies/completion.zsh | 9 +++++++++ zsh-autosuggestions.zsh | 9 +++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b10b4c3..dd567b3 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,12 @@ Set `ZSH_AUTOSUGGEST_HISTORY_IGNORE` to a glob pattern to prevent offering sugge **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. + +**Note:** This only affects the `completion` suggestion strategy. + ### Key Bindings diff --git a/spec/strategies/completion_spec.rb b/spec/strategies/completion_spec.rb index 2be358a..92794d6 100644 --- a/spec/strategies/completion_spec.rb +++ b/spec/strategies/completion_spec.rb @@ -5,7 +5,9 @@ describe 'the `completion` suggestion strategy' do session. run_command('autoload compinit && compinit'). run_command('_foo() { compadd bar; compadd bat }'). - run_command('compdef _foo baz') + run_command('_num() { compadd two; compadd three }'). + run_command('compdef _foo baz'). + run_command('compdef _num one') end end @@ -37,6 +39,21 @@ describe 'the `completion` suggestion strategy' do end end + context 'when ZSH_AUTOSUGGEST_COMPLETION_IGNORE is set to a pattern' do + let(:options) { ['ZSH_AUTOSUGGEST_STRATEGY=completion', 'ZSH_AUTOSUGGEST_COMPLETION_IGNORE="one *"'] } + + it 'makes suggestions when the buffer does not match the pattern' do + session.send_string('baz ') + wait_for { session.content }.to eq('baz bar') + end + + it 'does not make suggestions when the buffer matches the pattern' do + session.send_string('one t') + sleep 1 + expect(session.content).to eq('one t') + end + end + context 'when async mode is enabled' do let(:options) { ['ZSH_AUTOSUGGEST_USE_ASYNC=true', 'ZSH_AUTOSUGGEST_STRATEGY=completion'] } diff --git a/src/strategies/completion.zsh b/src/strategies/completion.zsh index dfbf6eb..b3d52cc 100644 --- a/src/strategies/completion.zsh +++ b/src/strategies/completion.zsh @@ -96,6 +96,12 @@ _zsh_autosuggest_capture_completion_async() { } _zsh_autosuggest_strategy_completion() { + # Reset options to defaults and enable LOCAL_OPTIONS + emulate -L zsh + + # Enable extended glob for completion ignore pattern + setopt EXTENDED_GLOB + typeset -g suggestion local line REPLY @@ -105,6 +111,9 @@ _zsh_autosuggest_strategy_completion() { # Exit if we don't have zpty zmodload zsh/zpty 2>/dev/null || return + # Exit if our search string matches the ignore pattern + [[ -n "$ZSH_AUTOSUGGEST_COMPLETION_IGNORE" ]] && [[ "$1" == $~ZSH_AUTOSUGGEST_COMPLETION_IGNORE ]] && return + # Zle will be inactive if we are in async mode if zle; then zpty $ZSH_AUTOSUGGEST_COMPLETIONS_PTY_NAME _zsh_autosuggest_capture_completion_sync diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 950cf5b..65991d6 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -582,6 +582,12 @@ _zsh_autosuggest_capture_completion_async() { } _zsh_autosuggest_strategy_completion() { + # Reset options to defaults and enable LOCAL_OPTIONS + emulate -L zsh + + # Enable extended glob for completion ignore pattern + setopt EXTENDED_GLOB + typeset -g suggestion local line REPLY @@ -591,6 +597,9 @@ _zsh_autosuggest_strategy_completion() { # Exit if we don't have zpty zmodload zsh/zpty 2>/dev/null || return + # Exit if our search string matches the ignore pattern + [[ -n "$ZSH_AUTOSUGGEST_COMPLETION_IGNORE" ]] && [[ "$1" == $~ZSH_AUTOSUGGEST_COMPLETION_IGNORE ]] && return + # Zle will be inactive if we are in async mode if zle; then zpty $ZSH_AUTOSUGGEST_COMPLETIONS_PTY_NAME _zsh_autosuggest_capture_completion_sync From 6ec95379fa32e4d55360738616ae78240587dcc2 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Sun, 15 Dec 2019 06:56:10 -0700 Subject: [PATCH 14/53] Call original widget before moving cursor when accepting suggestion The check on length of `$POSTDISPLAY` is in support of the test for `vi-delete` on the last char of the buffer with `dl`. Fixes issue #482. --- src/widgets.zsh | 13 ++++++++++--- zsh-autosuggestions.zsh | 13 ++++++++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/widgets.zsh b/src/widgets.zsh index c6f1137..8f09792 100644 --- a/src/widgets.zsh +++ b/src/widgets.zsh @@ -119,7 +119,7 @@ _zsh_autosuggest_suggest() { # Accept the entire suggestion _zsh_autosuggest_accept() { - local -i max_cursor_pos=$#BUFFER + local -i retval max_cursor_pos=$#BUFFER # When vicmd keymap is active, the cursor can't move all the way # to the end of the buffer @@ -127,7 +127,9 @@ _zsh_autosuggest_accept() { max_cursor_pos=$((max_cursor_pos - 1)) fi - if (( $CURSOR != $max_cursor_pos )); then + # If we're not in a valid state to accept a suggestion, just run the + # original widget and bail out + if (( $CURSOR != $max_cursor_pos || !$#POSTDISPLAY )); then _zsh_autosuggest_invoke_original_widget $@ return fi @@ -139,6 +141,11 @@ _zsh_autosuggest_accept() { # Remove the suggestion unset POSTDISPLAY + # Run the original widget before manually moving the cursor so that the + # cursor movement doesn't make the widget do something unexpected + _zsh_autosuggest_invoke_original_widget $@ + retval=$? + # Move the cursor to the end of the buffer if [[ "$KEYMAP" = "vicmd" ]]; then CURSOR=$(($#BUFFER - 1)) @@ -146,7 +153,7 @@ _zsh_autosuggest_accept() { CURSOR=$#BUFFER fi - _zsh_autosuggest_invoke_original_widget $@ + return $retval } # Accept the entire suggestion and execute it diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 899dcf3..0e1549a 100644 --- a/zsh-autosuggestions.zsh +++ b/zsh-autosuggestions.zsh @@ -381,7 +381,7 @@ _zsh_autosuggest_suggest() { # Accept the entire suggestion _zsh_autosuggest_accept() { - local -i max_cursor_pos=$#BUFFER + local -i retval max_cursor_pos=$#BUFFER # When vicmd keymap is active, the cursor can't move all the way # to the end of the buffer @@ -389,7 +389,9 @@ _zsh_autosuggest_accept() { max_cursor_pos=$((max_cursor_pos - 1)) fi - if (( $CURSOR != $max_cursor_pos )); then + # If we're not in a valid state to accept a suggestion, just run the + # original widget and bail out + if (( $CURSOR != $max_cursor_pos || !$#POSTDISPLAY )); then _zsh_autosuggest_invoke_original_widget $@ return fi @@ -401,6 +403,11 @@ _zsh_autosuggest_accept() { # Remove the suggestion unset POSTDISPLAY + # Run the original widget before manually moving the cursor so that the + # cursor movement doesn't make the widget do something unexpected + _zsh_autosuggest_invoke_original_widget $@ + retval=$? + # Move the cursor to the end of the buffer if [[ "$KEYMAP" = "vicmd" ]]; then CURSOR=$(($#BUFFER - 1)) @@ -408,7 +415,7 @@ _zsh_autosuggest_accept() { CURSOR=$#BUFFER fi - _zsh_autosuggest_invoke_original_widget $@ + return $retval } # Accept the entire suggestion and execute it From 03f59df502557e1b259005382b6e6813fc16ed9c Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Mon, 6 Jan 2020 21:02:48 -0700 Subject: [PATCH 15/53] Update changelog for v0.6.4 release --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37bf991..fc2a1fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 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) +- New configuration option to ignore history entries matching a pattern (#456) + ## v0.6.3 - Fixed bug moving cursor to end of buffer after accepting suggestion (#453) From a5affac6f1a4dfd0e1b86e9f6d628191aacf5360 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Mon, 6 Jan 2020 21:06:06 -0700 Subject: [PATCH 16/53] v0.6.4 --- VERSION | 2 +- zsh-autosuggestions.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index e4c57af..2fc7b36 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v0.6.3 +v0.6.4 diff --git a/zsh-autosuggestions.zsh b/zsh-autosuggestions.zsh index 81a9c62..a8ef6c4 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.3 +# v0.6.4 # Copyright (c) 2013 Thiago de Arruda # Copyright (c) 2016-2019 Eric Freese # From ff298e57c0050023ea0020d1ba16f2cd0fa45df1 Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Mon, 6 Jan 2020 21:11:31 -0700 Subject: [PATCH 17/53] `completion` suggestion strategy seems pretty stable --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dd567b3..f1cc715 100644 --- a/README.md +++ b/README.md @@ -53,8 +53,8 @@ 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) - `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`. -- `completion`: (experimental) Chooses a suggestion based on what tab-completion would suggest. (requires `zpty` module) 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 f90d040784fa67d7bc5e9aca5bdd6517db0bc40e Mon Sep 17 00:00:00 2001 From: Eric Freese Date: Sat, 25 Jan 2020 07:44:44 -0700 Subject: [PATCH 18/53] 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 19/53] 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 20/53] 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 21/53] 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 22/53] 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 23/53] 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 24/53] 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 25/53] 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 26/53] 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 27/53] 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 28/53] 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 29/53] 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 30/53] 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 31/53] 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 32/53] 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 33/53] 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 34/53] 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 35/53] 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 36/53] 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 37/53] 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 38/53] 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 39/53] 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 40/53] 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 41/53] 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 42/53] 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 43/53] 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 44/53] 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 45/53] 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 46/53] 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 47/53] 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 48/53] 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 49/53] 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 50/53] 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 51/53] 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 52/53] 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 53/53] 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