gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:03:26 26 4
gpt4 key购买 nike

手动输入java主类的类名是很乏味的,尤其是在很深的包结构中。我希望 bash 制表符补全功能能够根据类的目录结构自动补全类名。

如何自定义 bash 来执行此操作?

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

最佳答案

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

参见bash documentation了解更多信息。

简单地说,这可以通过为 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

关于java - 如何在执行主类时使 bash 自动完成 java 限定类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52044360/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com