From 022435a90a64a4a20cc09d55c4f0c23435a8c0fe Mon Sep 17 00:00:00 2001 From: Junegunn Choi Date: Sun, 14 Jun 2015 23:36:49 +0900 Subject: [PATCH] More alternative notations for execute action execute(...) execute[...] execute~...~ execute!...! execute@...@ execute#...# execute$...$ execute%...% execute^...^ execute&...& execute*...* execute:...: execute;...; execute/.../ execute|...| --- src/options.go | 14 ++++++++++---- src/options_test.go | 7 +++++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/options.go b/src/options.go index 948857c..fbeb9e4 100644 --- a/src/options.go +++ b/src/options.go @@ -377,10 +377,16 @@ func parseTheme(defaultTheme *curses.ColorTheme, str string) *curses.ColorTheme return theme } +var executeRegexp *regexp.Regexp + func parseKeymap(keymap map[int]actionType, execmap map[int]string, toggleSort bool, str string) (map[int]actionType, map[int]string, bool) { - rx := regexp.MustCompile( - ":execute(\\([^)]*\\)|\\[[^\\]]*\\]|/[^/]*/|:[^:]*:|;[^;]*;|@[^@]*@|~[^~]*~|%[^%]*%|\\?[^?]*\\?)") - masked := rx.ReplaceAllStringFunc(str, func(src string) string { + if executeRegexp == nil { + // Backreferences are not supported. + // "~!@#$%^&*:;/|".each_char.map { |c| Regexp.escape(c) }.map { |c| "#{c}[^#{c}]*#{c}" }.join('|') + executeRegexp = regexp.MustCompile( + ":execute(\\([^)]*\\)|\\[[^\\]]*\\]|~[^~]*~|![^!]*!|@[^@]*@|\\#[^\\#]*\\#|\\$[^\\$]*\\$|%[^%]*%|\\^[^\\^]*\\^|&[^&]*&|\\*[^\\*]*\\*|:[^:]*:|;[^;]*;|/[^/]*/|\\|[^\\|]*\\|)") + } + masked := executeRegexp.ReplaceAllStringFunc(str, func(src string) string { return ":execute(" + strings.Repeat(" ", len(src)-10) + ")" }) @@ -484,7 +490,7 @@ func isExecuteAction(str string) bool { } b := str[7] e := str[len(str)-1] - if b == e && strings.ContainsAny(string(b), "/:;@~%?") || + if b == e && strings.ContainsAny(string(b), "~!@#$%^&*:;/|") || b == '(' && e == ')' || b == '[' && e == ']' { return true } diff --git a/src/options_test.go b/src/options_test.go index 91e3754..297acbf 100644 --- a/src/options_test.go +++ b/src/options_test.go @@ -1,6 +1,7 @@ package fzf import ( + "fmt" "testing" "github.com/junegunn/fzf/src/curses" @@ -167,6 +168,12 @@ func TestBind(t *testing.T) { checkString("echo (,),[,],/,:,;,%,{}", execmap[curses.AltA]) checkString("echo (,),[,],/,:,@,%,{}", execmap[curses.AltB]) + for idx, char := range []rune{'~', '!', '@', '#', '$', '%', '^', '&', '*', '|', ':', ';', '/'} { + keymap, execmap, toggleSort = + parseKeymap(keymap, execmap, false, fmt.Sprintf("%d:execute%cfoobar%c", idx%10, char, char)) + checkString("foobar", execmap[curses.AltZ+int([]rune(fmt.Sprintf("%d", idx%10))[0])]) + } + keymap, execmap, toggleSort = parseKeymap(keymap, execmap, false, "f1:abort") if toggleSort { t.Errorf("toggleSort set")