Как выполнить автозаполнение командной строки python, но не только в начале строки

Python через привязки readline допускает отличную автозавершение командной строки (как описано здесь ).

Но завершение, похоже, работает в начале строк. Если вы хотите совместить середину или конец строки readline, это не сработает.

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

  • Хорошим примером типа автозаполнения, который я хотел бы иметь, является тип, который происходит в GMail при вводе в поле Кому. Если вы наберете одну из своих фамилий, она появится точно так же, как если бы вы набрали ее имя.
  • Некоторое использование стрелок вверх и вниз или какой-либо другой метод для выбора из согласованных строк может понадобиться (и не требуется в случае readline), и это хорошо в моем случае.
  • Мой конкретный вариант использования – это программа командной строки, которая отправляет электронные письма.
  • Конкретные примеры кода были бы очень полезными.

Использование терминальных эмуляторов, таких как проклятия, было бы неплохо. Он должен работать только на Linux, а не на Mac или Windows.

Вот пример: Скажем, у меня есть следующие три строки в списке

['Paul Eden <paul@domain.com>', 'Eden Jones <ejones@domain.com>', 'Somebody Else <somebody@domain.com>'] 

Я хотел бы, чтобы какой-то код автоматически запустил первые два элемента в списке после ввода «Eden», а затем разрешил мне выбрать один из них (все через командную строку с помощью клавиатуры).

One Solution collect form web for “Как выполнить автозаполнение командной строки python, но не только в начале строки”

Я не уверен, что понимаю проблему. Вы можете использовать readline.clear_history и readline.add_history для настройки необходимых строк, а затем control-r для поиска назад в истории (точно так же, как если бы вы были в командной строке). Например:

 #!/usr/bin/env python import readline readline.clear_history() readline.add_history('foo') readline.add_history('bar') while 1: print raw_input('> ') 

Кроме того, вы можете написать свою собственную версию и связать с ней соответствующий ключ. Эта версия использует кеширование, если ваш список соответствия огромен:

 #!/usr/bin/env python import readline values = ['Paul Eden <paul@domain.com>', 'Eden Jones <ejones@domain.com>', 'Somebody Else <somebody@domain.com>'] completions = {} def completer(text, state): try: matches = completions[text] except KeyError: matches = [value for value in values if text.upper() in value.upper()] completions[text] = matches try: return matches[state] except IndexError: return None readline.set_completer(completer) readline.parse_and_bind('tab: menu-complete') while 1: a = raw_input('> ') print 'said:', a 
  • Как сохранить таблицу Excel как CSV из Python (Unix)?
  • Как смонтировать файловую систему с помощью Python?
  • Убейте процесс, используя его имя внутри linux (Python)
  • Как добавить расширение .xml ко всем файлам в папке в Unix / Linux
  • Как запустить скрипт bash внутри Python, но действовать так, как если бы он запускался из другого каталога?
  • Обозначения Unix filename в Python?
  • Изменение пароля Unix из командной строки поверх Python / Fabric
  • Как управлять процессами экрана с использованием python
  • Python - лучший язык программирования в мире.