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/.gitignore b/.gitignore
new file mode 100644
index 0000000..d8decde
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+# zsh word code files
+*.zwc
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)
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/INSTALL.md b/INSTALL.md
index 196524f..7f0a395 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -3,20 +3,23 @@
* [Packages](#packages)
* [Antigen](#antigen)
* [Oh My Zsh](#oh-my-zsh)
+* [HomeBrew](#homebrew)
* [Manual](#manual-git-clone)
## Packages
| 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) |
| 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/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) |
+| FreeBSD | [pkg](https://cgit.freebsd.org/ports/tree/shells/zsh-autosuggestions) |
## Antigen
@@ -47,6 +50,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`.
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 \
diff --git a/README.md b/README.md
index 3cfd2e8..a8c1b6c 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
-[](https://circleci.com/gh/zsh-users/zsh-autosuggestions)
[](https://gitter.im/zsh-users/zsh-autosuggestions)
@@ -53,7 +52,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.
@@ -170,18 +169,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/VERSION b/VERSION
index 8b20e48..63f2359 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-v0.7.0
+v0.7.1
diff --git a/ZSH_VERSIONS b/ZSH_VERSIONS
index 18ed7a6..23006db 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
@@ -14,4 +10,5 @@
5.5.1
5.6.2
5.7.1
-5.8
+5.8.1
+5.9
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
diff --git a/src/async.zsh b/src/async.zsh
index 218eb26..e179734 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,9 +68,10 @@ _zsh_autosuggest_async_response() {
zle autosuggest-suggest -- "$suggestion"
# Close the fd
- exec {1}<&-
+ builtin exec {1}<&-
fi
# Always remove the handler
zle -F "$1"
+ _ZSH_AUTOSUGGEST_ASYNC_FD=
}
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/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 b19cac7..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
#
@@ -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
@@ -292,7 +294,7 @@ _zsh_autosuggest_toggle() {
# Clear the suggestion
_zsh_autosuggest_clear() {
# Remove the suggestion
- unset POSTDISPLAY
+ POSTDISPLAY=
_zsh_autosuggest_invoke_original_widget $@
}
@@ -309,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 $@
@@ -364,7 +366,7 @@ _zsh_autosuggest_suggest() {
if [[ -n "$suggestion" ]] && (( $#BUFFER )); then
POSTDISPLAY="${suggestion#$BUFFER}"
else
- unset POSTDISPLAY
+ POSTDISPLAY=
fi
}
@@ -390,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
@@ -413,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
@@ -766,7 +768,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 +789,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,11 +825,12 @@ _zsh_autosuggest_async_response() {
zle autosuggest-suggest -- "$suggestion"
# Close the fd
- exec {1}<&-
+ builtin exec {1}<&-
fi
# Always remove the handler
zle -F "$1"
+ _ZSH_AUTOSUGGEST_ASYNC_FD=
}
#--------------------------------------------------------------------#