Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package fzf for openSUSE:Factory checked in at 2023-05-27 00:51:10 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/fzf (Old) and /work/SRC/openSUSE:Factory/.fzf.new.1533 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "fzf" Sat May 27 00:51:10 2023 rev:34 rq:1089242 version:0.41.0 Changes: -------- --- /work/SRC/openSUSE:Factory/fzf/fzf.changes 2023-05-01 18:51:20.661413319 +0200 +++ /work/SRC/openSUSE:Factory/.fzf.new.1533/fzf.changes 2023-05-27 00:51:15.298920470 +0200 @@ -1,0 +2,11 @@ +Fri May 26 18:38:52 UTC 2023 - Avindra Goolcharan <avin...@opensuse.org> + +- Update to version 0.41.0: + * Added color name preview-border and preview-scrollbar + * Added new border style block which uses block elements + * --scrollbar can take two characters, one for the main window, + the other for the preview window + * Bug fixes and improvements +- require golang >= 1.19 instead of "=" + +------------------------------------------------------------------- Old: ---- fzf-0.40.0.tar.gz New: ---- fzf-0.41.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ fzf.spec ++++++ --- /var/tmp/diff_new_pack.b3IINq/_old 2023-05-27 00:51:15.846923736 +0200 +++ /var/tmp/diff_new_pack.b3IINq/_new 2023-05-27 00:51:15.854923784 +0200 @@ -16,9 +16,9 @@ # -%global _lto_cflags %nil +%global _lto_cflags %{nil} Name: fzf -Version: 0.40.0 +Version: 0.41.0 Release: 0 Summary: A command-line fuzzy finder License: MIT @@ -27,7 +27,7 @@ Source0: https://github.com/junegunn/fzf/archive/refs/tags/%{version}.tar.gz#/%{name}-%{version}.tar.gz Source1: vendor.tar.zst BuildRequires: zstd -BuildRequires: golang(API) = 1.19 +BuildRequires: golang(API) >= 1.19 %description fzf is an interactive Unix filter for command-line that can be used with any list; files, ++++++ fzf-0.40.0.tar.gz -> fzf-0.41.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/.github/workflows/typos.yml new/fzf-0.41.0/.github/workflows/typos.yml --- old/fzf-0.40.0/.github/workflows/typos.yml 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/.github/workflows/typos.yml 2023-05-25 17:25:09.000000000 +0200 @@ -7,4 +7,4 @@ runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: crate-ci/typos@v1.13.16 + - uses: crate-ci/typos@v1.14.10 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/.tool-versions new/fzf-0.41.0/.tool-versions --- old/fzf-0.40.0/.tool-versions 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/.tool-versions 2023-05-25 17:25:09.000000000 +0200 @@ -1 +1 @@ -golang 1.20.2 +golang 1.20.4 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/ADVANCED.md new/fzf-0.41.0/ADVANCED.md --- old/fzf-0.40.0/ADVANCED.md 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/ADVANCED.md 2023-05-25 17:25:09.000000000 +0200 @@ -1,8 +1,8 @@ Advanced fzf examples ====================== -* *Last update: 2023/02/15* -* *Requires fzf 0.38.0 or above* +* *Last update: 2023/05/26* +* *Requires fzf 0.41.0 or above* --- @@ -336,9 +336,8 @@ # 3. Open the file in Vim RG_PREFIX="rg --column --line-number --no-heading --color=always --smart-case " INITIAL_QUERY="${*:-}" -FZF_DEFAULT_COMMAND="$RG_PREFIX $(printf %q "$INITIAL_QUERY")" \ -fzf --ansi \ - --disabled --query "$INITIAL_QUERY" \ +: | fzf --ansi --disabled --query "$INITIAL_QUERY" \ + --bind "start:reload:$RG_PREFIX {q}" \ --bind "change:reload:sleep 0.1; $RG_PREFIX {q} || true" \ --delimiter : \ --preview 'bat --color=always {1} --highlight-line {2}' \ @@ -348,11 +347,11 @@ ![image](https://user-images.githubusercontent.com/700826/113684212-f9ff0a00-96ff-11eb-8737-7bb571d320cc.png) -- Instead of starting fzf in `rg ... | fzf` form, we start fzf without an - explicit input, but with a custom `FZF_DEFAULT_COMMAND` variable. This way - fzf can kill the initial Ripgrep process it starts with the initial query. - Otherwise, the initial Ripgrep process will keep consuming system resources - even after `reload` is triggered. +- Instead of starting fzf in the usual `rg ... | fzf` form, we start fzf with + an empty input (`: | fzf`), then we make it start the initial Ripgrep + process immediately via `start:reload` binding. This way, fzf owns the + initial Ripgrep process so it can kill it on the next `reload`. Otherwise, + the process will keep running in the background. - Filtering is no longer a responsibility of fzf; hence `--disabled` - `{q}` in the reload command evaluates to the query string on fzf prompt. - `sleep 0.1` in the reload command is for "debouncing". This small delay will @@ -376,12 +375,11 @@ # 3. Open the file in Vim RG_PREFIX="rg --column --line-number --no-heading --color=always --smart-case " INITIAL_QUERY="${*:-}" -FZF_DEFAULT_COMMAND="$RG_PREFIX $(printf %q "$INITIAL_QUERY")" \ -fzf --ansi \ - --color "hl:-1:underline,hl+:-1:underline:reverse" \ - --disabled --query "$INITIAL_QUERY" \ +: | fzf --ansi --disabled --query "$INITIAL_QUERY" \ + --bind "start:reload:$RG_PREFIX {q}" \ --bind "change:reload:sleep 0.1; $RG_PREFIX {q} || true" \ --bind "alt-enter:unbind(change,alt-enter)+change-prompt(2. fzf> )+enable-search+clear-query" \ + --color "hl:-1:underline,hl+:-1:underline:reverse" \ --prompt '1. ripgrep> ' \ --delimiter : \ --preview 'bat --color=always {1} --highlight-line {2}' \ @@ -421,14 +419,12 @@ rm -f /tmp/rg-fzf-{r,f} RG_PREFIX="rg --column --line-number --no-heading --color=always --smart-case " INITIAL_QUERY="${*:-}" -FZF_DEFAULT_COMMAND="$RG_PREFIX $(printf %q "$INITIAL_QUERY")" \ -fzf --ansi \ - --color "hl:-1:underline,hl+:-1:underline:reverse" \ - --disabled --query "$INITIAL_QUERY" \ +: | fzf --ansi --disabled --query "$INITIAL_QUERY" \ + --bind "start:reload($RG_PREFIX {q})+unbind(ctrl-r)" \ --bind "change:reload:sleep 0.1; $RG_PREFIX {q} || true" \ --bind "ctrl-f:unbind(change,ctrl-f)+change-prompt(2. fzf> )+enable-search+rebind(ctrl-r)+transform-query(echo {q} > /tmp/rg-fzf-r; cat /tmp/rg-fzf-f)" \ --bind "ctrl-r:unbind(ctrl-r)+change-prompt(1. ripgrep> )+disable-search+reload($RG_PREFIX {q} || true)+rebind(change,ctrl-f)+transform-query(echo {q} > /tmp/rg-fzf-f; cat /tmp/rg-fzf-r)" \ - --bind "start:unbind(ctrl-r)" \ + --color "hl:-1:underline,hl+:-1:underline:reverse" \ --prompt '1. ripgrep> ' \ --delimiter : \ --header 'â± CTRL-R (ripgrep mode) â± CTRL-F (fzf mode) â±' \ @@ -471,16 +467,17 @@ ```bash pods() { - FZF_DEFAULT_COMMAND="kubectl get pods --all-namespaces" \ - fzf --info=inline --layout=reverse --header-lines=1 \ - --prompt "$(kubectl config current-context | sed 's/-context$//')> " \ - --header $'â± Enter (kubectl exec) â± CTRL-O (open log in editor) â± CTRL-R (reload) â±\n\n' \ - --bind 'ctrl-/:change-preview-window(80%,border-bottom|hidden|)' \ - --bind 'enter:execute:kubectl exec -it --namespace {1} {2} -- bash > /dev/tty' \ - --bind 'ctrl-o:execute:${EDITOR:-vim} <(kubectl logs --all-containers --namespace {1} {2}) > /dev/tty' \ - --bind 'ctrl-r:reload:$FZF_DEFAULT_COMMAND' \ - --preview-window up:follow \ - --preview 'kubectl logs --follow --all-containers --tail=10000 --namespace {1} {2}' "$@" + : | command='kubectl get pods --all-namespaces' fzf \ + --info=inline --layout=reverse --header-lines=1 \ + --prompt "$(kubectl config current-context | sed 's/-context$//')> " \ + --header $'â± Enter (kubectl exec) â± CTRL-O (open log in editor) â± CTRL-R (reload) â±\n\n' \ + --bind 'start:reload:$command' \ + --bind 'ctrl-r:reload:$command' \ + --bind 'ctrl-/:change-preview-window(80%,border-bottom|hidden|)' \ + --bind 'enter:execute:kubectl exec -it --namespace {1} {2} -- bash > /dev/tty' \ + --bind 'ctrl-o:execute:${EDITOR:-vim} <(kubectl logs --all-containers --namespace {1} {2}) > /dev/tty' \ + --preview-window up:follow \ + --preview 'kubectl logs --follow --all-containers --tail=10000 --namespace {1} {2}' "$@" } ``` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/CHANGELOG.md new/fzf-0.41.0/CHANGELOG.md --- old/fzf-0.40.0/CHANGELOG.md 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/CHANGELOG.md 2023-05-25 17:25:09.000000000 +0200 @@ -1,6 +1,21 @@ CHANGELOG ========= +0.41.0 +------ +- Added color name `preview-border` and `preview-scrollbar` +- Added new border style `block` which uses [block elements](https://en.wikipedia.org/wiki/Block_Elements) +- `--scrollbar` can take two characters, one for the main window, the other + for the preview window +- Putting it altogether: + ```sh + fzf-tmux -p 80% --padding 1,2 --preview 'bat --style=plain --color=always {}' \ + --color 'bg:237,bg+:235,gutter:237,border:238,scrollbar:236' \ + --color 'preview-bg:235,preview-border:236,preview-scrollbar:234' \ + --preview-window 'border-block' --border block --scrollbar 'ââ' + ``` +- Bug fixes and improvements + 0.40.0 ------ - Added `zero` event that is triggered when there's no match diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/Dockerfile new/fzf-0.41.0/Dockerfile --- old/fzf-0.40.0/Dockerfile 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/Dockerfile 2023-05-25 17:25:09.000000000 +0200 @@ -1,4 +1,4 @@ -FROM archlinux +FROM --platform=linux/amd64 archlinux RUN pacman -Sy && pacman --noconfirm -S awk git tmux zsh fish ruby procps go make gcc RUN gem install --no-document -v 5.14.2 minitest RUN echo '. /usr/share/bash-completion/completions/git' >> ~/.bashrc diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/Makefile new/fzf-0.41.0/Makefile --- old/fzf-0.40.0/Makefile 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/Makefile 2023-05-25 17:25:09.000000000 +0200 @@ -88,7 +88,7 @@ install: bin/fzf build: - goreleaser --rm-dist --snapshot + goreleaser build --rm-dist --snapshot --skip-post-hooks release: ifndef GITHUB_TOKEN diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/README.md new/fzf-0.41.0/README.md --- old/fzf-0.40.0/README.md 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/README.md 2023-05-25 17:25:09.000000000 +0200 @@ -630,8 +630,8 @@ #### 1. Update the list of processes by pressing CTRL-R ```sh -FZF_DEFAULT_COMMAND='ps -ef' \ - fzf --bind 'ctrl-r:reload(eval "$FZF_DEFAULT_COMMAND")' \ +ps -ef | + fzf --bind 'ctrl-r:reload(ps -ef)' \ --header 'Press CTRL-R to reload' --header-lines=1 \ --height=50% --layout=reverse ``` @@ -653,12 +653,12 @@ doesn't perform any secondary filtering. ```sh -INITIAL_QUERY="" -RG_PREFIX="rg --column --line-number --no-heading --color=always --smart-case " -FZF_DEFAULT_COMMAND="$RG_PREFIX '$INITIAL_QUERY'" \ - fzf --bind "change:reload:$RG_PREFIX {q} || true" \ - --ansi --disabled --query "$INITIAL_QUERY" \ - --height=50% --layout=reverse +: | rg_prefix='rg --column --line-number --no-heading --color=always --smart-case' \ + fzf --bind 'start:reload:$rg_prefix ""' \ + --bind 'change:reload:$rg_prefix {q} || true' \ + --bind 'enter:become(vim {1} +{2})' \ + --ansi --disabled \ + --height=50% --layout=reverse ``` If ripgrep doesn't find any matches, it will exit with a non-zero exit status, @@ -666,7 +666,7 @@ `|| true` to the command, so that it always exits with 0. See ["Using fzf as interactive Ripgrep launcher"](https://github.com/junegunn/fzf/blob/master/ADVANCED.md#using-fzf-as-interactive-ripgrep-launcher) -for a fuller example with preview window options. +for more sophisticated examples. ### Preview window diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/go.mod new/fzf-0.41.0/go.mod --- old/fzf-0.40.0/go.mod 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/go.mod 2023-05-25 17:25:09.000000000 +0200 @@ -7,8 +7,8 @@ github.com/mattn/go-shellwords v1.0.12 github.com/rivo/uniseg v0.4.4 github.com/saracen/walker v0.1.3 - golang.org/x/sys v0.7.0 - golang.org/x/term v0.7.0 + golang.org/x/sys v0.8.0 + golang.org/x/term v0.8.0 ) require ( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/go.sum new/fzf-0.41.0/go.sum --- old/fzf-0.40.0/go.sum 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/go.sum 2023-05-25 17:25:09.000000000 +0200 @@ -32,12 +32,12 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= -golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/install new/fzf-0.41.0/install --- old/fzf-0.40.0/install 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/install 2023-05-25 17:25:09.000000000 +0200 @@ -2,7 +2,7 @@ set -u -version=0.40.0 +version=0.41.0 auto_completion= key_bindings= update_config=2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/install.ps1 new/fzf-0.41.0/install.ps1 --- old/fzf-0.40.0/install.ps1 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/install.ps1 2023-05-25 17:25:09.000000000 +0200 @@ -1,4 +1,4 @@ -$version="0.40.0" +$version="0.41.0" $fzf_base=Split-Path -Parent $MyInvocation.MyCommand.Definition diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/main.go new/fzf-0.41.0/main.go --- old/fzf-0.40.0/main.go 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/main.go 2023-05-25 17:25:09.000000000 +0200 @@ -5,7 +5,7 @@ "github.com/junegunn/fzf/src/protector" ) -var version string = "0.40" +var version string = "0.41" var revision string = "devel" func main() { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/man/man1/fzf-tmux.1 new/fzf-0.41.0/man/man1/fzf-tmux.1 --- old/fzf-0.40.0/man/man1/fzf-tmux.1 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/man/man1/fzf-tmux.1 2023-05-25 17:25:09.000000000 +0200 @@ -21,7 +21,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. .. -.TH fzf-tmux 1 "May 2023" "fzf 0.40.0" "fzf-tmux - open fzf in tmux split pane" +.TH fzf-tmux 1 "May 2023" "fzf 0.41.0" "fzf-tmux - open fzf in tmux split pane" .SH NAME fzf-tmux - open fzf in tmux split pane diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/man/man1/fzf.1 new/fzf-0.41.0/man/man1/fzf.1 --- old/fzf-0.40.0/man/man1/fzf.1 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/man/man1/fzf.1 2023-05-25 17:25:09.000000000 +0200 @@ -21,7 +21,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. .. -.TH fzf 1 "May 2023" "fzf 0.40.0" "fzf - a command-line fuzzy finder" +.TH fzf 1 "May 2023" "fzf 0.41.0" "fzf - a command-line fuzzy finder" .SH NAME fzf - a command-line fuzzy finder @@ -377,9 +377,10 @@ \fB--separator=''\fB .TP -.BI "--scrollbar=" "CHAR" +.BI "--scrollbar=" "CHAR1[CHAR2]" Use the given character to render scrollbar. (default: 'â' or ':' depending on -\fB--no-unicode\fR). +\fB--no-unicode\fR). The optional \fBCHAR2\fR is used to render scrollbar of +the preview window. .TP .B "--no-scrollbar" @@ -433,28 +434,30 @@ \fBbw \fRNo colors (equivalent to \fB--no-color\fR) .B COLOR NAMES: - \fBfg \fRText - \fBpreview-fg \fRPreview window text - \fBbg \fRBackground - \fBpreview-bg \fRPreview window background - \fBhl \fRHighlighted substrings - \fBfg+ \fRText (current line) - \fBbg+ \fRBackground (current line) - \fBgutter \fRGutter on the left - \fBhl+ \fRHighlighted substrings (current line) - \fBquery \fRQuery string - \fBdisabled \fRQuery string when search is disabled (\fB--disabled\fR) - \fBinfo \fRInfo line (match counters) - \fBborder \fRBorder around the window (\fB--border\fR and \fB--preview\fR) - \fBseparator \fRHorizontal separator on info line - \fBscrollbar \fRScrollbar - \fBlabel \fRBorder label (\fB--border-label\fR and \fB--preview-label\fR) - \fBpreview-label \fRBorder label of the preview window (\fB--preview-label\fR) - \fBprompt \fRPrompt - \fBpointer \fRPointer to the current line - \fBmarker \fRMulti-select marker - \fBspinner \fRStreaming input indicator - \fBheader \fRHeader + \fBfg \fRText + \fBpreview-fg \fRPreview window text + \fBbg \fRBackground + \fBpreview-bg \fRPreview window background + \fBhl \fRHighlighted substrings + \fBfg+ \fRText (current line) + \fBbg+ \fRBackground (current line) + \fBgutter \fRGutter on the left + \fBhl+ \fRHighlighted substrings (current line) + \fBquery \fRQuery string + \fBdisabled \fRQuery string when search is disabled (\fB--disabled\fR) + \fBinfo \fRInfo line (match counters) + \fBborder \fRBorder around the window (\fB--border\fR and \fB--preview\fR) + \fBscrollbar \fRScrollbar + \fBpreview-border \fRBorder around the preview window (\fB--preview\fR) + \fBpreview-scrollbar \fRScrollbar + \fBseparator \fRHorizontal separator on info line + \fBlabel \fRBorder label (\fB--border-label\fR and \fB--preview-label\fR) + \fBpreview-label \fRBorder label of the preview window (\fB--preview-label\fR) + \fBprompt \fRPrompt + \fBpointer \fRPointer to the current line + \fBmarker \fRMulti-select marker + \fBspinner \fRStreaming input indicator + \fBheader \fRHeader .B ANSI COLORS: \fB-1 \fRDefault terminal foreground/background color @@ -870,6 +873,8 @@ .br \fIctrl-space\fR .br +\fIctrl-delete\fR +.br \fIctrl-\\\fR .br \fIctrl-]\fR @@ -938,6 +943,8 @@ .br \fIshift-right\fR .br +\fIshift-delete\fR +.br \fIalt-shift-up\fR .br \fIalt-shift-down\fR diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/src/core.go new/fzf-0.41.0/src/core.go --- old/fzf-0.40.0/src/core.go 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/src/core.go 2023-05-25 17:25:09.000000000 +0200 @@ -320,15 +320,16 @@ if !changed { break } + reset := false if !useSnapshot { newSnapshot, _ := chunkList.Snapshot() // We want to avoid showing empty list when reload is triggered // and the query string is changed at the same time i.e. command != nil && changed if command == nil || len(newSnapshot) > 0 { snapshot = newSnapshot + reset = clearCache() } } - reset := !useSnapshot && clearCache() matcher.Reset(snapshot, input(reset), true, !reading, sort, reset) delay = false diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/src/options.go new/fzf-0.41.0/src/options.go --- old/fzf-0.40.0/src/options.go 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/src/options.go 2023-05-25 17:25:09.000000000 +0200 @@ -63,7 +63,7 @@ (default: 10) --layout=LAYOUT Choose layout: [default|reverse|reverse-list] --border[=STYLE] Draw border around the finder - [rounded|sharp|horizontal|vertical| + [rounded|sharp|bold|block|double|horizontal|vertical| top|bottom|left|right|none] (default: rounded) --border-label=LABEL Label to print on the border --border-label-pos=COL Position of the border label @@ -75,7 +75,7 @@ --info=STYLE Finder info style [default|hidden|inline|inline:SEPARATOR] --separator=STR String to form horizontal separator on info line --no-separator Hide info line separator - --scrollbar[=CHAR] Scrollbar character + --scrollbar[=C1[C2]] Scrollbar character(s) (each for main and preview window) --no-scrollbar Hide scrollbar --prompt=STR Input prompt (default: '> ') --pointer=STR Pointer to the current line (default: '>') @@ -544,6 +544,8 @@ return tui.BorderSharp case "bold": return tui.BorderBold + case "block": + return tui.BorderBlock case "double": return tui.BorderDouble case "horizontal": @@ -564,7 +566,7 @@ if optional && str == "" { return tui.DefaultBorderShape } - errorExit("invalid border style (expected: rounded|sharp|bold|double|horizontal|vertical|top|bottom|left|right|none)") + errorExit("invalid border style (expected: rounded|sharp|bold|block|double|horizontal|vertical|top|bottom|left|right|none)") } return tui.BorderNone } @@ -612,6 +614,8 @@ add(tui.BSpace) case "ctrl-space": add(tui.CtrlSpace) + case "ctrl-delete": + add(tui.CtrlDelete) case "ctrl-^", "ctrl-6": add(tui.CtrlCaret) case "ctrl-/", "ctrl-_": @@ -682,6 +686,8 @@ add(tui.SLeft) case "shift-right": add(tui.SRight) + case "shift-delete": + add(tui.SDelete) case "left-click": add(tui.LeftClick) case "right-click": @@ -888,10 +894,14 @@ mergeAttr(&theme.CurrentMatch) case "border": mergeAttr(&theme.Border) + case "preview-border": + mergeAttr(&theme.PreviewBorder) case "separator": mergeAttr(&theme.Separator) case "scrollbar": mergeAttr(&theme.Scrollbar) + case "preview-scrollbar": + mergeAttr(&theme.PreviewScrollbar) case "label": mergeAttr(&theme.BorderLabel) case "preview-label": @@ -1426,6 +1436,8 @@ opts.border = tui.BorderSharp case "border-bold": opts.border = tui.BorderBold + case "border-block": + opts.border = tui.BorderBlock case "border-double": opts.border = tui.BorderDouble case "noborder", "border-none": @@ -1952,8 +1964,16 @@ errorExit("--height option is currently not supported on this platform") } - if opts.Scrollbar != nil && runewidth.StringWidth(*opts.Scrollbar) > 1 { - errorExit("scrollbar display width should be 1") + if opts.Scrollbar != nil { + runes := []rune(*opts.Scrollbar) + if len(runes) > 2 { + errorExit("--scrollbar should be given one or two characters") + } + for _, r := range runes { + if runewidth.RuneWidth(r) != 1 { + errorExit("scrollbar display width should be 1") + } + } } // Default actions for CTRL-N / CTRL-P when --history is set @@ -1969,25 +1989,25 @@ // Extend the default key map keymap := defaultKeymap() for key, actions := range opts.Keymap { - var lastChangePreviewWindow *action + reordered := []*action{} for _, act := range actions { switch act.t { case actToggleSort: // To display "+S"/"-S" on info line opts.ToggleSort = true - case actChangePreviewWindow: - lastChangePreviewWindow = act + case actTogglePreview, actShowPreview, actHidePreview, actChangePreviewWindow: + reordered = append(reordered, act) } } - // Re-organize actions so that we only keep the last change-preview-window - // and it comes first in the list. + // Re-organize actions so that we put actions that change the preview window first in the list. // * change-preview-window(up,+10)+preview(sleep 3; cat {})+change-preview-window(up,+20) - // -> change-preview-window(up,+20)+preview(sleep 3; cat {}) - if lastChangePreviewWindow != nil { - reordered := []*action{lastChangePreviewWindow} + // -> change-preview-window(up,+10)+change-preview-window(up,+20)+preview(sleep 3; cat {}) + if len(reordered) > 0 { for _, act := range actions { - if act.t != actChangePreviewWindow { + switch act.t { + case actTogglePreview, actShowPreview, actHidePreview, actChangePreviewWindow: + default: reordered = append(reordered, act) } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/src/terminal.go new/fzf-0.41.0/src/terminal.go --- old/fzf-0.40.0/src/terminal.go 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/src/terminal.go 2023-05-25 17:25:09.000000000 +0200 @@ -199,6 +199,7 @@ header0 []string ellipsis string scrollbar string + previewScrollbar string ansi bool tabstop int margin [4]sizeSpec @@ -690,8 +691,16 @@ } else { t.scrollbar = "|" } + t.previewScrollbar = t.scrollbar } else { - t.scrollbar = *opts.Scrollbar + runes := []rune(*opts.Scrollbar) + if len(runes) > 0 { + t.scrollbar = string(runes[0]) + t.previewScrollbar = t.scrollbar + if len(runes) > 1 { + t.previewScrollbar = string(runes[1]) + } + } } _, t.hasLoadActions = t.keymap[tui.Load.AsEvent()] @@ -717,7 +726,7 @@ func borderLines(shape tui.BorderShape) int { switch shape { - case tui.BorderHorizontal, tui.BorderRounded, tui.BorderSharp, tui.BorderBold, tui.BorderDouble: + case tui.BorderHorizontal, tui.BorderRounded, tui.BorderSharp, tui.BorderBold, tui.BorderBlock, tui.BorderDouble: return 2 case tui.BorderTop, tui.BorderBottom: return 1 @@ -1073,7 +1082,7 @@ if idx == 3 { extraMargin[idx] += 1 + bw } - case tui.BorderRounded, tui.BorderSharp, tui.BorderBold, tui.BorderDouble: + case tui.BorderRounded, tui.BorderSharp, tui.BorderBold, tui.BorderBlock, tui.BorderDouble: extraMargin[idx] += 1 + bw*(idx%2) } marginInt[idx] = sizeSpecToInt(idx, sizeSpec) + extraMargin[idx] @@ -1166,7 +1175,7 @@ t.border = t.tui.NewWindow( marginInt[0], marginInt[3], width+(1+bw), height, false, tui.MakeBorderStyle(tui.BorderRight, t.unicode)) - case tui.BorderRounded, tui.BorderSharp, tui.BorderBold, tui.BorderDouble: + case tui.BorderRounded, tui.BorderSharp, tui.BorderBold, tui.BorderBlock, tui.BorderDouble: t.border = t.tui.NewWindow( marginInt[0]-1, marginInt[3]-(1+bw), width+(1+bw)*2, height+2, false, tui.MakeBorderStyle(t.borderShape, t.unicode)) @@ -1200,7 +1209,7 @@ } t.pborder = t.tui.NewWindow(y, x, w, h, true, previewBorder) switch previewOpts.border { - case tui.BorderSharp, tui.BorderRounded, tui.BorderBold, tui.BorderDouble: + case tui.BorderSharp, tui.BorderRounded, tui.BorderBold, tui.BorderBlock, tui.BorderDouble: pwidth -= (1 + bw) * 2 pheight -= 2 x += 1 + bw @@ -1226,6 +1235,8 @@ // Need a column to show scrollbar pwidth -= 1 } + pwidth = util.Max(0, pwidth) + pheight = util.Max(0, pheight) t.pwindow = t.tui.NewWindow(y, x, pwidth, pheight, true, noBorder) } verticalPad := 2 @@ -1342,7 +1353,7 @@ } switch borderShape { - case tui.BorderHorizontal, tui.BorderTop, tui.BorderBottom, tui.BorderRounded, tui.BorderSharp, tui.BorderBold, tui.BorderDouble: + case tui.BorderHorizontal, tui.BorderTop, tui.BorderBottom, tui.BorderRounded, tui.BorderSharp, tui.BorderBold, tui.BorderBlock, tui.BorderDouble: if redrawBorder { window.DrawHBorder() } @@ -1930,7 +1941,9 @@ func (t *Terminal) renderPreviewScrollbar(yoff int, barLength int, barStart int) { height := t.pwindow.Height() w := t.pborder.Width() + redraw := false if len(t.previewer.bar) != height { + redraw = true t.previewer.bar = make([]bool, height) } xshift := -1 - t.borderWidth @@ -1947,22 +1960,22 @@ // Avoid unnecessary redraws bar := i >= yoff+barStart && i < yoff+barStart+barLength - if bar == t.previewer.bar[i] && !t.tui.NeedScrollbarRedraw() { + if !redraw && bar == t.previewer.bar[i] && !t.tui.NeedScrollbarRedraw() { continue } t.previewer.bar[i] = bar t.pborder.Move(y, x) if i >= yoff+barStart && i < yoff+barStart+barLength { - t.pborder.CPrint(tui.ColScrollbar, t.scrollbar) + t.pborder.CPrint(tui.ColPreviewScrollbar, t.previewScrollbar) } else { - t.pborder.Print(" ") + t.pborder.CPrint(tui.ColPreviewScrollbar, " ") } } } func (t *Terminal) printPreview() { - if !t.hasPreviewWindow() { + if !t.hasPreviewWindow() || t.pwindow.Height() == 0 { return } numLines := len(t.previewer.lines) @@ -2706,11 +2719,6 @@ } } - var onFocus []*action - if actions, prs := t.keymap[tui.Focus.AsEvent()]; prs { - onFocus = actions - } - go func() { var focusedIndex int32 = minItem.Index() var version int64 = -1 @@ -2751,7 +2759,7 @@ t.track = trackDisabled t.printInfo() } - if onFocus != nil && focusChanged { + if onFocus, prs := t.keymap[tui.Focus.AsEvent()]; prs && focusChanged { t.serverChan <- onFocus } if focusChanged || version != t.version { @@ -2953,6 +2961,14 @@ if t.history != nil { t.history.append(string(t.input)) } + /* + FIXME: It is not at all clear why this is required. + The following command will report 'not a tty', unless we open + /dev/tty *twice* after closing the standard input for 'reload' + in Reader.terminate(). + : | fzf --bind 'start:reload:ls' --bind 'enter:become:tty' + */ + tui.TtyIn() util.SetStdin(tui.TtyIn()) syscall.Exec(shellPath, []string{shell, "-c", command}, os.Environ()) } @@ -3523,6 +3539,9 @@ // Split window options tokens := strings.Split(a.a, "|") + if len(tokens[0]) > 0 && t.initialPreviewOpts.hidden { + t.previewOpts.hidden = false + } parsePreviewWindow(&t.previewOpts, tokens[0]) if len(tokens) > 1 { a.a = strings.Join(append(tokens[1:], tokens[0]), "|") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/src/tui/light.go new/fzf-0.41.0/src/tui/light.go --- old/fzf-0.40.0/src/tui/light.go 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/src/tui/light.go 2023-05-25 17:25:09.000000000 +0200 @@ -430,7 +430,19 @@ } return Event{Invalid, 0, nil} // INS case '3': - return Event{Del, 0, nil} + if r.buffer[3] == '~' { + return Event{Del, 0, nil} + } + if len(r.buffer) == 6 && r.buffer[5] == '~' { + *sz = 6 + switch r.buffer[4] { + case '5': + return Event{CtrlDelete, 0, nil} + case '2': + return Event{SDelete, 0, nil} + } + } + return Event{Invalid, 0, nil} case '4': return Event{End, 0, nil} case '5': @@ -745,7 +757,7 @@ func (w *LightWindow) drawBorder(onlyHorizontal bool) { switch w.border.shape { - case BorderRounded, BorderSharp, BorderBold, BorderDouble: + case BorderRounded, BorderSharp, BorderBold, BorderBlock, BorderDouble: w.drawBorderAround(onlyHorizontal) case BorderHorizontal: w.drawBorderHorizontal(true, true) @@ -776,14 +788,14 @@ if w.preview { color = ColPreviewBorder } - hw := runewidth.RuneWidth(w.border.horizontal) + hw := runewidth.RuneWidth(w.border.top) if top { w.Move(0, 0) - w.CPrint(color, repeat(w.border.horizontal, w.width/hw)) + w.CPrint(color, repeat(w.border.top, w.width/hw)) } if bottom { w.Move(w.height-1, 0) - w.CPrint(color, repeat(w.border.horizontal, w.width/hw)) + w.CPrint(color, repeat(w.border.bottom, w.width/hw)) } } @@ -799,11 +811,11 @@ for y := 0; y < w.height; y++ { w.Move(y, 0) if left { - w.CPrint(color, string(w.border.vertical)) + w.CPrint(color, string(w.border.left)) } w.CPrint(color, repeat(' ', width)) if right { - w.CPrint(color, string(w.border.vertical)) + w.CPrint(color, string(w.border.right)) } } } @@ -814,23 +826,23 @@ if w.preview { color = ColPreviewBorder } - hw := runewidth.RuneWidth(w.border.horizontal) + hw := runewidth.RuneWidth(w.border.top) tcw := runewidth.RuneWidth(w.border.topLeft) + runewidth.RuneWidth(w.border.topRight) bcw := runewidth.RuneWidth(w.border.bottomLeft) + runewidth.RuneWidth(w.border.bottomRight) rem := (w.width - tcw) % hw - w.CPrint(color, string(w.border.topLeft)+repeat(w.border.horizontal, (w.width-tcw)/hw)+repeat(' ', rem)+string(w.border.topRight)) + w.CPrint(color, string(w.border.topLeft)+repeat(w.border.top, (w.width-tcw)/hw)+repeat(' ', rem)+string(w.border.topRight)) if !onlyHorizontal { - vw := runewidth.RuneWidth(w.border.vertical) + vw := runewidth.RuneWidth(w.border.left) for y := 1; y < w.height-1; y++ { w.Move(y, 0) - w.CPrint(color, string(w.border.vertical)) + w.CPrint(color, string(w.border.left)) w.CPrint(color, repeat(' ', w.width-vw*2)) - w.CPrint(color, string(w.border.vertical)) + w.CPrint(color, string(w.border.right)) } } w.Move(w.height-1, 0) rem = (w.width - bcw) % hw - w.CPrint(color, string(w.border.bottomLeft)+repeat(w.border.horizontal, (w.width-bcw)/hw)+repeat(' ', rem)+string(w.border.bottomRight)) + w.CPrint(color, string(w.border.bottomLeft)+repeat(w.border.bottom, (w.width-bcw)/hw)+repeat(' ', rem)+string(w.border.bottomRight)) } func (w *LightWindow) csi(code string) string { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/src/tui/tcell.go new/fzf-0.41.0/src/tui/tcell.go --- old/fzf-0.40.0/src/tui/tcell.go 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/src/tui/tcell.go 2023-05-25 17:25:09.000000000 +0200 @@ -413,6 +413,12 @@ case tcell.KeyHome: return Event{Home, 0, nil} case tcell.KeyDelete: + if ctrl { + return Event{CtrlDelete, 0, nil} + } + if shift { + return Event{SDelete, 0, nil} + } return Event{Del, 0, nil} case tcell.KeyEnd: return Event{End, 0, nil} @@ -707,9 +713,9 @@ style = w.normal.style() } - hw := runewidth.RuneWidth(w.borderStyle.horizontal) + hw := runewidth.RuneWidth(w.borderStyle.top) switch shape { - case BorderRounded, BorderSharp, BorderBold, BorderDouble, BorderHorizontal, BorderTop: + case BorderRounded, BorderSharp, BorderBold, BorderBlock, BorderDouble, BorderHorizontal, BorderTop: max := right - 2*hw if shape == BorderHorizontal || shape == BorderTop { max = right - hw @@ -720,36 +726,36 @@ // ================== // ( HH ) => TR is ignored for x := left; x <= max; x += hw { - _screen.SetContent(x, top, w.borderStyle.horizontal, nil, style) + _screen.SetContent(x, top, w.borderStyle.top, nil, style) } } switch shape { - case BorderRounded, BorderSharp, BorderBold, BorderDouble, BorderHorizontal, BorderBottom: + case BorderRounded, BorderSharp, BorderBold, BorderBlock, BorderDouble, BorderHorizontal, BorderBottom: max := right - 2*hw if shape == BorderHorizontal || shape == BorderBottom { max = right - hw } for x := left; x <= max; x += hw { - _screen.SetContent(x, bot-1, w.borderStyle.horizontal, nil, style) + _screen.SetContent(x, bot-1, w.borderStyle.bottom, nil, style) } } if !onlyHorizontal { switch shape { - case BorderRounded, BorderSharp, BorderBold, BorderDouble, BorderVertical, BorderLeft: + case BorderRounded, BorderSharp, BorderBold, BorderBlock, BorderDouble, BorderVertical, BorderLeft: for y := top; y < bot; y++ { - _screen.SetContent(left, y, w.borderStyle.vertical, nil, style) + _screen.SetContent(left, y, w.borderStyle.left, nil, style) } } switch shape { - case BorderRounded, BorderSharp, BorderBold, BorderDouble, BorderVertical, BorderRight: - vw := runewidth.RuneWidth(w.borderStyle.vertical) + case BorderRounded, BorderSharp, BorderBold, BorderBlock, BorderDouble, BorderVertical, BorderRight: + vw := runewidth.RuneWidth(w.borderStyle.right) for y := top; y < bot; y++ { - _screen.SetContent(right-vw, y, w.borderStyle.vertical, nil, style) + _screen.SetContent(right-vw, y, w.borderStyle.right, nil, style) } } } switch shape { - case BorderRounded, BorderSharp, BorderBold, BorderDouble: + case BorderRounded, BorderSharp, BorderBold, BorderBlock, BorderDouble: _screen.SetContent(left, top, w.borderStyle.topLeft, nil, style) _screen.SetContent(right-runewidth.RuneWidth(w.borderStyle.topRight), top, w.borderStyle.topRight, nil, style) _screen.SetContent(left, bot-1, w.borderStyle.bottomLeft, nil, style) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/src/tui/tui.go new/fzf-0.41.0/src/tui/tui.go --- old/fzf-0.40.0/src/tui/tui.go 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/src/tui/tui.go 2023-05-25 17:25:09.000000000 +0200 @@ -41,6 +41,7 @@ CtrlZ ESC CtrlSpace + CtrlDelete // https://apple.stackexchange.com/questions/24261/how-do-i-send-c-that-is-control-slash-to-the-terminal CtrlBackSlash @@ -74,6 +75,7 @@ SDown SLeft SRight + SDelete F1 F2 @@ -253,29 +255,31 @@ } type ColorTheme struct { - Colored bool - Input ColorAttr - Disabled ColorAttr - Fg ColorAttr - Bg ColorAttr - PreviewFg ColorAttr - PreviewBg ColorAttr - DarkBg ColorAttr - Gutter ColorAttr - Prompt ColorAttr - Match ColorAttr - Current ColorAttr - CurrentMatch ColorAttr - Spinner ColorAttr - Info ColorAttr - Cursor ColorAttr - Selected ColorAttr - Header ColorAttr - Separator ColorAttr - Scrollbar ColorAttr - Border ColorAttr - BorderLabel ColorAttr - PreviewLabel ColorAttr + Colored bool + Input ColorAttr + Disabled ColorAttr + Fg ColorAttr + Bg ColorAttr + PreviewFg ColorAttr + PreviewBg ColorAttr + DarkBg ColorAttr + Gutter ColorAttr + Prompt ColorAttr + Match ColorAttr + Current ColorAttr + CurrentMatch ColorAttr + Spinner ColorAttr + Info ColorAttr + Cursor ColorAttr + Selected ColorAttr + Header ColorAttr + Separator ColorAttr + Scrollbar ColorAttr + Border ColorAttr + PreviewBorder ColorAttr + PreviewScrollbar ColorAttr + BorderLabel ColorAttr + PreviewLabel ColorAttr } type Event struct { @@ -310,6 +314,7 @@ BorderRounded BorderSharp BorderBold + BorderBlock BorderDouble BorderHorizontal BorderVertical @@ -337,8 +342,10 @@ type BorderStyle struct { shape BorderShape - horizontal rune - vertical rune + top rune + bottom rune + left rune + right rune topLeft rune topRight rune bottomLeft rune @@ -351,8 +358,10 @@ if !unicode { return BorderStyle{ shape: shape, - horizontal: '-', - vertical: '|', + top: '-', + bottom: '-', + left: '|', + right: '|', topLeft: '+', topRight: '+', bottomLeft: '+', @@ -363,8 +372,10 @@ case BorderSharp: return BorderStyle{ shape: shape, - horizontal: 'â', - vertical: 'â', + top: 'â', + bottom: 'â', + left: 'â', + right: 'â', topLeft: 'â', topRight: 'â', bottomLeft: 'â', @@ -373,18 +384,37 @@ case BorderBold: return BorderStyle{ shape: shape, - horizontal: 'â', - vertical: 'â', + top: 'â', + bottom: 'â', + left: 'â', + right: 'â', topLeft: 'â', topRight: 'â', bottomLeft: 'â', bottomRight: 'â', } + case BorderBlock: + // ââââââââââââââââââââ + // â â + // ââââââââââââââââââââ + return BorderStyle{ + shape: shape, + top: 'â', + bottom: 'â', + left: 'â', + right: 'â', + topLeft: 'â', + topRight: 'â', + bottomLeft: 'â', + bottomRight: 'â', + } case BorderDouble: return BorderStyle{ shape: shape, - horizontal: 'â', - vertical: 'â', + top: 'â', + bottom: 'â', + left: 'â', + right: 'â', topLeft: 'â', topRight: 'â', bottomLeft: 'â', @@ -393,8 +423,10 @@ } return BorderStyle{ shape: shape, - horizontal: 'â', - vertical: 'â', + top: 'â', + bottom: 'â', + left: 'â', + right: 'â', topLeft: 'â', topRight: 'â®', bottomLeft: 'â°', @@ -405,8 +437,10 @@ func MakeTransparentBorder() BorderStyle { return BorderStyle{ shape: BorderRounded, - horizontal: ' ', - vertical: ' ', + top: ' ', + bottom: ' ', + left: ' ', + right: ' ', topLeft: ' ', topRight: ' ', bottomLeft: ' ', @@ -503,61 +537,66 @@ ColPreviewBorder ColorPair ColBorderLabel ColorPair ColPreviewLabel ColorPair + ColPreviewScrollbar ColorPair ) func EmptyTheme() *ColorTheme { return &ColorTheme{ - Colored: true, - Input: ColorAttr{colUndefined, AttrUndefined}, - Fg: ColorAttr{colUndefined, AttrUndefined}, - Bg: ColorAttr{colUndefined, AttrUndefined}, - DarkBg: ColorAttr{colUndefined, AttrUndefined}, - Prompt: ColorAttr{colUndefined, AttrUndefined}, - Match: ColorAttr{colUndefined, AttrUndefined}, - Current: ColorAttr{colUndefined, AttrUndefined}, - CurrentMatch: ColorAttr{colUndefined, AttrUndefined}, - Spinner: ColorAttr{colUndefined, AttrUndefined}, - Info: ColorAttr{colUndefined, AttrUndefined}, - Cursor: ColorAttr{colUndefined, AttrUndefined}, - Selected: ColorAttr{colUndefined, AttrUndefined}, - Header: ColorAttr{colUndefined, AttrUndefined}, - Border: ColorAttr{colUndefined, AttrUndefined}, - BorderLabel: ColorAttr{colUndefined, AttrUndefined}, - Disabled: ColorAttr{colUndefined, AttrUndefined}, - PreviewFg: ColorAttr{colUndefined, AttrUndefined}, - PreviewBg: ColorAttr{colUndefined, AttrUndefined}, - Gutter: ColorAttr{colUndefined, AttrUndefined}, - PreviewLabel: ColorAttr{colUndefined, AttrUndefined}, - Separator: ColorAttr{colUndefined, AttrUndefined}, - Scrollbar: ColorAttr{colUndefined, AttrUndefined}, + Colored: true, + Input: ColorAttr{colUndefined, AttrUndefined}, + Fg: ColorAttr{colUndefined, AttrUndefined}, + Bg: ColorAttr{colUndefined, AttrUndefined}, + DarkBg: ColorAttr{colUndefined, AttrUndefined}, + Prompt: ColorAttr{colUndefined, AttrUndefined}, + Match: ColorAttr{colUndefined, AttrUndefined}, + Current: ColorAttr{colUndefined, AttrUndefined}, + CurrentMatch: ColorAttr{colUndefined, AttrUndefined}, + Spinner: ColorAttr{colUndefined, AttrUndefined}, + Info: ColorAttr{colUndefined, AttrUndefined}, + Cursor: ColorAttr{colUndefined, AttrUndefined}, + Selected: ColorAttr{colUndefined, AttrUndefined}, + Header: ColorAttr{colUndefined, AttrUndefined}, + Border: ColorAttr{colUndefined, AttrUndefined}, + BorderLabel: ColorAttr{colUndefined, AttrUndefined}, + Disabled: ColorAttr{colUndefined, AttrUndefined}, + PreviewFg: ColorAttr{colUndefined, AttrUndefined}, + PreviewBg: ColorAttr{colUndefined, AttrUndefined}, + Gutter: ColorAttr{colUndefined, AttrUndefined}, + PreviewBorder: ColorAttr{colUndefined, AttrUndefined}, + PreviewScrollbar: ColorAttr{colUndefined, AttrUndefined}, + PreviewLabel: ColorAttr{colUndefined, AttrUndefined}, + Separator: ColorAttr{colUndefined, AttrUndefined}, + Scrollbar: ColorAttr{colUndefined, AttrUndefined}, } } func NoColorTheme() *ColorTheme { return &ColorTheme{ - Colored: false, - Input: ColorAttr{colDefault, AttrUndefined}, - Fg: ColorAttr{colDefault, AttrUndefined}, - Bg: ColorAttr{colDefault, AttrUndefined}, - DarkBg: ColorAttr{colDefault, AttrUndefined}, - Prompt: ColorAttr{colDefault, AttrUndefined}, - Match: ColorAttr{colDefault, Underline}, - Current: ColorAttr{colDefault, Reverse}, - CurrentMatch: ColorAttr{colDefault, Reverse | Underline}, - Spinner: ColorAttr{colDefault, AttrUndefined}, - Info: ColorAttr{colDefault, AttrUndefined}, - Cursor: ColorAttr{colDefault, AttrUndefined}, - Selected: ColorAttr{colDefault, AttrUndefined}, - Header: ColorAttr{colDefault, AttrUndefined}, - Border: ColorAttr{colDefault, AttrUndefined}, - BorderLabel: ColorAttr{colDefault, AttrUndefined}, - Disabled: ColorAttr{colDefault, AttrUndefined}, - PreviewFg: ColorAttr{colDefault, AttrUndefined}, - PreviewBg: ColorAttr{colDefault, AttrUndefined}, - Gutter: ColorAttr{colDefault, AttrUndefined}, - PreviewLabel: ColorAttr{colDefault, AttrUndefined}, - Separator: ColorAttr{colDefault, AttrUndefined}, - Scrollbar: ColorAttr{colDefault, AttrUndefined}, + Colored: false, + Input: ColorAttr{colDefault, AttrUndefined}, + Fg: ColorAttr{colDefault, AttrUndefined}, + Bg: ColorAttr{colDefault, AttrUndefined}, + DarkBg: ColorAttr{colDefault, AttrUndefined}, + Prompt: ColorAttr{colDefault, AttrUndefined}, + Match: ColorAttr{colDefault, Underline}, + Current: ColorAttr{colDefault, Reverse}, + CurrentMatch: ColorAttr{colDefault, Reverse | Underline}, + Spinner: ColorAttr{colDefault, AttrUndefined}, + Info: ColorAttr{colDefault, AttrUndefined}, + Cursor: ColorAttr{colDefault, AttrUndefined}, + Selected: ColorAttr{colDefault, AttrUndefined}, + Header: ColorAttr{colDefault, AttrUndefined}, + Border: ColorAttr{colDefault, AttrUndefined}, + BorderLabel: ColorAttr{colDefault, AttrUndefined}, + Disabled: ColorAttr{colDefault, AttrUndefined}, + PreviewFg: ColorAttr{colDefault, AttrUndefined}, + PreviewBg: ColorAttr{colDefault, AttrUndefined}, + Gutter: ColorAttr{colDefault, AttrUndefined}, + PreviewBorder: ColorAttr{colDefault, AttrUndefined}, + PreviewScrollbar: ColorAttr{colDefault, AttrUndefined}, + PreviewLabel: ColorAttr{colDefault, AttrUndefined}, + Separator: ColorAttr{colDefault, AttrUndefined}, + Scrollbar: ColorAttr{colDefault, AttrUndefined}, } } @@ -568,79 +607,85 @@ func init() { Default16 = &ColorTheme{ - Colored: true, - Input: ColorAttr{colDefault, AttrUndefined}, - Fg: ColorAttr{colDefault, AttrUndefined}, - Bg: ColorAttr{colDefault, AttrUndefined}, - DarkBg: ColorAttr{colBlack, AttrUndefined}, - Prompt: ColorAttr{colBlue, AttrUndefined}, - Match: ColorAttr{colGreen, AttrUndefined}, - Current: ColorAttr{colYellow, AttrUndefined}, - CurrentMatch: ColorAttr{colGreen, AttrUndefined}, - Spinner: ColorAttr{colGreen, AttrUndefined}, - Info: ColorAttr{colWhite, AttrUndefined}, - Cursor: ColorAttr{colRed, AttrUndefined}, - Selected: ColorAttr{colMagenta, AttrUndefined}, - Header: ColorAttr{colCyan, AttrUndefined}, - Border: ColorAttr{colBlack, AttrUndefined}, - BorderLabel: ColorAttr{colWhite, AttrUndefined}, - Disabled: ColorAttr{colUndefined, AttrUndefined}, - PreviewFg: ColorAttr{colUndefined, AttrUndefined}, - PreviewBg: ColorAttr{colUndefined, AttrUndefined}, - Gutter: ColorAttr{colUndefined, AttrUndefined}, - PreviewLabel: ColorAttr{colUndefined, AttrUndefined}, - Separator: ColorAttr{colUndefined, AttrUndefined}, - Scrollbar: ColorAttr{colUndefined, AttrUndefined}, + Colored: true, + Input: ColorAttr{colDefault, AttrUndefined}, + Fg: ColorAttr{colDefault, AttrUndefined}, + Bg: ColorAttr{colDefault, AttrUndefined}, + DarkBg: ColorAttr{colBlack, AttrUndefined}, + Prompt: ColorAttr{colBlue, AttrUndefined}, + Match: ColorAttr{colGreen, AttrUndefined}, + Current: ColorAttr{colYellow, AttrUndefined}, + CurrentMatch: ColorAttr{colGreen, AttrUndefined}, + Spinner: ColorAttr{colGreen, AttrUndefined}, + Info: ColorAttr{colWhite, AttrUndefined}, + Cursor: ColorAttr{colRed, AttrUndefined}, + Selected: ColorAttr{colMagenta, AttrUndefined}, + Header: ColorAttr{colCyan, AttrUndefined}, + Border: ColorAttr{colBlack, AttrUndefined}, + BorderLabel: ColorAttr{colWhite, AttrUndefined}, + Disabled: ColorAttr{colUndefined, AttrUndefined}, + PreviewFg: ColorAttr{colUndefined, AttrUndefined}, + PreviewBg: ColorAttr{colUndefined, AttrUndefined}, + Gutter: ColorAttr{colUndefined, AttrUndefined}, + PreviewBorder: ColorAttr{colUndefined, AttrUndefined}, + PreviewScrollbar: ColorAttr{colUndefined, AttrUndefined}, + PreviewLabel: ColorAttr{colUndefined, AttrUndefined}, + Separator: ColorAttr{colUndefined, AttrUndefined}, + Scrollbar: ColorAttr{colUndefined, AttrUndefined}, } Dark256 = &ColorTheme{ - Colored: true, - Input: ColorAttr{colDefault, AttrUndefined}, - Fg: ColorAttr{colDefault, AttrUndefined}, - Bg: ColorAttr{colDefault, AttrUndefined}, - DarkBg: ColorAttr{236, AttrUndefined}, - Prompt: ColorAttr{110, AttrUndefined}, - Match: ColorAttr{108, AttrUndefined}, - Current: ColorAttr{254, AttrUndefined}, - CurrentMatch: ColorAttr{151, AttrUndefined}, - Spinner: ColorAttr{148, AttrUndefined}, - Info: ColorAttr{144, AttrUndefined}, - Cursor: ColorAttr{161, AttrUndefined}, - Selected: ColorAttr{168, AttrUndefined}, - Header: ColorAttr{109, AttrUndefined}, - Border: ColorAttr{59, AttrUndefined}, - BorderLabel: ColorAttr{145, AttrUndefined}, - Disabled: ColorAttr{colUndefined, AttrUndefined}, - PreviewFg: ColorAttr{colUndefined, AttrUndefined}, - PreviewBg: ColorAttr{colUndefined, AttrUndefined}, - Gutter: ColorAttr{colUndefined, AttrUndefined}, - PreviewLabel: ColorAttr{colUndefined, AttrUndefined}, - Separator: ColorAttr{colUndefined, AttrUndefined}, - Scrollbar: ColorAttr{colUndefined, AttrUndefined}, + Colored: true, + Input: ColorAttr{colDefault, AttrUndefined}, + Fg: ColorAttr{colDefault, AttrUndefined}, + Bg: ColorAttr{colDefault, AttrUndefined}, + DarkBg: ColorAttr{236, AttrUndefined}, + Prompt: ColorAttr{110, AttrUndefined}, + Match: ColorAttr{108, AttrUndefined}, + Current: ColorAttr{254, AttrUndefined}, + CurrentMatch: ColorAttr{151, AttrUndefined}, + Spinner: ColorAttr{148, AttrUndefined}, + Info: ColorAttr{144, AttrUndefined}, + Cursor: ColorAttr{161, AttrUndefined}, + Selected: ColorAttr{168, AttrUndefined}, + Header: ColorAttr{109, AttrUndefined}, + Border: ColorAttr{59, AttrUndefined}, + BorderLabel: ColorAttr{145, AttrUndefined}, + Disabled: ColorAttr{colUndefined, AttrUndefined}, + PreviewFg: ColorAttr{colUndefined, AttrUndefined}, + PreviewBg: ColorAttr{colUndefined, AttrUndefined}, + Gutter: ColorAttr{colUndefined, AttrUndefined}, + PreviewBorder: ColorAttr{colUndefined, AttrUndefined}, + PreviewScrollbar: ColorAttr{colUndefined, AttrUndefined}, + PreviewLabel: ColorAttr{colUndefined, AttrUndefined}, + Separator: ColorAttr{colUndefined, AttrUndefined}, + Scrollbar: ColorAttr{colUndefined, AttrUndefined}, } Light256 = &ColorTheme{ - Colored: true, - Input: ColorAttr{colDefault, AttrUndefined}, - Fg: ColorAttr{colDefault, AttrUndefined}, - Bg: ColorAttr{colDefault, AttrUndefined}, - DarkBg: ColorAttr{251, AttrUndefined}, - Prompt: ColorAttr{25, AttrUndefined}, - Match: ColorAttr{66, AttrUndefined}, - Current: ColorAttr{237, AttrUndefined}, - CurrentMatch: ColorAttr{23, AttrUndefined}, - Spinner: ColorAttr{65, AttrUndefined}, - Info: ColorAttr{101, AttrUndefined}, - Cursor: ColorAttr{161, AttrUndefined}, - Selected: ColorAttr{168, AttrUndefined}, - Header: ColorAttr{31, AttrUndefined}, - Border: ColorAttr{145, AttrUndefined}, - BorderLabel: ColorAttr{59, AttrUndefined}, - Disabled: ColorAttr{colUndefined, AttrUndefined}, - PreviewFg: ColorAttr{colUndefined, AttrUndefined}, - PreviewBg: ColorAttr{colUndefined, AttrUndefined}, - Gutter: ColorAttr{colUndefined, AttrUndefined}, - PreviewLabel: ColorAttr{colUndefined, AttrUndefined}, - Separator: ColorAttr{colUndefined, AttrUndefined}, - Scrollbar: ColorAttr{colUndefined, AttrUndefined}, + Colored: true, + Input: ColorAttr{colDefault, AttrUndefined}, + Fg: ColorAttr{colDefault, AttrUndefined}, + Bg: ColorAttr{colDefault, AttrUndefined}, + DarkBg: ColorAttr{251, AttrUndefined}, + Prompt: ColorAttr{25, AttrUndefined}, + Match: ColorAttr{66, AttrUndefined}, + Current: ColorAttr{237, AttrUndefined}, + CurrentMatch: ColorAttr{23, AttrUndefined}, + Spinner: ColorAttr{65, AttrUndefined}, + Info: ColorAttr{101, AttrUndefined}, + Cursor: ColorAttr{161, AttrUndefined}, + Selected: ColorAttr{168, AttrUndefined}, + Header: ColorAttr{31, AttrUndefined}, + Border: ColorAttr{145, AttrUndefined}, + BorderLabel: ColorAttr{59, AttrUndefined}, + Disabled: ColorAttr{colUndefined, AttrUndefined}, + PreviewFg: ColorAttr{colUndefined, AttrUndefined}, + PreviewBg: ColorAttr{colUndefined, AttrUndefined}, + Gutter: ColorAttr{colUndefined, AttrUndefined}, + PreviewBorder: ColorAttr{colUndefined, AttrUndefined}, + PreviewScrollbar: ColorAttr{colUndefined, AttrUndefined}, + PreviewLabel: ColorAttr{colUndefined, AttrUndefined}, + Separator: ColorAttr{colUndefined, AttrUndefined}, + Scrollbar: ColorAttr{colUndefined, AttrUndefined}, } } @@ -681,8 +726,10 @@ theme.PreviewFg = o(theme.Fg, theme.PreviewFg) theme.PreviewBg = o(theme.Bg, theme.PreviewBg) theme.PreviewLabel = o(theme.BorderLabel, theme.PreviewLabel) + theme.PreviewBorder = o(theme.Border, theme.PreviewBorder) theme.Separator = o(theme.Border, theme.Separator) theme.Scrollbar = o(theme.Border, theme.Scrollbar) + theme.PreviewScrollbar = o(theme.PreviewBorder, theme.PreviewScrollbar) initPalette(theme) } @@ -720,5 +767,6 @@ ColBorderLabel = pair(theme.BorderLabel, theme.Bg) ColPreviewLabel = pair(theme.PreviewLabel, theme.PreviewBg) ColPreview = pair(theme.PreviewFg, theme.PreviewBg) - ColPreviewBorder = pair(theme.Border, theme.PreviewBg) + ColPreviewBorder = pair(theme.PreviewBorder, theme.PreviewBg) + ColPreviewScrollbar = pair(theme.PreviewScrollbar, theme.PreviewBg) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fzf-0.40.0/test/test_go.rb new/fzf-0.41.0/test/test_go.rb --- old/fzf-0.40.0/test/test_go.rb 2023-04-30 18:59:21.000000000 +0200 +++ new/fzf-0.41.0/test/test_go.rb 2023-05-25 17:25:09.000000000 +0200 @@ -2493,6 +2493,39 @@ end end + def test_change_preview_window_rotate_hidden + tmux.send_keys "seq 100 | #{FZF} --preview-window hidden --preview 'echo =={}==' --bind '" \ + "a:change-preview-window(nohidden||down,1|)'", :Enter + tmux.until { |lines| assert_equal 100, lines.match_count } + tmux.until { |lines| refute_includes lines[1], '==1==' } + tmux.send_keys 'a' + tmux.until { |lines| assert_includes lines[1], '==1==' } + tmux.send_keys 'a' + tmux.until { |lines| refute_includes lines[1], '==1==' } + tmux.send_keys 'a' + tmux.until { |lines| assert_includes lines[-2], '==1==' } + tmux.send_keys 'a' + tmux.until { |lines| refute_includes lines[-2], '==1==' } + tmux.send_keys 'a' + tmux.until { |lines| assert_includes lines[1], '==1==' } + end + + def test_change_preview_window_rotate_hidden_down + tmux.send_keys "seq 100 | #{FZF} --bind '?:change-preview-window:up||down|' --preview 'echo =={}==' --preview-window hidden,down,1", :Enter + tmux.until { |lines| assert_equal 100, lines.match_count } + tmux.until { |lines| refute_includes lines[1], '==1==' } + tmux.send_keys '?' + tmux.until { |lines| assert_includes lines[1], '==1==' } + tmux.send_keys '?' + tmux.until { |lines| refute_includes lines[1], '==1==' } + tmux.send_keys '?' + tmux.until { |lines| assert_includes lines[-2], '==1==' } + tmux.send_keys '?' + tmux.until { |lines| refute_includes lines[-2], '==1==' } + tmux.send_keys '?' + tmux.until { |lines| assert_includes lines[1], '==1==' } + end + def test_ellipsis tmux.send_keys 'seq 1000 | tr "\n" , | fzf --ellipsis=SNIPSNIP -e -q500', :Enter tmux.until { |lines| assert_equal 1, lines.match_count } @@ -2595,12 +2628,16 @@ end def test_focus_event - tmux.send_keys 'seq 100 | fzf --bind "focus:transform-prompt(echo [[{}]])"', :Enter + tmux.send_keys 'seq 100 | fzf --bind "focus:transform-prompt(echo [[{}]]),?:unbind(focus)"', :Enter tmux.until { |lines| assert_includes(lines[-1], '[[1]]') } tmux.send_keys :Up tmux.until { |lines| assert_includes(lines[-1], '[[2]]') } tmux.send_keys :X tmux.until { |lines| assert_includes(lines[-1], '[[]]') } + tmux.send_keys '?' + tmux.send_keys :BSpace + tmux.until { |lines| assert_equal 100, lines.match_count } + tmux.until { |lines| refute_includes(lines[-1], '[[1]]') } end def test_labels_center @@ -2866,6 +2903,38 @@ tmux.send_keys "(echo foo; echo bar) | #{FZF} --bind 'load:reload-sync(sleep 60)+change-query(bar)'", :Enter tmux.until { |lines| assert_equal 1, lines.match_count } end + + def test_reload_and_change_cache + tmux.send_keys "echo bar | #{FZF} --bind 'zero:change-header(foo)+reload(echo foo)+clear-query'", :Enter + expected = <<~OUTPUT + > bar + 1/1 + > + OUTPUT + tmux.until { assert_block(expected, _1) } + tmux.send_keys :z + expected = <<~OUTPUT + > foo + foo + 1/1 + > + OUTPUT + tmux.until { assert_block(expected, _1) } + end + + def test_delete_with_modifiers + tmux.send_keys "seq 100 | #{FZF} --bind 'ctrl-delete:up+up,shift-delete:down,focus:transform-prompt:echo [{}]'", :Enter + tmux.until { |lines| assert_equal 100, lines.item_count } + tmux.send_keys 'C-Delete' + tmux.until { |lines| assert_equal '[3]', lines[-1] } + tmux.send_keys 'S-Delete' + tmux.until { |lines| assert_equal '[2]', lines[-1] } + end + + def test_become_tty + tmux.send_keys "sleep 0.5 | #{FZF} --bind 'start:reload:ls' --bind 'load:become:tty'", :Enter + tmux.until { |lines| assert_includes lines, '/dev/tty' } + end end module TestShell ++++++ vendor.tar.zst ++++++ Binary files /var/tmp/diff_new_pack.b3IINq/_old and /var/tmp/diff_new_pack.b3IINq/_new differ