Автозаполнение командной строки для модуля python -m - PullRequest
0 голосов
/ 12 ноября 2018

Возможно ли получить из командной строки автозаполнение python -m package.subpackage.module?

Это похоже на python ./package/subpackage/module.py, но не совпадает с ним, которое автоматически заполняет пути к каталогам и файлам.Однако при -m python запускает модуль библиотеки как скрипт с соответствующим пространством имен и путями импорта.

Я бы хотел сделать python -m package.s[TAB] и получить автозаполнение до subpackage.

Эта функция где-то встроена или как ее настроить?

1 Ответ

0 голосов
/ 13 ноября 2018

Как сказано в разделе комментариев, вам необходимо расширить инструмент bash-creation . Затем вы создадите скрипт, который обрабатывает нужные вам случаи (например, когда последний аргумент был -m).

Этот небольшой пример ниже показывает начало для вашего пользовательского сценария завершения. Давайте назовем это python_completion.sh.

_python_target() {
    local cur prev opts

    # Retrieving the current typed argument
    cur="${COMP_WORDS[COMP_CWORD]}"

    # Retrieving the previous typed argument ("-m" for example)
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # Preparing an array to store available list for completions
    # COMREPLY will be checked to suggest the list
    COMPREPLY=()

    # Here, we'll only handle the case of "-m"
    # Hence, the classic autocompletion is disabled
    # (ie COMREPLY stays an empty array)
    if [[ "$prev" != "-m" ]]
    then
        return 0
    fi

    # Retrieving paths and converts their separators into dots
    # (if packages doesn't exist, same thing, empty array)
    if [[ ! -e "./package" ]]
    then
       return 0
    fi

    # Otherwise, we retrieve first the paths starting with "./package"
    # and converts their separators into dots
    opts="$(find ./package -type d | sed -e 's+/+.+g' -e 's/^\.//' | head)"

    # We store the whole list by invoking "compgen" and filling
    # COMREPLY with its output content.
    COMPREPLY=($(compgen -W "$opts" -- "$cur"))

}

complete -F _python_target python

(Предупреждение. У этого скрипта есть недостаток, он не будет работать с именами файлов, содержащими пробелы) . Чтобы проверить это, запустите его в среде current :

. ./python_completion.sh

И проверить это:

python -m packag[TAB]

Здесь - учебное пособие для продолжения в этом направлении.

...