diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..d95fa98 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,15 @@ +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 deleted file mode 100644 index ec7bc75..0000000 --- a/.github/workflows/integration.yml +++ /dev/null @@ -1,51 +0,0 @@ -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 deleted file mode 100644 index d8decde..0000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# zsh word code files -*.zwc diff --git a/CHANGELOG.md b/CHANGELOG.md index 30c7735..15d65a9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,5 @@ # 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 f5dd3c4..0d51407 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,5 @@ 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 @@ -14,8 +11,10 @@ RUN apk add --no-cache tmux WORKDIR /zsh-autosuggestions -ADD install_test_zsh.sh ./ +ADD ZSH_VERSIONS /zsh-autosuggestions/ZSH_VERSIONS +ADD install_test_zsh.sh /zsh-autosuggestions/install_test_zsh.sh RUN ./install_test_zsh.sh -ADD Gemfile Gemfile.lock ./ +ADD Gemfile /zsh-autosuggestions/Gemfile +ADD Gemfile.lock /zsh-autosuggestions/Gemfile.lock RUN bundle install diff --git a/INSTALL.md b/INSTALL.md index 7f0a395..196524f 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -3,23 +3,20 @@ * [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/by-name/zs/zsh-autosuggestions/package.nix) | +| 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://formulae.brew.sh/formula/zsh-autosuggestions) | +| 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) | -| FreeBSD | [pkg](https://cgit.freebsd.org/ports/tree/shells/zsh-autosuggestions) | ## Antigen @@ -50,21 +47,6 @@ 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 6f5431e..f6d13a7 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 a8c1b6c..3cfd2e8 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,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) @@ -52,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, which is included with zsh since 4.0.1) +- `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`. 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. @@ -169,16 +170,18 @@ 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`). -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: +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: ```sh -docker build --build-arg TEST_ZSH_VERSION= -t zsh-autosuggestions-test . +docker pull ericfreese/zsh-autosuggestions-test ``` -After building the image, run the tests via: +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): ```sh -docker run -it -v $PWD:/zsh-autosuggestions zsh-autosuggestions-test make test +docker run -it -e TEST_ZSH_BIN=zsh- -v $PWD:/zsh-autosuggestions zsh-autosuggestions-test make test ``` diff --git a/VERSION b/VERSION index 63f2359..8b20e48 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -v0.7.1 +v0.7.0 diff --git a/ZSH_VERSIONS b/ZSH_VERSIONS index 23006db..18ed7a6 100644 --- a/ZSH_VERSIONS +++ b/ZSH_VERSIONS @@ -1,5 +1,9 @@ # 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 @@ -10,5 +14,4 @@ 5.5.1 5.6.2 5.7.1 -5.8.1 -5.9 +5.8 diff --git a/install_test_zsh.sh b/install_test_zsh.sh index 6cac9f5..40dc4c5 100755 --- a/install_test_zsh.sh +++ b/install_test_zsh.sh @@ -2,22 +2,25 @@ set -ex -mkdir zsh-build -cd zsh-build +for v in $(grep "^[^#]" ZSH_VERSIONS); do + mkdir zsh-$v + cd zsh-$v -curl -L https://api.github.com/repos/zsh-users/zsh/tarball/zsh-$TEST_ZSH_VERSION | tar xz --strip=1 + curl -L https://api.github.com/repos/zsh-users/zsh/tarball/zsh-$v | tar xz --strip=1 -./Util/preconfig -./configure --enable-pcre \ - --enable-cap \ - --enable-multibyte \ - --with-term-lib='ncursesw tinfo' \ - --with-tcsetpgrp + ./Util/preconfig + ./configure --enable-pcre \ + --enable-cap \ + --enable-multibyte \ + --with-term-lib='ncursesw tinfo' \ + --with-tcsetpgrp \ + --program-suffix="-$v" -make install.bin -make install.modules -make install.fns + make install.bin + make install.modules + make install.fns -cd .. + cd .. -rm -rf zsh-build + rm -rf zsh-$v +done diff --git a/src/async.zsh b/src/async.zsh index e179734..218eb26 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 - builtin exec {_ZSH_AUTOSUGGEST_ASYNC_FD}<&- + 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 - builtin exec {_ZSH_AUTOSUGGEST_ASYNC_FD}< <( + exec {_ZSH_AUTOSUGGEST_ASYNC_FD}< <( # Tell parent process our pid echo $sysparams[pid] @@ -68,10 +68,9 @@ _zsh_autosuggest_async_response() { zle autosuggest-suggest -- "$suggestion" # Close the fd - builtin exec {1}<&- + 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 32d32b2..5a0ebd8 100644 --- a/src/config.zsh +++ b/src/config.zsh @@ -28,8 +28,6 @@ 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 7562897..bd61666 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 - POSTDISPLAY= + unset POSTDISPLAY _zsh_autosuggest_invoke_original_widget $@ } @@ -47,7 +47,7 @@ _zsh_autosuggest_modify() { local orig_postdisplay="$POSTDISPLAY" # Clear suggestion while waiting for next one - POSTDISPLAY= + unset 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 - POSTDISPLAY= + unset POSTDISPLAY fi } @@ -128,7 +128,7 @@ _zsh_autosuggest_accept() { BUFFER="$BUFFER$POSTDISPLAY" # Remove the suggestion - POSTDISPLAY= + unset 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 - POSTDISPLAY= + unset 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 e780225..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.7.1 +# v0.7.0 # Copyright (c) 2013 Thiago de Arruda # Copyright (c) 2016-2021 Eric Freese # @@ -54,8 +54,6 @@ 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 @@ -294,7 +292,7 @@ _zsh_autosuggest_toggle() { # Clear the suggestion _zsh_autosuggest_clear() { # Remove the suggestion - POSTDISPLAY= + unset POSTDISPLAY _zsh_autosuggest_invoke_original_widget $@ } @@ -311,7 +309,7 @@ _zsh_autosuggest_modify() { local orig_postdisplay="$POSTDISPLAY" # Clear suggestion while waiting for next one - POSTDISPLAY= + unset POSTDISPLAY # Original widget may modify the buffer _zsh_autosuggest_invoke_original_widget $@ @@ -366,7 +364,7 @@ _zsh_autosuggest_suggest() { if [[ -n "$suggestion" ]] && (( $#BUFFER )); then POSTDISPLAY="${suggestion#$BUFFER}" else - POSTDISPLAY= + unset POSTDISPLAY fi } @@ -392,7 +390,7 @@ _zsh_autosuggest_accept() { BUFFER="$BUFFER$POSTDISPLAY" # Remove the suggestion - POSTDISPLAY= + unset 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 +413,7 @@ _zsh_autosuggest_execute() { BUFFER="$BUFFER$POSTDISPLAY" # Remove the suggestion - POSTDISPLAY= + unset POSTDISPLAY # Call the original `accept-line` to handle syntax highlighting or # other potential custom behavior @@ -768,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 - builtin exec {_ZSH_AUTOSUGGEST_ASYNC_FD}<&- + 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 @@ -789,7 +787,7 @@ _zsh_autosuggest_async_request() { fi # Fork a process to fetch a suggestion and open a pipe to read from it - builtin exec {_ZSH_AUTOSUGGEST_ASYNC_FD}< <( + exec {_ZSH_AUTOSUGGEST_ASYNC_FD}< <( # Tell parent process our pid echo $sysparams[pid] @@ -825,12 +823,11 @@ _zsh_autosuggest_async_response() { zle autosuggest-suggest -- "$suggestion" # Close the fd - builtin exec {1}<&- + exec {1}<&- fi # Always remove the handler zle -F "$1" - _ZSH_AUTOSUGGEST_ASYNC_FD= } #--------------------------------------------------------------------#