Я знаю, как настроить автозаполнение объектов python в интерпретаторе python (в unix).
- Google показывает множество обращений с объяснениями, как это сделать.
- К сожалению, здесь так много ссылок, что мне трудно найти то, что мне нужно сделать, что немного отличается.
Мне нужно знать, как включить табуляцию / автоматическое завершение произвольных элементов в программе командной строки, написанной на python.
Мой конкретный вариант использования - это программа на Python из командной строки, которая должна отправлять электронные письма. Я хочу иметь возможность автозаполнения адресов электронной почты (адреса у меня есть на диске), когда пользователь вводит их часть (и при необходимости нажимает клавишу TAB).
Мне он не нужен для работы на windows или mac, только linux.
python
linux
unix
command-line
autocomplete
Пол Д. Иден
источник
источник
Ответы:
Используйте
readline
привязки Python . Например,import readline def completer(text, state): options = [i for i in commands if i.startswith(text)] if state < len(options): return options[state] else: return None readline.parse_and_bind("tab: complete") readline.set_completer(completer)
Официальная документация по модулю не намного более подробна, дополнительную информацию см. В документации для чтения.
источник
Следуйте документации cmd, и все будет в порядке
import cmd addresses = [ 'here@blubb.com', 'foo@bar.com', 'whatever@wherever.org', ] class MyCmd(cmd.Cmd): def do_send(self, line): pass def complete_send(self, text, line, start_index, end_index): if text: return [ address for address in addresses if address.startswith(text) ] else: return addresses if __name__ == '__main__': my_cmd = MyCmd() my_cmd.cmdloop()
Вывод для вкладки -> вкладка -> отправить -> вкладка -> вкладка -> f -> вкладка
источник
Поскольку вы говорите «НЕ интерпретатор» в своем вопросе, я думаю, вам не нужны ответы, включающие строку чтения Python и тому подобное. ( править : оглядываясь назад, очевидно, что это не так. Хмм. Я думаю, что эта информация в любом случае интересна, поэтому я оставлю ее здесь. )
Я думаю, вы можете быть после этого .
Речь идет о добавлении автозавершения на уровне оболочки к произвольным командам, расширяя собственное завершение табуляции в bash.
Вкратце, вы создадите файл, содержащий функцию оболочки, которая будет генерировать возможные завершения, сохраните ее
/etc/bash_completion.d/
и зарегистрируйте с помощью командыcomplete
. Вот фрагмент со связанной страницы:_foo() { local cur prev opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" opts="--help --verbose --version" if [[ ${cur} == -* ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 fi } complete -F _foo foo
В этом случае набор
foo --[TAB]
даст вам значения в переменнойopts
, то есть--help
,--verbose
и--version
. Для ваших целей вы, по сути, захотите настроить значения, которые помещаются вopts
.Взгляните на пример на связанной странице, все довольно просто.
источник
Я удивлен, что никто не упомянул argcomplete, вот пример из документации:
from argcomplete.completers import ChoicesCompleter parser.add_argument("--protocol", choices=('http', 'https', 'ssh', 'rsync', 'wss')) parser.add_argument("--proto").completer=ChoicesCompleter(('http', 'https', 'ssh', 'rsync', 'wss'))
источник
Вот полный рабочий вариант кода , который был очень поставляемой ephemient здесь (спасибо).
import readline addrs = ['angela@domain.com', 'michael@domain.com', 'david@test.com'] def completer(text, state): options = [x for x in addrs if x.startswith(text)] try: return options[state] except IndexError: return None readline.set_completer(completer) readline.parse_and_bind("tab: complete") while 1: a = raw_input("> ") print "You entered", a
источник
# ~/.pythonrc import rlcompleter, readline readline.parse_and_bind('tab:complete') # ~/.bashrc export PYTHONSTARTUP=~/.pythonrc
источник
readline.parse_and_bind('tab:complete')
наreadline.parse_and_bind ("bind ^I rl_complete")
Вы можете попробовать использовать Python Prompt Toolkit , библиотеку для создания интерактивных приложений командной строки на Python.
Библиотека упрощает добавление интерактивной функции автозаполнения, позволяя пользователю использовать Tabключ для визуального переключения доступных вариантов. Библиотека кроссплатформенная (Linux, OS X, FreeBSD, OpenBSD, Windows). Пример:
(Источник изображения: pcgli )
источник
Опубликованные ответы работают нормально, но у меня есть открытая библиотека автозаполнения, которую я написал на работе. Мы уже некоторое время используем его в производстве, и он быстрый, стабильный и простой в использовании. У него даже есть демонстрационный режим, поэтому вы можете быстро проверить, что вы получите при вводе слов.
Чтобы установить его, просто запустите:
pip install fast-autocomplete
Вот пример:
>>> from fast_autocomplete import AutoComplete >>> words = {'book': {}, 'burrito': {}, 'pizza': {}, 'pasta':{}} >>> autocomplete = AutoComplete(words=words) >>> autocomplete.search(word='b', max_cost=3, size=3) [['book'], ['burrito']] >>> autocomplete.search(word='bu', max_cost=3, size=3) [['burrito']] >>> autocomplete.search(word='barrito', max_cost=3, size=3) # mis-spelling [['burrito']]
Оформить заказ: https://github.com/wearefair/fast-autocomplete для исходного кода.
А вот объяснение того, как это работает: http://zepworks.com/posts/you-autocomplete-me/
Он имеет дело с неправильным написанием и опциональной сортировкой по весу слова. (скажем,
burrito
важнее, чемbook
, тогда вы дадитеburrito
более высокий «счет», и он появится раньшеbook
в результатах.Слова - это словарь, и каждое слово может иметь контекст. Например, «счетчик», как отображать слово, какой-то другой контекст вокруг слова и т. Д. В этом примере слова не имели никакого контекста.
источник