mirror of
https://github.com/zyedidia/micro.git
synced 2025-06-18 14:55:38 -04:00
ignore quoted and escaped characters when splitting keybindings into actions (#3612)
Some checks failed
Build and Test / test (1.19.x, macos-latest) (push) Has been cancelled
Build and Test / test (1.19.x, ubuntu-latest) (push) Has been cancelled
Build and Test / test (1.19.x, windows-latest) (push) Has been cancelled
Build and Test / test (1.23.x, macos-latest) (push) Has been cancelled
Build and Test / test (1.23.x, ubuntu-latest) (push) Has been cancelled
Build and Test / test (1.23.x, windows-latest) (push) Has been cancelled
Some checks failed
Build and Test / test (1.19.x, macos-latest) (push) Has been cancelled
Build and Test / test (1.19.x, ubuntu-latest) (push) Has been cancelled
Build and Test / test (1.19.x, windows-latest) (push) Has been cancelled
Build and Test / test (1.23.x, macos-latest) (push) Has been cancelled
Build and Test / test (1.23.x, ubuntu-latest) (push) Has been cancelled
Build and Test / test (1.23.x, windows-latest) (push) Has been cancelled
This commit is contained in:
parent
9b3f7ff240
commit
f5debdf8fe
@ -100,9 +100,7 @@ func BufMapEvent(k Event, action string) {
|
||||
break
|
||||
}
|
||||
|
||||
// TODO: fix problem when complex bindings have these
|
||||
// characters (escape them?)
|
||||
idx := strings.IndexAny(action, "&|,")
|
||||
idx := util.IndexAnyUnquoted(action, "&|,")
|
||||
a := action
|
||||
if idx >= 0 {
|
||||
a = action[:idx]
|
||||
|
@ -320,6 +320,28 @@ func RunePos(b []byte, i int) int {
|
||||
return CharacterCount(b[:i])
|
||||
}
|
||||
|
||||
// IndexAnyUnquoted returns the first position in s of a character from chars.
|
||||
// Escaped (with backslash) and quoted (with single or double quotes) characters
|
||||
// are ignored. Returns -1 if not successful
|
||||
func IndexAnyUnquoted(s, chars string) int {
|
||||
var e bool
|
||||
var q rune
|
||||
for i, r := range s {
|
||||
if e {
|
||||
e = false
|
||||
} else if (q == 0 || q == '"') && r == '\\' {
|
||||
e = true
|
||||
} else if r == q {
|
||||
q = 0
|
||||
} else if q == 0 && (r == '\'' || r == '"') {
|
||||
q = r
|
||||
} else if q == 0 && strings.IndexRune(chars, r) >= 0 {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
// MakeRelative will attempt to make a relative path between path and base
|
||||
func MakeRelative(path, base string) (string, error) {
|
||||
if len(path) > 0 {
|
||||
|
@ -66,7 +66,9 @@ bindings, tab is bound as
|
||||
|
||||
This means that if the `Autocomplete` action is successful, the chain will
|
||||
abort. Otherwise, it will try `IndentSelection`, and if that fails too, it
|
||||
will execute `InsertTab`.
|
||||
will execute `InsertTab`. To use `,`, `|` or `&` in an action (as an argument
|
||||
to a command, for example), escape it with `\` or wrap it in single or double
|
||||
quotes.
|
||||
|
||||
## Binding commands
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user