diff --git a/src/options.go b/src/options.go index 2bd013d0..25a87ac7 100644 --- a/src/options.go +++ b/src/options.go @@ -412,7 +412,7 @@ func parseKeymap(keymap map[int]actionType, execmap map[int]string, toggleSort b // Backreferences are not supported. // "~!@#$%^&*:;/|".each_char.map { |c| Regexp.escape(c) }.map { |c| "#{c}[^#{c}]*#{c}" }.join('|') executeRegexp = regexp.MustCompile( - ":execute(\\([^)]*\\)|\\[[^\\]]*\\]|~[^~]*~|![^!]*!|@[^@]*@|\\#[^\\#]*\\#|\\$[^\\$]*\\$|%[^%]*%|\\^[^\\^]*\\^|&[^&]*&|\\*[^\\*]*\\*|:[^:]*:|;[^;]*;|/[^/]*/|\\|[^\\|]*\\|)") + ":execute=.*|:execute(\\([^)]*\\)|\\[[^\\]]*\\]|~[^~]*~|![^!]*!|@[^@]*@|\\#[^\\#]*\\#|\\$[^\\$]*\\$|%[^%]*%|\\^[^\\^]*\\^|&[^&]*&|\\*[^\\*]*\\*|:[^:]*:|;[^;]*;|/[^/]*/|\\|[^\\|]*\\|)") } masked := executeRegexp.ReplaceAllStringFunc(str, func(src string) string { return ":execute(" + strings.Repeat(" ", len(src)-10) + ")" @@ -503,7 +503,11 @@ func parseKeymap(keymap map[int]actionType, execmap map[int]string, toggleSort b default: if isExecuteAction(act) { keymap[key] = actExecute - execmap[key] = pair[1][8 : len(act)-1] + if pair[1][7] == '=' { + execmap[key] = pair[1][8:] + } else { + execmap[key] = pair[1][8 : len(act)-1] + } } else { errorExit("unknown action: " + act) } @@ -518,8 +522,8 @@ func isExecuteAction(str string) bool { } b := str[7] e := str[len(str)-1] - if b == e && strings.ContainsAny(string(b), "~!@#$%^&*:;/|") || - b == '(' && e == ')' || b == '[' && e == ']' { + if b == '=' || b == '(' && e == ')' || b == '[' && e == ']' || + b == e && strings.ContainsAny(string(b), "~!@#$%^&*:;/|") { return true } return false diff --git a/src/options_test.go b/src/options_test.go index 630bde3b..162b8e48 100644 --- a/src/options_test.go +++ b/src/options_test.go @@ -163,7 +163,8 @@ func TestBind(t *testing.T) { parseKeymap(keymap, execmap, false, "ctrl-a:kill-line,ctrl-b:toggle-sort,c:page-up,alt-z:page-down,"+ "f1:execute(ls {}),f2:execute/echo {}, {}, {}/,f3:execute[echo '({})'],f4:execute:less {}:,"+ - "alt-a:execute@echo (,),[,],/,:,;,%,{}@,alt-b:execute;echo (,),[,],/,:,@,%,{};") + "alt-a:execute@echo (,),[,],/,:,;,%,{}@,alt-b:execute;echo (,),[,],/,:,@,%,{};"+ + ",X:execute=foobar,Y:execute(baz)") if !toggleSort { t.Errorf("toggleSort not set") } @@ -181,6 +182,7 @@ func TestBind(t *testing.T) { checkString("less {}", execmap[curses.F4]) checkString("echo (,),[,],/,:,;,%,{}", execmap[curses.AltA]) checkString("echo (,),[,],/,:,@,%,{}", execmap[curses.AltB]) + checkString("foobar,Y:execute(baz)", execmap[curses.AltZ+'X']) for idx, char := range []rune{'~', '!', '@', '#', '$', '%', '^', '&', '*', '|', ':', ';', '/'} { keymap, execmap, toggleSort =