2008-10-16 5 views
6

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

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

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

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

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

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

['Paul Eden <[email protected]>', 
'Eden Jones <[email protected]>', 
'Somebody Else <[email protected]>'] 

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

ответ

10

Я не уверен, что понимаю проблему. Вы можете использовать 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 <[email protected]>', 
      'Eden Jones <[email protected]>', 
      'Somebody Else <[email protected]>'] 
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 
+0

Да, я хотел был бы иметь возможность искать в середине или конце строк, а не только в начале. – 2008-10-16 17:29:21