2011-02-01 34 views
7

Tôi có loại lớp hoàn chỉnh với chức năng tự động hoàn thành. Simple phiên bản:Làm thế nào để hiển thị kết quả tự động hoàn thành python?

class Completer: 
    def __init__(self): 
     self.words = ["mkdir","mktbl", "help"] 
     self.prefix = None 

    def complete(self, prefix, index): 
     if prefix != self.prefix: 
      self.matching_words = [w for w in self.words if w.startswith(prefix)] 
      self.prefix = prefix 
     else: 
      pass     
     try: 
      return self.matching_words[index] 
     except IndexError: 
      return None 

Và thực hiện một cái gì đó như thế này để có được tính năng tự động hoàn thành với readline:

import readline 
readline.parse_and_bind("tab: complete") 

completer = Completer() 
readline.set_completer(completer.complete) 
user_input =raw_input("> ") 

Vì vậy, có 3 từ để tự động hoàn thành [ "giúp đỡ", "mkdir "," mktbl "] trong ví dụ.

nếu người dùng thực hiện:
> he<tab>
người sử dụng được:
> help

nhưng nếu người dùng thực hiện
> mk<tab>
gì đang xảy ra bởi vì không có một trận đấu duy nhất (mkdir và mktbl)

Làm cách nào để hiển thị các tùy chọn trong trường hợp có nhiều kết quả khớp? Giống như Bash làm với một tên tập tin tự động hoàn thành?

Như vậy người dùng whold có được một cái gì đó như:
> mk<tab>
mktbl mkdir
> mk<cursor>


T.B. tôi đã cố gắng đưa
_readline.insert_text (...) _

in ...
vào chức năng Completer nhưng nó phanh chèn, do đó, một người dùng được một cái gì đó như thế này:
> mk<tab>
> mkmktbl mkdir <cursor>

PPS Tôi cần giải pháp Linux.

+1

Đây không phải là câu trả lời hoàn chỉnh và có thể quá mức cần thiết cho một thứ đơn giản, nhưng sử dụng 'curses' là một cách tốt (mặc dù phức tạp) để thực hiện việc này: http://docs.python.org /library/curses.html Xem hướng dẫn tại đây: http://docs.python.org/howto/curses.html#curses-howto –

+0

Có thể! Cảm ơn bạn! Nhưng chúng tôi hoàn toàn hài lòng với chức năng readline cung cấp. Và điều duy nhất chúng tôi cần là hiển thị các tùy chọn này về tự động hoàn thành. Chúng tôi nhìn vào những lời nguyền rủa, nhưng nó thực sự là quá phức tạp cho chỉ một điều nhỏ như thế này. – MajesticRa

+0

Câu hỏi thú vị, tôi đã có ý tưởng về một điều tương tự. – Skurmedel

Trả lời

6

Set tùy chọn readline

set show-all-if-ambiguous on 

nếu bạn muốn hoàn tất sau khi <tab> đầu tiên. Nếu không, chỉ cần nhấn <tab> hai lần.

tham khảo: http://caliban.org/bash/ Mục readline Mẹo và Tricks

PS. Thử nghiệm mã của bạn trên OS X và Linux, nó hoạt động tốt (trên máy của tôi;)

+0

Cảm ơn bạn! Câu trả lời của bạn đã giải quyết được vấn đề trên linux. Nó không hoạt động trên các cửa sổ. Nhưng cửa sổ có phiên bản ngược của readline và cmd vì vậy nó là tiếc là ok. – MajesticRa

2

Tôi đã đề xuất một giải pháp hoàn thành câu trả lời. Nó cho phép tổ chức đầu ra hoàn thành các tùy chọn tự động hoàn thành.

Đối với readline linux có chức năng readline.set_completion_display_matches_hook
http://docs.python.org/library/readline.html?highlight=readline#readline.set_completion_display_matches_hook

Vì vậy, cho các ví dụ nêu trên mã này

def print_suggestions(self, substitution, matches, longest_match_length) : 
    print "useless text to be displayed" 
    print substitution 
    print " ".join[match for match in matches] 
    print longest_match_length 

readline.set_completion_display_matches_hook(print_suggestions) 

này sẽ produse:
> mk<tab>

useless text to be displayed 
mk 
mkdir mktbl 
5 

> mk<cursor>

Đối với cửa sổ readl ine có một câu trả lời ở ngăn xếp tràn:
How do I make IPython organize tab completion possibilities by class?

Không biết cách hoạt động của máy Mac.

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