Завершение строки с помощью пользовательских команд
моя программа Python может быть запущена с рядом различных опций (или подкоманд), например:
$ myProgram doSomething
$ myProgram doSomethingElse
$ myProgram nowDoSomethingDifferent
Я хочу, чтобы он использовал автозаполнение с тем, чтобы, если я нахожу "myProgram d", он возвращает "myProgram doSomething", и если я нахожу "myProgram n", он отображает "myProgram nowDoSomethingDifferent". Это похоже на среднее использование модуля rlcompleter, но оно не выбирает возможные варианты завершения из файловой системы (или из истории), а из пользовательского набора строк (которые соответствуют доступным параметрам для моей программы).
Любая идея о том, как это реализовать?
Я знаю переменную PYTHONSTARTUP (которая должна указывать на файл, который я не знаю, как писать).
В качестве рабочего примера django-admin (из пакета django) имеет ту же самую функцию, которую я ищу
Ответы
Ответ 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 в стандартной библиотеке.