mirror of https://github.com/Hilbis/Hilbish
60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"path/filepath"
|
|
"strings"
|
|
"os"
|
|
)
|
|
|
|
func fileComplete(query, ctx string, fields []string) []string {
|
|
var completions []string
|
|
|
|
prefixes := []string{"./", "../", "/", "~/"}
|
|
for _, prefix := range prefixes {
|
|
if strings.HasPrefix(query, prefix) {
|
|
completions, _ = matchPath(strings.Replace(query, "~", curuser.HomeDir, 1), query)
|
|
}
|
|
}
|
|
|
|
if len(completions) == 0 && len(fields) > 1 {
|
|
completions, _ = matchPath("./" + query, query)
|
|
}
|
|
|
|
return completions
|
|
}
|
|
|
|
func matchPath(path, pref string) ([]string, error) {
|
|
var entries []string
|
|
matches, err := filepath.Glob(path + "*")
|
|
if err == nil {
|
|
args := []string{
|
|
"\"", "\\\"",
|
|
"'", "\\'",
|
|
"`", "\\`",
|
|
" ", "\\ ",
|
|
"(", "\\(",
|
|
")", "\\)",
|
|
"[", "\\[",
|
|
"]", "\\]",
|
|
}
|
|
|
|
r := strings.NewReplacer(args...)
|
|
for _, match := range matches {
|
|
name := filepath.Base(match)
|
|
p := filepath.Base(pref)
|
|
if pref == "" {
|
|
p = ""
|
|
}
|
|
name = strings.TrimPrefix(name, p)
|
|
matchFull, _ := filepath.Abs(match)
|
|
if info, err := os.Stat(matchFull); err == nil && info.IsDir() {
|
|
name = name + string(os.PathSeparator)
|
|
}
|
|
name = r.Replace(name)
|
|
entries = append(entries, name)
|
|
}
|
|
}
|
|
|
|
return entries, err
|
|
}
|