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

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

$ myProgram doSomething
$ myProgram doSomethingElse
$ myProgram nowDoSomethingDifferent

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

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

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

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


person pistacchio    schedule 09.01.2009    source источник
comment
это башский вопрос. Вам нужно настроить bash, чтобы он работал. К питону отношения не имеет.   -  person nosklo    schedule 09.01.2009


Ответы (6)


Создайте файл «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
person richq    schedule 09.01.2009
comment
Можно ли использовать это с псевдонимами? У меня есть gist, и я хочу использовать автозаполнение на некоторых веб-сайтах, таких как Twitter, Google и т. д. Есть идеи? - person Medet Tleukabiluly; 26.06.2015

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

complete -F _optcomplete <program>

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

person Peter Hoffmann    schedule 09.01.2009
comment
optparse не устарел и заменен на argparse. Предпочитать argcomplete: github.com/kislyuk/argcomplete - person user48956; 31.10.2014

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

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram

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

person Scz    schedule 01.08.2014

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

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

person Anders Westrup    schedule 09.01.2009
comment
+1. Я бы пошел на этот. Если у вас есть конечный набор дополнений, настроить его очень просто. И это дает пользователю интерфейс, к которому он привык. - person PEZ; 12.01.2009

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

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

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

person sastanin    schedule 09.01.2009

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

person Community    schedule 09.01.2009