Merge pull request #359 from boombuler/params

Params
This commit is contained in:
Zachary Yedidia
2016-09-14 17:14:01 -04:00
committed by GitHub
3 changed files with 49 additions and 19 deletions

View File

@@ -18,12 +18,14 @@ var pluginCompletions []func(string) []string
func FileComplete(input string) (string, []string) {
var sep string = string(os.PathSeparator)
dirs := strings.Split(input, sep)
var files []os.FileInfo
var err error
if len(dirs) > 1 {
home, _ := homedir.Dir()
directories := strings.Join(dirs[:len(dirs)-1], sep)
directories := strings.Join(dirs[:len(dirs)-1], sep) + sep
if strings.HasPrefix(directories, "~") {
directories = strings.Replace(directories, "~", home, 1)
}
@@ -31,6 +33,7 @@ func FileComplete(input string) (string, []string) {
} else {
files, err = ioutil.ReadDir(".")
}
var suggestions []string
if err != nil {
return "", suggestions

View File

@@ -230,42 +230,64 @@ func FuncName(i interface{}) string {
// The returned slice contains at least one string
func SplitCommandArgs(input string) []string {
var result []string
var curQuote *bytes.Buffer = nil
curArg := new(bytes.Buffer)
inQuote := false
escape := false
appendResult := func() {
str := curArg.String()
inQuote = false
escape = false
if strings.HasPrefix(str, `"`) && strings.HasSuffix(str, `"`) {
finishQuote := func() {
if curQuote == nil {
return
}
str := curQuote.String()
if unquoted, err := strconv.Unquote(str); err == nil {
str = unquoted
}
curArg.WriteString(str)
curQuote = nil
}
appendResult := func() {
finishQuote()
escape = false
str := curArg.String()
result = append(result, str)
curArg.Reset()
}
for _, r := range input {
if r == ' ' && !inQuote {
if r == ' ' && curQuote == nil {
appendResult()
} else {
curArg.WriteRune(r)
if r == '"' && !inQuote {
inQuote = true
runeHandled := false
appendRuneToBuff := func() {
if curQuote != nil {
curQuote.WriteRune(r)
} else {
if inQuote && !escape {
if r == '"' {
inQuote = false
curArg.WriteRune(r)
}
if r == '\\' {
runeHandled = true
}
if r == '"' && curQuote == nil {
curQuote = new(bytes.Buffer)
appendRuneToBuff()
} else {
if curQuote != nil && !escape {
if r == '"' {
appendRuneToBuff()
finishQuote()
} else if r == '\\' {
appendRuneToBuff()
escape = true
continue
}
}
}
if !runeHandled {
appendRuneToBuff()
}
}
escape = false

View File

@@ -100,9 +100,14 @@ func TestJoinAndSplitCommandArgs(t *testing.T) {
Query string
Wanted []string
}{
{`"hallo""Welt"`, []string{`"hallo""Welt"`}},
{`"hallo""Welt"`, []string{`halloWelt`}},
{`"hallo" "Welt"`, []string{`hallo`, `Welt`}},
{`\"`, []string{`\"`}},
{`"foo`, []string{`"foo`}},
{`"foo"`, []string{`foo`}},
{`"\"`, []string{`"\"`}},
{`"C:\\"foo.txt`, []string{`C:\foo.txt`}},
{`"\n"new"\n"line`, []string{"\nnew\nline"}},
}
for i, test := range splitTests {