v complete: add better support for tool flag completion (#6894)

pull/6893/head^2
Larpon 2020-11-20 19:50:01 +01:00 committed by GitHub
parent 9673d40bb9
commit de0cfdd323
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 99 additions and 27 deletions

View File

@ -27,12 +27,12 @@ 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
const ( const (
auto_complete_commands = [ auto_complete_commands = [
/* simple_cmd */ /* simple_cmd */
'fmt', 'fmt',
'up', 'up',
@ -75,7 +75,7 @@ const (
'build', 'build',
'build-module', 'build-module',
] ]
auto_complete_flags = [ auto_complete_flags = [
'-apk', '-apk',
'-show-timings', '-show-timings',
'-check-syntax', '-check-syntax',
@ -132,7 +132,46 @@ const (
'-version', '-version',
'--version', '--version',
] ]
auto_complete_compilers = [ 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 = [
'cc', 'cc',
'gcc', 'gcc',
'tcc', 'tcc',
@ -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,34 +257,67 @@ 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.
for flag in auto_complete_flags { match parent_command {
if flag == part { 'bin2v' { // 'v bin2v -<tab>'
if flag == '-cc' { // 'v -cc <tab>' -> list of available compilers. list = get_flags(auto_complete_flags_bin2v, part)
for compiler in auto_complete_compilers { }
path := os.find_abs_path_of_executable(compiler) or { 'build' { // 'v build -<tab>' -> flags.
'' list = get_flags(auto_complete_flags, part)
} }
if path != '' { 'doc' { // 'v doc -<tab>' -> flags.
list << compiler 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 {
if flag == part {
if flag == '-cc' { // 'v -cc <tab>' -> list of available compilers.
for compiler in auto_complete_compilers {
path := os.find_abs_path_of_executable(compiler) or {
''
}
if path != '' {
list << compiler
}
}
} }
} else if flag.starts_with(part) { // 'v -<char(s)><tab>' -> flags matching "<char(s)>".
list << flag
} }
} }
} else if flag.starts_with(part) { // 'v -<char(s)><tab>' -> flags matching "<char(s)>".
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 {
if part != command && command.starts_with(part) { if part != command && command.starts_with(part) {
list << command list << command
}
} }
} }
} }
@ -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)
} }