2008-10-16 15 views
6

Python, thông qua các ràng buộc readline cho phép tự động hoàn thành dòng lệnh tuyệt vời (như được mô tả trong here).Làm thế nào để tự động hoàn thành dòng lệnh python nhưng KHÔNG chỉ ở đầu chuỗi

Tuy nhiên, việc hoàn thành chỉ dường như hoạt động ở đầu chuỗi. Nếu bạn muốn kết hợp giữa hoặc cuối của một chuỗi readline không hoạt động.

Tôi muốn tự động hoàn tất các chuỗi, trong chương trình python dòng lệnh bằng cách đối sánh những gì tôi nhập với bất kỳ chuỗi nào trong danh sách các chuỗi có sẵn.

  • Ví dụ về loại tự động hoàn thành mà tôi muốn có là loại xảy ra trong Gmail khi bạn nhập vào trường Đến. Nếu bạn nhập một trong số họ của họ, nó sẽ xuất hiện cũng như nếu bạn gõ tên của cô ấy.
  • Một số sử dụng mũi tên lên và xuống hoặc một số phương pháp khác để chọn từ các chuỗi phù hợp có thể cần thiết (và không cần thiết trong trường hợp readline) và điều đó là tốt trong trường hợp của tôi.
  • Trường hợp sử dụng cụ thể của tôi là chương trình dòng lệnh gửi email.
  • Ví dụ mã cụ thể sẽ rất hữu ích.

Sử dụng trình giả lập thiết bị đầu cuối như lời nguyền sẽ ổn. Nó chỉ phải chạy trên Linux, không phải Mac hoặc Windows.

Dưới đây là một ví dụ: Nói rằng tôi có ba chuỗi sau đây trong một danh sách

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

Tôi muốn một số mã sẽ tự động hoàn thành hai mục đầu tiên trong danh sách sau khi tôi gõ 'Eden' và sau đó cho phép tôi chọn một trong số họ (tất cả thông qua dòng lệnh bằng bàn phím).

Trả lời

10

Tôi không chắc mình có hiểu vấn đề không. Bạn có thể sử dụng readline.clear_history và readline.add_history để thiết lập các chuỗi hoàn chỉnh mà bạn muốn, sau đó control-r để tìm kiếm backword trong lịch sử (giống như khi bạn đang ở dấu nhắc trình bao). Ví dụ:

#!/usr/bin/env python 

import readline 

readline.clear_history() 
readline.add_history('foo') 
readline.add_history('bar') 

while 1: 
    print raw_input('> ') 

Hoặc, bạn có thể viết phiên bản hoàn chỉnh của riêng mình và liên kết khóa phù hợp với nó. Phiên bản này sử dụng bộ nhớ đệm trong trường hợp danh sách đối sánh của bạn rất lớn:

#!/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

Có, tôi muốn tìm kiếm ở giữa hoặc cuối chuỗi chứ không chỉ ở đầu. –

+0

Ví dụ trên hoạt động theo cách đó. Nếu tôi bấm "control-r o", nó sẽ chọn "foo". –

+0

Ý tưởng mới lạ. Có cách nào để làm tự động (tức là, mà không cần nhấn control-r trước)? –

Các vấn đề liên quan