Подтвердить что ты не робот

Завершение строки с помощью пользовательских команд

моя программа Python может быть запущена с рядом различных опций (или подкоманд), например:

$ myProgram doSomething
$ myProgram doSomethingElse
$ myProgram nowDoSomethingDifferent

Я хочу, чтобы он использовал автозаполнение с тем, чтобы, если я нахожу "myProgram d", он возвращает "myProgram doSomething", и если я нахожу "myProgram n", он отображает "myProgram nowDoSomethingDifferent". Это похоже на среднее использование модуля rlcompleter, но оно не выбирает возможные варианты завершения из файловой системы (или из истории), а из пользовательского набора строк (которые соответствуют доступным параметрам для моей программы).

Любая идея о том, как это реализовать?

Я знаю переменную PYTHONSTARTUP (которая должна указывать на файл, который я не знаю, как писать).

В качестве рабочего примера django-admin (из пакета django) имеет ту же самую функцию, которую я ищу

4b9b3361

Ответ 1

Создайте файл "myprog-completion.bash" и отправьте его в ваш .bashrc файл. Что-то вроде этого, чтобы вы начали...

_myProgram()
{
  cur=${COMP_WORDS[COMP_CWORD]}
  case "${cur}" in
    d*) use="doSomething" ;;
    n*) use="nowDoSomethingElse" ;;
  esac
  COMPREPLY=( $( compgen -W "$use" -- $cur ) )
}
complete -o default -o nospace -F _myProgram  myProgram

Ответ 2

Существует модуль optcomplete, который позволяет вам записать завершение для bash автозаполнения в вашем python. Это очень полезно в сочетании с optparse. Вы только определяете свои аргументы один раз, добавьте следующее в свой .bashrc

complete -F _optcomplete <program>

и все ваши варианты будут автозаполнены.

Ответ 3

Как упоминалось в других ответах, в bash это можно сделать с помощью bash -builtin complete. Легче писать функцию (как в richq answer) использует параметр complete -W, который позволяет указать список слов. В вашем примере это будет:

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram

Поскольку это однострочный файл, вам не нужно создавать файл для этого, но вы можете просто поместить его в свой .bashrc.

Ответ 4

Если я правильно понял, вы хотите завершить линию в командной строке до запуска python script. Тогда вы не должны искать решение python, но смотрите на функции оболочки.

Если вы используете bash, вы можете посмотреть /etc/bash _completion и, по крайней мере, на debian/ubuntu, вы должны создать файл в /etc/bash _completion.d/, который указывает завершение вашей программы.

Ответ 5

Как и я знаю, PYTHONSTARTUP предназначен для выполнения команд, когда интерпретатор запускает [1]. rlcompleter предназначен для автозаполнения внутри вашего script, если он использует библиотеку readline. Что-то вроде этого:

$ ./myscript.py
My Script version 3.1415.
Enter your commands:
myscript> B<TAB>egin
myscript> E<TAB>nd

В вашем примере вы хотите завершить работу в командной строке оболочки. Это автозаполнение - это функция оболочки (либо bash, либо zsh, что бы вы ни использовали). См., Например, введение в bash autocompletion (также часть 2). Для zsh см., Например, это руководство.

Ответ 6

Если вы хотите, чтобы ваша программа выбирала параметр командной строки, хотя вы использовали только сокращенную форму этого параметра, вы должны посмотреть на модуль optparse в стандартной библиотеке.