summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2015-06-14 23:36:49 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2015-06-14 23:36:49 +0900
commit022435a90a64a4a20cc09d55c4f0c23435a8c0fe (patch)
treea7ae11681c20d61e49dc7be214ed55fb99f23d4d
parent6c99cc1700fda0c04500ee03b7e5f3ca22c7710c (diff)
More alternative notations for execute action
execute(...) execute[...] execute~...~ execute!...! execute@...@ execute#...# execute$...$ execute%...% execute^...^ execute&...& execute*...* execute:...: execute;...; execute/.../ execute|...|
-rw-r--r--src/options.go14
-rw-r--r--src/options_test.go7
2 files changed, 17 insertions, 4 deletions
diff --git a/src/options.go b/src/options.go
index 948857c2..fbeb9e40 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 91e3754b..297acbfd 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")