vcomplete: append path separator to results if they're directories (#7426)

pull/7448/head
Larpon 2020-12-21 06:03:33 +01:00 committed by GitHub
parent f0391f7a8f
commit 25dd983d97
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 18 additions and 9 deletions

View File

@ -192,6 +192,8 @@ const (
] ]
) )
// auto_complete prints auto completion results back to the calling shell's completion system.
// auto_complete acts as communication bridge between the calling shell and V's completions.
fn auto_complete(args []string) { fn auto_complete(args []string) {
if args.len <= 1 || args[0] != 'complete' { if args.len <= 1 || args[0] != 'complete' {
if args.len == 1 { if args.len == 1 {
@ -291,6 +293,17 @@ compdef _v v
exit(0) exit(0)
} }
// append_separator_if_dir is a utility function.that returns the input `path` appended an
// OS dependant path separator if the `path` is a directory.
fn append_separator_if_dir(path string) string {
return if os.is_dir(path) && !path.ends_with(os.path_separator) {
path + os.path_separator
} else {
path
}
}
// auto_complete_request retuns a list of completions resolved from a full argument list.
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 (['v','run'] vs. ['v run']). // returns the completion input as a string (['v','run'] vs. ['v run']).
@ -340,9 +353,7 @@ fn auto_complete_request(args []string) []string {
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.
for compiler in auto_complete_compilers { for compiler in auto_complete_compilers {
path := os.find_abs_path_of_executable(compiler) or { path := os.find_abs_path_of_executable(compiler) or { '' }
''
}
if path != '' { if path != '' {
list << compiler list << compiler
} }
@ -385,15 +396,13 @@ fn auto_complete_request(args []string) []string {
ls_path = os.dir(part) ls_path = os.dir(part)
path_complete = true path_complete = true
} }
entries := os.ls(ls_path) or { entries := os.ls(ls_path) or { return list }
return list
}
last := part.all_after_last(os.path_separator) last := part.all_after_last(os.path_separator)
if path_complete { if path_complete {
path := part.all_before_last(os.path_separator) path := part.all_before_last(os.path_separator)
for entry in entries { for entry in entries {
if entry.starts_with(last) { if entry.starts_with(last) {
list << os.join_path(path, entry) list << append_separator_if_dir(os.join_path(path, entry))
} }
} }
// If only one possible file - send full path to completion system. // If only one possible file - send full path to completion system.
@ -404,10 +413,10 @@ fn auto_complete_request(args []string) []string {
} else { } else {
for entry in entries { for entry in entries {
if collect_all { if collect_all {
list << entry list << append_separator_if_dir(entry)
} else { } else {
if entry.starts_with(last) { if entry.starts_with(last) {
list << entry list << append_separator_if_dir(entry)
} }
} }
} }