More alternative notations for execute action

execute(...)
    execute[...]
    execute~...~
    execute!...!
    execute@...@
    execute#...#
    execute$...$
    execute%...%
    execute^...^
    execute&...&
    execute*...*
    execute:...:
    execute;...;
    execute/.../
    execute|...|
This commit is contained in:
Junegunn Choi 2015-06-14 23:36:49 +09:00
parent 6c99cc1700
commit 022435a90a
2 changed files with 17 additions and 4 deletions

View File

@ -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
}

View File

@ -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")