basic shell completion for single match
This commit is contained in:
parent
656a9c837a
commit
98839a42f2
56
comp.go
56
comp.go
@ -42,6 +42,37 @@ func matchWord(s string, words []string) string {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func matchExec(s string) string {
|
||||||
|
var match string
|
||||||
|
|
||||||
|
paths := strings.Split(envPath, ":")
|
||||||
|
|
||||||
|
for _, p := range paths {
|
||||||
|
fi, err := ioutil.ReadDir(p)
|
||||||
|
if err != nil {
|
||||||
|
log.Print(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, f := range fi {
|
||||||
|
if strings.HasPrefix(f.Name(), s) {
|
||||||
|
if !f.Mode().IsRegular() || f.Mode()&0111 == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if match != "" {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
match = f.Name()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if match != "" {
|
||||||
|
return match + " "
|
||||||
|
}
|
||||||
|
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
func matchFile(s string) string {
|
func matchFile(s string) string {
|
||||||
var match string
|
var match string
|
||||||
|
|
||||||
@ -109,3 +140,28 @@ func compCmd(acc []rune) []rune {
|
|||||||
|
|
||||||
return acc
|
return acc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func compShell(acc []rune) []rune {
|
||||||
|
if len(acc) == 0 || acc[len(acc)-1] == ' ' {
|
||||||
|
return acc
|
||||||
|
}
|
||||||
|
|
||||||
|
s := string(acc)
|
||||||
|
f := strings.Fields(s)
|
||||||
|
|
||||||
|
switch len(f) {
|
||||||
|
case 0: // do nothing
|
||||||
|
case 1:
|
||||||
|
return []rune(matchExec(s))
|
||||||
|
default:
|
||||||
|
ret := []rune(f[0])
|
||||||
|
ret = append(ret, ' ')
|
||||||
|
for i := 1; i < len(f); i++ {
|
||||||
|
name := matchFile(f[i])
|
||||||
|
ret = append(ret, []rune(name)...)
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}
|
||||||
|
1
main.go
1
main.go
@ -13,6 +13,7 @@ var (
|
|||||||
envUser = os.Getenv("USER")
|
envUser = os.Getenv("USER")
|
||||||
envHome = os.Getenv("HOME")
|
envHome = os.Getenv("HOME")
|
||||||
envHost = os.Getenv("HOSTNAME")
|
envHost = os.Getenv("HOSTNAME")
|
||||||
|
envPath = os.Getenv("PATH")
|
||||||
envShell = os.Getenv("SHELL")
|
envShell = os.Getenv("SHELL")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
4
ui.go
4
ui.go
@ -446,7 +446,11 @@ func (ui *UI) prompt(pref string) string {
|
|||||||
termbox.Flush()
|
termbox.Flush()
|
||||||
return string(acc)
|
return string(acc)
|
||||||
case termbox.KeyTab:
|
case termbox.KeyTab:
|
||||||
|
if pref == ":" {
|
||||||
acc = compCmd(acc)
|
acc = compCmd(acc)
|
||||||
|
} else {
|
||||||
|
acc = compShell(acc)
|
||||||
|
}
|
||||||
case termbox.KeyEsc:
|
case termbox.KeyEsc:
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user