java - 执行主类时如何使bash自动完成java限定类名
问题描述
手动输入 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
推荐阅读
- javascript - 以自动方式提取地点列表的纬度/经度数据
- javascript - 基本反应多页应用程序更改标题内容
- cups - 从 TIFF 转换为 ESCP2
- angular - Angulartics2:“Angulartics2GoogleAnalytics”类型上不存在 startTracking()
- image - 通过哈希在 Internet 上搜索图像
- mysql - SQL:按两列分组并相加
- arrays - 如何在 react-native 中从数组中的 sqlite 弹出结果?
- c++ - C++ 使用没有动态分配的接口
- java - 如何从另一个类中引用一个泛型类
- python - 用于选择父级的 sqlalchemy 表达式