2011-08-19 26 views
42

Trước khi nâng cấp lên con sư tử, tôi đã hoàn tất tab làm việc trong một trình bao python qua thiết bị đầu cuối. Theo sau these instructions, có thể hoàn thành tab.hoàn thành tab trăn Mac OSX 10.7 (Sư tử)

Kể từ khi nâng cấp lên Lion, tôi hiện không thể hoàn thành tab hoạt động trong phiên làm việc đầu cuối của Python. Tôi đã làm theo các hướng dẫn trên cho bức thư, và nó vẫn không hoạt động.

Có sự khác biệt với mô-đun readline trong Lion không? Hooking vào 'tab: hoàn thành' tùy chọn không còn có vẻ làm việc. Tôi tự hỏi nếu nó là thiết bị đầu cuối đó là bỏ qua readline, hoặc nếu nó là python chính nó.

Python phiên bản: 2.7.1

Edit:

By tab hoàn chỉnh, ý tôi là tôi có thể làm một cái gì đó như sau:

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

Bạn đã hoàn thành công cụ nào trước đây? –

+0

Bạn đã xem xét sử dụng một cái gì đó như ipython hoặc bpython? –

+0

Nếu vẫn không hoạt động, hãy xem [câu trả lời của tôi trong bài đăng khác] (http://stackoverflow.com/questions/675370/tab-completion-in-python-interpreter-in-os-x-terminal/23908884# 23908884). –

Trả lời

102

Apple không xuất xưởng GNU readline với OS X Nó vận chuyển BSD libedit bao gồm giao diện tương thích readline. Các hệ thống Pythons được Apple vận chuyển và các Pythons 64 bit/32 bit từ các trình cài đặt python.org được xây dựng với libedit. Vấn đề là các lệnh được hỗ trợ bởi libedit hoàn toàn khác với các lệnh của readline (xem ví dụ: thảo luận here). Trình cài đặt python.org chỉ 32 bit truyền thống sử dụng GNU readline làm một số nhà phân phối bên thứ ba khác của Python cho OS X, như MacPorts. Rất có thể là trước đây bạn đã sử dụng một Python như vậy và không phải là một Apple gần đây. Bạn có một vài tùy chọn, bên cạnh việc sửa đổi Django: bạn có thể cài đặt mô-đun thay thế bên thứ ba readline; hoặc bạn có thể sử dụng một Python khác đi kèm với GNU readline. Tuy nhiên, bạn không nên sử dụng python.org python.org 32 bit chỉ trên 10,7 vì, không may, Xcode 4 trên 10.7 không còn bao gồm gcc-4.0 và SDK OS X 10.4u mà Pythons cần xây dựng và cài đặt gói với mô-đun mở rộng C .

Đặt phần sau vào tệp khởi động python sẽ cho phép hoàn thành tab cho cả giao diện libedit và mô-đun readline điển hình. Để biết thêm thông tin về các tập tin khởi động trăn, 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

Tôi đã từng sử dụng python 2.7 với osx 10.6, vì vậy nó không phải là python hệ thống.Tôi tin rằng bạn đang đúng trong những gì bạn đang nói mặc dù. Tôi phải sử dụng hệ thống python, do một số thư viện oracle tôi đang sử dụng cho django. –

+0

Tôi đã thêm giải pháp để hoàn thành tab làm việc cho câu trả lời của bạn thay vì tạo một giải pháp mới vì thông tin trong câu trả lời của bạn tốt hơn nhiều. Vui lòng xóa nó nếu bạn thích, và tôi sẽ tạo ra một câu trả lời mới. Chúc mừng –

12

Vì nó sử dụng libedit/editline, cú pháp để cho phép tự động hoàn là một chút khác nhau. Trước tiên, bạn có thể buộc bindings emacs (vì nó là với readline nếu tôi không sai) bằng cách gõ:

readline.parse_and_bind("bind -e")

Sau đó, bạn có thể thêm autocompletion liên quan đến nút TAB của bạn (người đàn ông editrc):

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

và nếu bạn muốn hỗ trợ thụt và có một lịch sử (được tìm thấy trên internet), nó sẽ giống như thế (trừ khi tôi đã phạm sai lầm):

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 
Các vấn đề liên quan