Завершение строки с помощью пользовательских команд - PullRequest
27 голосов
/ 09 января 2009

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

$ myProgram doSomething
$ myProgram doSomethingElse
$ myProgram nowDoSomethingDifferent

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

Есть идеи, как это реализовать?

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

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

Ответы [ 6 ]

37 голосов
/ 09 января 2009

Создайте файл «myprog-extension.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
15 голосов
/ 09 января 2009

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

complete -F _optcomplete <program>

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

8 голосов
/ 01 августа 2014

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

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram

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

6 голосов
/ 09 января 2009

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

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

3 голосов
/ 09 января 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 (также part 2 ). Для zsh см., Например, это руководство .

0 голосов
/ 09 января 2009

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

...