【问题标题】:How can I make bash auto-complete java qualified class names when executing a main class执行主类时如何使bash自动完成java限定类名
【发布时间】:2018-08-28 01:37:40
【问题描述】:

手动输入 java 主类的类名很乏味,尤其是在深度包结构中。我希望 bash tab-completion 根据类的目录结构自动完成类名。

如何自定义 bash 来做到这一点?

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

【问题讨论】:

    标签: java bash autocomplete


    【解决方案1】:

    bash 内置命令complete 可用于自定义 bash 中的制表符补全。

    请参阅bash documentation 了解更多信息。

    简而言之,这可以通过为 java 指定一个自定义完成函数 complete -F _comp_java java 来完成。 然后,该函数可以使用变量 COMP_WORDS 和 COMP_CWORD 来访问命令行中的单词(和当前单词索引)以生成可能完成的列表。 可能的完成必须放在数组 COMPREPLY 中。 compgen builtin 可以与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
    

    【讨论】:

    • 如果您在项目中使用 src/main/java 的通用结构,只需将其添加到 ls 命令中的 $(tr 前面
    猜你喜欢
    • 2013-07-24
    • 2011-08-26
    • 1970-01-01
    • 2011-01-05
    • 2018-08-25
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多