v complete: add better support for tool flag completion (#6894)
parent
9673d40bb9
commit
de0cfdd323
|
@ -27,7 +27,7 @@ module main
|
||||||
import os
|
import os
|
||||||
|
|
||||||
const (
|
const (
|
||||||
auto_complete_shells = ['bash', 'fish', 'zsh', 'powershell']
|
auto_complete_shells = ['bash', 'fish', 'zsh', 'powershell'] // list of supported shells
|
||||||
)
|
)
|
||||||
|
|
||||||
// Snooped from cmd/v/v.v, vlib/v/pref/pref.v
|
// Snooped from cmd/v/v.v, vlib/v/pref/pref.v
|
||||||
|
@ -132,6 +132,45 @@ const (
|
||||||
'-version',
|
'-version',
|
||||||
'--version',
|
'--version',
|
||||||
]
|
]
|
||||||
|
auto_complete_flags_doc = [
|
||||||
|
'-all',
|
||||||
|
'-f',
|
||||||
|
'-h',
|
||||||
|
'-help',
|
||||||
|
'-m',
|
||||||
|
'-o',
|
||||||
|
'-readme',
|
||||||
|
'-v',
|
||||||
|
'-filename',
|
||||||
|
'-pos',
|
||||||
|
'-no-timestamp',
|
||||||
|
'-inline-assets',
|
||||||
|
'-open',
|
||||||
|
'-p',
|
||||||
|
'-s',
|
||||||
|
'-l',
|
||||||
|
]
|
||||||
|
auto_complete_flags_fmt = [
|
||||||
|
'-c',
|
||||||
|
'-diff',
|
||||||
|
'-l',
|
||||||
|
'-w',
|
||||||
|
'-debug',
|
||||||
|
'-verify',
|
||||||
|
]
|
||||||
|
auto_complete_flags_bin2v = [
|
||||||
|
'-h',
|
||||||
|
'--help',
|
||||||
|
'-m',
|
||||||
|
'--module',
|
||||||
|
'-p',
|
||||||
|
'--prefix',
|
||||||
|
'-w',
|
||||||
|
'--write',
|
||||||
|
]
|
||||||
|
auto_complete_flags_self = [
|
||||||
|
'-prod',
|
||||||
|
]
|
||||||
auto_complete_compilers = [
|
auto_complete_compilers = [
|
||||||
'cc',
|
'cc',
|
||||||
'gcc',
|
'gcc',
|
||||||
|
@ -206,7 +245,7 @@ complete -o nospace -F _v_completions v
|
||||||
|
|
||||||
fn auto_complete_request(args []string) []string {
|
fn auto_complete_request(args []string) []string {
|
||||||
// Using space will ensure a uniform input in cases where the shell
|
// Using space will ensure a uniform input in cases where the shell
|
||||||
// returns the completion input as a string
|
// returns the completion input as a string (['v','run'] vs. ['v run']).
|
||||||
split_by := ' '
|
split_by := ' '
|
||||||
request := args.join(split_by)
|
request := args.join(split_by)
|
||||||
mut list := []string{}
|
mut list := []string{}
|
||||||
|
@ -218,7 +257,37 @@ fn auto_complete_request(args []string) []string {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
part := parts.last().trim(' ')
|
part := parts.last().trim(' ')
|
||||||
|
mut parent_command := ''
|
||||||
|
for i := parts.len - 1; i >= 0; i-- {
|
||||||
|
if parts[i].starts_with('-') {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
parent_command = parts[i]
|
||||||
|
break
|
||||||
|
}
|
||||||
|
get_flags := fn (base []string, flag string) []string {
|
||||||
|
if flag.len == 1 { return base
|
||||||
|
} else { return base.filter(it.starts_with(flag))
|
||||||
|
}
|
||||||
|
}
|
||||||
if part.starts_with('-') { // 'v -<tab>' -> flags.
|
if part.starts_with('-') { // 'v -<tab>' -> flags.
|
||||||
|
match parent_command {
|
||||||
|
'bin2v' { // 'v bin2v -<tab>'
|
||||||
|
list = get_flags(auto_complete_flags_bin2v, part)
|
||||||
|
}
|
||||||
|
'build' { // 'v build -<tab>' -> flags.
|
||||||
|
list = get_flags(auto_complete_flags, part)
|
||||||
|
}
|
||||||
|
'doc' { // 'v doc -<tab>' -> flags.
|
||||||
|
list = get_flags(auto_complete_flags_doc, part)
|
||||||
|
}
|
||||||
|
'fmt' { // 'v fmt -<tab>' -> flags.
|
||||||
|
list = get_flags(auto_complete_flags_fmt, part)
|
||||||
|
}
|
||||||
|
'self' { // 'v self -<tab>' -> flags.
|
||||||
|
list = get_flags(auto_complete_flags_self, part)
|
||||||
|
}
|
||||||
|
else {
|
||||||
for flag in auto_complete_flags {
|
for flag in auto_complete_flags {
|
||||||
if flag == part {
|
if flag == part {
|
||||||
if flag == '-cc' { // 'v -cc <tab>' -> list of available compilers.
|
if flag == '-cc' { // 'v -cc <tab>' -> list of available compilers.
|
||||||
|
@ -235,12 +304,14 @@ fn auto_complete_request(args []string) []string {
|
||||||
list << flag
|
list << flag
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if part == 'help' { // 'v help <tab>' -> top level commands except "help".
|
match part {
|
||||||
list = auto_complete_commands.filter(it != part).filter(it != 'complete')
|
'help' { // 'v help <tab>' -> top level commands except "help".
|
||||||
} else if part == 'build' { // 'v build <tab>' -> all flags.
|
list = auto_complete_commands.filter(it != part && it != 'complete')
|
||||||
list = auto_complete_flags
|
}
|
||||||
} else {
|
else {
|
||||||
// 'v <char(s)><tab>' -> commands matching "<char(s)>".
|
// 'v <char(s)><tab>' -> commands matching "<char(s)>".
|
||||||
// Don't include if part matches a full command - instead go to path completion below.
|
// Don't include if part matches a full command - instead go to path completion below.
|
||||||
for command in auto_complete_commands {
|
for command in auto_complete_commands {
|
||||||
|
@ -250,6 +321,7 @@ fn auto_complete_request(args []string) []string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// Nothing of value was found.
|
// Nothing of value was found.
|
||||||
// Mimic shell dir and file completion
|
// Mimic shell dir and file completion
|
||||||
if list.len == 0 {
|
if list.len == 0 {
|
||||||
|
@ -297,6 +369,6 @@ fn auto_complete_request(args []string) []string {
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
args := os.args[1..]
|
args := os.args[1..]
|
||||||
//println('"$args"')
|
// println('"$args"')
|
||||||
auto_complete(args)
|
auto_complete(args)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue