簡體   English   中英

執行主類時如何使 bash 自動完成 java 限定的類名

[英]How can I make bash auto-complete java qualified class names when executing a main class

手動輸入 java 主類的類名很乏味,尤其是在深包結構中。 我希望 bash tab-completion 根據類的目錄結構自動完成類名。

我如何自定義 bash 來做到這一點?

(我已經添加了我自己的解決方案,但我會接受更好的答案。)

bash 內置命令complete可用於自定義 bash 中的制表符補全。

有關更多信息,請參閱bash 文檔

簡而言之,這可以通過為 java 指定一個自定義完成函數來完成, complete -F _comp_java java 然后,該函數可以使用變量 COMP_WORDS 和 COMP_CWORD 訪問命令行中的單詞(和當前單詞索引)以生成可能完成的列表。 可能的補全必須放在數組 COMPREPLY 中。 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM