From fee404399adcebc0c6253e2ef4dc95871f81c806 Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sun, 27 Aug 2017 02:19:39 +0900 Subject: [PATCH] Make --expect additive Similarly to --bind or --color. --expect used to replace the previously specified keys, and fzf#wrap({'options': '--expect=f1'}) wouldn't work as expected. It forced us to come up with some ugly hacks like the following: https://github.com/junegunn/fzf.vim/blob/13b27c45c8bdf6c3a41376bb83e4895edadf8c7e/autoload/fzf/vim.vim#L1086 --- man/man1/fzf.1 | 6 ++++-- src/options.go | 8 ++++++-- src/options_test.go | 7 +++++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/man/man1/fzf.1 b/man/man1/fzf.1 index 2b32d38..ee64375 100644 --- a/man/man1/fzf.1 +++ b/man/man1/fzf.1 @@ -331,10 +331,12 @@ Comma-separated list of keys that can be used to complete fzf in addition to the default enter key. When this option is set, fzf will print the name of the key pressed as the first line of its output (or as the second line if \fB--print-query\fR is also used). The line will be empty if fzf is completed -with the default enter key. +with the default enter key. If \fB--expect\fR option is specified multiple +times, fzf will expect the union of the keys. \fB--no-expect\fR will clear the +list. .RS -e.g. \fBfzf --expect=ctrl-v,ctrl-t,alt-s,f1,f2,~,@\fR +e.g. \fBfzf --expect=ctrl-v,ctrl-t,alt-s --expect=f1,f2,~,@\fR .RE .TP .B "--read0" diff --git a/src/options.go b/src/options.go index afd46b9..e2f33f8 100644 --- a/src/options.go +++ b/src/options.go @@ -962,7 +962,9 @@ func parseOptions(opts *Options, allArgs []string) { case "--algo": opts.FuzzyAlgo = parseAlgo(nextString(allArgs, &i, "algorithm required (v1|v2)")) case "--expect": - opts.Expect = parseKeyChords(nextString(allArgs, &i, "key names required"), "key names required") + for k, v := range parseKeyChords(nextString(allArgs, &i, "key names required"), "key names required") { + opts.Expect[k] = v + } case "--no-expect": opts.Expect = make(map[int]string) case "--tiebreak": @@ -1140,7 +1142,9 @@ func parseOptions(opts *Options, allArgs []string) { } else if match, value := optString(arg, "--toggle-sort="); match { parseToggleSort(opts.Keymap, value) } else if match, value := optString(arg, "--expect="); match { - opts.Expect = parseKeyChords(value, "key names required") + for k, v := range parseKeyChords(value, "key names required") { + opts.Expect[k] = v + } } else if match, value := optString(arg, "--tiebreak="); match { opts.Criteria = parseTiebreak(value) } else if match, value := optString(arg, "--color="); match { diff --git a/src/options_test.go b/src/options_test.go index d3c9345..22f4e4e 100644 --- a/src/options_test.go +++ b/src/options_test.go @@ -414,3 +414,10 @@ func TestPreviewOpts(t *testing.T) { t.Error(opts.Preview) } } + +func TestAdditiveExpect(t *testing.T) { + opts := optsFor("--expect=a", "--expect", "b", "--expect=c") + if len(opts.Expect) != 3 { + t.Error(opts.Expect) + } +}