2011-02-01 17 views
7

Otomatik tamamlama işlevi olan bir tamamlayıcı sınıfım var. Basit versiyon:Python otomatik tamamlama ekranı nasıl eşleştirilir?

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 

Ve taleb ile otomatik tamamlama almak için böyle bir şey yürütün:

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

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

Yani, otomatik tamamlama [ "yardım" için 3 kelime var, "mkdir Örnekte "," mktbl "].

kullanıcı yürütür eğer:
> help

ancak kullanıcı
> mk<tab>
şey yürütür eğer tek maç (mkdir ve mktbl) olmadığı için oluyor:
> he<tab>
kullanıcı alır

Birkaç eşleşme olması durumunda seçenekler nasıl görüntülenir? Bash gibi bir dosya isimleri otomatik tamamlama ile yapmak?

Böylece kullanıcı gibi bir şey elde whold:
> mk<tab>
mktbl mkdir
> mk<cursor>


P.S. Ben
_readline.insert_text koymak için çalıştık (...) _
ve
baskı ...
completer fonksiyonu içine ancak frenler yerleştirme, bu yüzden bir kullanıcı böyle bir şey olur:
> mk<tab>
> mkmktbl mkdir <cursor>

PPS bir linux çözüm gerekir.

+1

Bu tam bir yanıt değil, ve bu basit bir şey için aşırı sıkıcı olabilir, ancak 'küfür' kullanmak bu tür bir şey yapmak için iyi (karmaşık olsa da) bir yoldur: http://docs.python.org /library/curses.html Buradaki eğiticiye bir göz atın: http://docs.python.org/howto/curses.html#curses-howto –

+0

Olabilir! Teşekkür ederim! Ancak, readline'ın sağladığı işlevsellikten kesinlikle memnunuz. Ve ihtiyacımız olan tek şey bu seçenekleri otomatik tamamlamada görüntülemek. Lanetlere baktık ama bunun gibi sadece küçük bir şey için gerçekten çok karmaşık. – MajesticRa

+0

İlginç bir soru, benzer bir şey hakkında fikirlerim vardı. – Skurmedel

cevap

6

Seti taleb seçeneği

set show-all-if-ambiguous on 

İsterseniz

ilk <tab> sonra tamamlamalar. Aksi takdirde sadece iki kez <tab>'a çarptı.

Referans: http://caliban.org/bash/ Bölüm taleb İpuçları

PS. Kodunuzu OS X ve Linux üzerinde test etti, iyi çalışıyor (makinelerim üzerinde)

+0

Teşekkür ederiz! Cevabınız linux'daki problemleri çözdü. Pencerelerde çalışmıyor. Ama windows readline ve cmd'nin sapık bir versiyonuna sahip, bu yüzden maalesef tamam. – MajesticRa

2

Cevabı tamamlayan bir çözüm önerildi. Otomatik tamamlama seçeneklerinin tamamlanma çıktısını düzenlemeye izin verir.

Linux okuma hattı için readline işlevi vardır.

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) 

bu Produse bu kodun yukarıda listelenen örneğin http://docs.python.org/library/readline.html?highlight=readline#readline.set_completion_display_matches_hook

Yani
set_completion_display_matches_hook:
> mk<tab>

useless text to be displayed 
mk 
mkdir mktbl 
5 

> mk<cursor>

pencereler readl için Ine taşma yığında bir yanıt var: How do I make IPython organize tab completion possibilities by class?

Mac için nasıl çalıştığını bilmiyorum.