2011-08-19 21 views
42

Aslan'a geçiş yapmadan önce, terminal aracılığıyla bir python kabuğunda çalışarak sekme işleminin tamamlandığını gördüm. these instructions'u takiben, sekmenin tam çalışmasını sağlamak mümkündü.python sekmesi tamamlandı Mac OSX 10.7 (Aslan)

Aslan'a yükselttiğinizden beri, artık Python'un bir terminal oturumunda çalışırken sekmeyi tamamlayamıyorum. Yukarıdaki talimatları mektuba kadar takip ettim ve hala çalışmıyor.

Lion'taki readline modülü ile bir fark var mı? 'Sekme: tamam' seçeneğinin işaretlenmesi artık işe yaramıyor gibi görünüyor. Okumayı göz ardı eden bir terminal mi, yoksa pythonun kendisi mi diye merak ediyorum.

Python sürümü: 2.7.1

Düzenleme: sekmesi ile

tam, ben böyle bir şey yapabileceğini ifade aşağıdadır:

# django 
import MyModel 
MyModel.objects.a[TAB] # will complete to all() 
+0

Daha önce hangi tür şeyleri tamamladınız? –

+0

ipython veya bpython gibi bir şeyi kullanmayı düşündünüz mü? –

+0

Hala çalışmıyorsa, [başka bir gönderideki cevabım] bölümüne bakın (http://stackoverflow.com/questions/675370/tab-completion-in-python/interpreter-in-os-x-terminal/23908884# 23.908.884). –

cevap

102
Apple OS X ile GNU readline gelmez

readline uyumluluk arabirimi içeren BSD libedit ürününü gönderir. Python.org yükleyicilerinden Apple ve 64-bit/32-bit Pythons tarafından gönderilen sistem Pythons, libedit ile üretilmiştir. Sorun şu ki, libedit tarafından desteklenen komutlar readline'unkilerden tamamen farklıdır (bkz. Örneğin, here tartışması). Geleneksel 32 bitlik python.org yükleyicileri, MacPorts gibi, OS X için Python'un diğer üçüncü taraf dağıtımcılarının yaptığı gibi GNU readline'u kullanır. Şanslar, daha önce böyle bir Python kullandığınız ve yeni bir Apple değil. Django'yu değiştirmenin yanı sıra birkaç seçeneğiniz var: üçüncü taraf değiştirmeyi readline modülünü yükleyebilirsiniz; veya GNU okuma hattı ile gelen başka bir Python kullanabilirsiniz. Bununla birlikte, python.org 32-bitlik Pythons'u 10.7'de kullanmamalısınız çünkü maalesef, 10.7'deki Xcode 4 artık gcc-4.0 ve OSX 10.4u SDK'sı içermekte ve bu Pythons'un C uzatma modülleriyle paketleri oluşturması ve kurması gerekiyor .

Aşağıdakileri python başlangıç ​​dosyasına koymak, hem libedit arabirimi hem de tipik readline modülü için sekmeyi tamamlamayı etkinleştirir. piton başlangıç ​​dosyası hakkında daha fazla bilgi için see here

import readline 
import rlcompleter 
if 'libedit' in readline.__doc__: 
    readline.parse_and_bind("bind ^I rl_complete") 
else: 
    readline.parse_and_bind("tab: complete") 
+0

Python 2.7'yi osx 10.6 ile kullandım, bu yüzden sistem pythonu değildi.Ama söylediğin şeyin içinde olduğuna inanıyorum. Django için kullanıyorum bazı oracle kütüphaneleri nedeniyle, sistem python kullanmak zorunda. –

+0

Cevabınızdaki bilgiler çok daha iyi olduğu için, yeni bir tane oluşturmak yerine yanıtınıza çalışarak sekme tamamlamayı elde etmek için çözümü ekledim. İsterseniz kaldırmak için çekinmeyin ve yeni bir cevap oluşturacağım. Şerefe –

12

o libedit/editline kullanır gibi, otomatik tamamlama etkinleştirmek için sözdizimi biraz farklıdır. (Ben yanlış değilsem taleb ile olduğu gibi) Önce yazarak emacs bağları zorlayabilirsiniz:

:

readline.parse_and_bind("bind -e")

Sonra otomatik tamamlama TAB düğmesiyle (adam editrc) ile bağlantılı ekleyebilir

readline.parse_and_bind("bind '\t' rl_complete")

ve girinti desteklemek istediğiniz ve (internette bulunan) öyküsü varsa (ben bir hata yaptım sürece), bu gibi görünmelidir:

import readline,rlcompleter 

### Indenting 
class TabCompleter(rlcompleter.Completer): 
    """Completer that supports indenting""" 
    def complete(self, text, state): 
     if not text: 
      return (' ', None)[state] 
     else: 
      return rlcompleter.Completer.complete(self, text, state) 

readline.set_completer(TabCompleter().complete) 

### Add autocompletion 
if 'libedit' in readline.__doc__: 
    readline.parse_and_bind("bind -e") 
    readline.parse_and_bind("bind '\t' rl_complete") 
else: 
    readline.parse_and_bind("tab: complete") 

### Add history 
import os 
histfile = os.path.join(os.environ["HOME"], ".pyhist") 
try: 
    readline.read_history_file(histfile) 
except IOError: 
    pass 
import atexit 
atexit.register(readline.write_history_file, histfile) 
del histfile