[英]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.