Как я могу сделать bash автозаполненным java-полными именами классов при выполнении основного класса - PullRequest
0 голосов
/ 27 августа 2018

Утомительно вручную вводить имя класса для основного класса Java, особенно в глубокой структуре пакета. Я хотел бы, чтобы bash tab-complete для автозаполнения имен классов основывался на структуре каталогов класса.

Как мне настроить bash для этого?

(Я добавил свое собственное решение, но приму лучший ответ.)

1 Ответ

0 голосов
/ 27 августа 2018

Встроенная команда 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...