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/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/README.md b/README.md index 94e0b58..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 -[![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) @@ -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= } #--------------------------------------------------------------------#