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

StackOverflow https://stackoverflow.com/questions/427472

Вопрос

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

$ myProgram doSomething
$ myProgram doSomethingElse
$ myProgram nowDoSomethingDifferent

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

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

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

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

Это было полезно?

Решение

Создайте файл "myprog-creation.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

Другие советы

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

complete -F _optcomplete <program>

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

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

complete -W "doSomething doSomethingElse nowDoSomethingDifferent" myProgram

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

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

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

Насколько мне известно, 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 см., Например, это руководство .

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top