在执行主类时,如何使bash自动完成java限定类名

在执行主类时,如何使bash自动完成java限定类名,java,bash,autocomplete,Java,Bash,Autocomplete,手动键入java主类的类名是很繁琐的,尤其是在深层包结构中。我希望bash tab completion根据类的目录结构自动完成类名 如何定制bash来实现这一点 (我已经添加了自己的解决方案,但我会接受一个更好的答案。)bash内置命令complete可用于自定义bash中的制表符完成 有关更多信息,请参阅 简单地说,这可以通过为java指定一个自定义完成函数来实现,complete-F\u comp\u java。 然后,该函数可以使用变量COMP_WORDS和COMP_CWORD访问命令行

手动键入java主类的类名是很繁琐的,尤其是在深层包结构中。我希望bash tab completion根据类的目录结构自动完成类名

如何定制bash来实现这一点


(我已经添加了自己的解决方案,但我会接受一个更好的答案。)

bash内置命令
complete
可用于自定义bash中的制表符完成

有关更多信息,请参阅

简单地说,这可以通过为java指定一个自定义完成函数来实现,
complete-F\u comp\u java
。 然后,该函数可以使用变量COMP_WORDS和COMP_CWORD访问命令行中的单词(和当前单词索引),以生成可能完成的列表。 可能的补全必须放在数组中。内置的
compgen
可以与
ls
命令的输出相结合,以查找以当前单词开头的所有路径。 然后可以修改这些可能的补全,将斜线替换为点

这里有一种方法可以做到这一点。任何更清洁的解决方案都可以接受

_comp_java () {
    prev=${COMP_WORDS[$COMP_CWORD - 1]}

    case $prev in
        "-jar")
            COMPREPLY=($(compgen -A file -- ${COMP_WORDS[$COMP_CWORD]}))
            ;;
        *)
            fields=($(echo ${COMP_WORDS[$COMP_CWORD]} | tr "." "\n"));
            [ "${COMP_WORDS[$COMP_CWORD]: -1}" == "." ] && lastIdx=0 || lastIdx=1
            [ ${#COMP_WORDS[$COMP_CWORD]} -eq 0 ] || [ ${lastIdx} -eq 0 ] && lastWord='' || lastWord=${fields[${#fields[@]}-1]}
            [ ${#COMP_WORDS[$COMP_CWORD]} -eq 0 ] && fields=() || fields=($(echo ${fields[*]:0:${#fields[@]}-$lastIdx}))
            [ ${lastIdx} -eq 0 ] && prefix=${COMP_WORDS[$COMP_CWORD]} || prefix=$(tr ' ' '.' <<< $(echo "${fields[@]}."))
            [ "${prefix:0}" == "." ] && prefix=""

            COMPREPLY=( $(compgen -W "$(ls $(tr ' ' '/' <<< $(echo ${fields[@]})))" -- $lastWord ))
            COMPREPLY=(${COMPREPLY[@]/#/$prefix})
            COMPREPLY=(${COMPREPLY[@]/%/.})
            COMPREPLY=(${COMPREPLY[@]/.class./})
            COMPREPLY=(${COMPREPLY[@]/.java./})
            ;;
    esac
    return 0
}

complete -o nospace -o filenames -F _comp_java java
\u comp\u java(){
prev=${COMP_WORDS[$COMP_CWORD-1]}
案例$prev in
“-jar”)
COMPREPLY=($(compgen-A文件--${COMP_WORDS[$COMP_CWORD]}))
;;
*)
字段=($(echo${COMP_-WORDS[$COMP_-CWORD]}tr.“\n”);
[“${COMP_WORDS[$COMP_cwords]:-1}”==“]&&lastIdx=0 | | lastIdx=1
[${lastIdx}-eq 0]&&lastWord=''''.|lastWord=''.| lastWord=${fields[@]}-1]}
[${COMP#u WORDS[$COMP#u CWORD]}-eq 0]&&fields=()|| fields=($(echo${fields[*]:0:${COMP#fields[@]}-$lastIdx}))

[${lastIdx}-eq 0]&&prefix=${COMP_WORDS[$COMP_CWORD]}| | prefix=$(tr''.'如果您在项目中使用src/main/java的公共结构,只需在
ls
命令中的
$(tr
前面添加它即可