2016-07-29 19 views
20

Phiên bản mới của IPython không còn phụ thuộc vào readline nhưng sử dụng thư viện Python tinh khiết prompt-toolkit, giải quyết các sự cố bảo trì trên hệ thống của Apple và Windows.IPython 5.0 và các ràng buộc khóa trong giao diện điều khiển

Tính năng mới là khả năng chỉnh sửa khối mã nhiều dòng, sử dụng các phím con trỏ để di chuyển tự do trong khối mã - với sức mạnh này, ít nhất với tôi, một vấn đề: vì ret chèn một dòng mới trong mã của bạn, để vượt qua toàn bộ khối các thông dịch viên bạn phải sử dụng các phím tắt alt + ret hoặc dãy phím có thể là kém thuận lợi esc tiếp theo ret.

tôi nói, đây là một vấn đề, bởi vì giả lập thiết bị đầu cuối của tôi về sự lựa chọn là XTerm và, trên nhiều bản phân phối Linux, các phím tắt alt + ret không được truyền cho các ứng dụng nhưng nó được sử dụng trực tiếp bởi XTerm trong đó IPython đang chạy, để chuyển đổi toàn màn hình của thiết bị đầu cuối đã nói (@ThomasDickey, mantainer của xterm và đồng tác giả đã chỉ ra rằng, theo mặc định, xterm không quan tâm để gửi đến ứng dụng bit sửa đổi trên Nhập ngay cả khi một trong những unbinds các hành động toàn màn hình).

Vì lý do này, tôi muốn sửa đổi ít nhất ràng buộc khóa IPython cụ thể này.

Tôi đã tìm thấy hướng dẫn (loại) cho các phiên bản previouos, các phiên bản pre2ouos readline, của IPython không áp dụng cho phiên bản 5.0 mới.

Điều tôi cần là hướng dẫn tìm, trong tài liệu hướng dẫn người dùng của IPython, tên của các hành động có thể mà tôi có thể ràng buộc, tên của các phím tắt để liên kết với các hành động và quy trình để theo dõi ràng buộc khóa mới.

Không có loại câu trả lời kinh điển, tôi thể được hạnh phúc với một công thức để thực hiện keybinding cụ thể này, với điều kiện là các công thức vẫn hoạt động trong IPython 6.0

+3

Tôi chủ yếu là upvoted bạn bởi vì bạn đã dạy tôi rằng tôi có thể nhấn 'esc' để thoát khỏi chế độ chỉnh sửa để thực hiện lệnh! :) –

+2

Đã đạt được 30 điểm về câu hỏi này (tốt nhất của tôi cho đến nay) Tôi cảm thấy bắt buộc phải đầu tư một chút danh tiếng vào câu hỏi này – gboffi

+3

+1 để dạy tôi rằng mẹo 'alt + return'! – wim

Trả lời

4

Bạn có thể thay đổi cấu hình của xterm.

xterm có thể định cấu hình (và được ghi lại).Trong cuốn hướng dẫn xterm, phần Default Key Bindings cho thấy mặc định ràng buộc cho khóa này:

     Alt <Key>Return:fullscreen() \n\ 

Bạn có thể ngăn chặn rằng ràng buộc trong nhiều cách:

  • sử dụng tài nguyên omitTranslation để ngăn chặn tính năng
  • đặt fullscreen tài nguyên để never

Tuy nhiên, chỉ giữ kín nó sẽ không làm cho nó gửi một cái gì đó thú vị (xterm bỏ qua các sửa đổi cho Nhập). Thiết lập một translation công trình nguồn, ví dụ, trong $HOME/.Xdefaults tập tin của bạn:

*VT100*translations:  #override \n\ 
    Alt <Key>Return: string("\033[27;3;13~") 
+0

Thomas, câu trả lời của bạn rất hữu ích, cảm ơn bạn. Tôi sẽ rất hạnh phúc nếu IPython được ghi lại một nửa cũng như xterm ... 1000thank bạn cho xterm quá. Ciao – gboffi

2

Các ctrl + j hoặc ctrl + m phím tắt đang xác thực mục nhập.

+0

Cảm ơn bạn đã trả lời. Các phím tắt ctrl + j hoặc ctrl + m giống hệt với RET afaict. Khi bạn CHỈNH SỬA một khối nhiều dòng mã tất cả các phím tắt này chèn ngắt dòng tại vị trí con trỏ hiện tại, trong khi alt + RET hoặc trình tự Esc RET buộc thực thi khối mã bất kể vị trí của con trỏ. Nếu bạn nghĩ rằng khía cạnh này của vấn đề không đủ rõ ràng, tôi có thể thử chỉnh sửa câu hỏi của mình. – gboffi

+0

Tôi đang sử dụng Windows và trong bảng điều khiển của mình Esc RET và ctrl + j hoặc ctrl + m đang thực hiện tương tự: thực hiện khối lệnh.-, RET không thực hiện gì và RET đang chèn một dòng mới. Bạn có trải nghiệm nào khác không? Bạn đang sử dụng hệ điều hành nào (Windows, Linux, Mac OS)? –

0

Sửa đổi phím tắt trong cấu hình khi sử dụng prompt_toolkit không (chưa) có thể; mặc dù nó là khá dễ dàng nếu bạn cài đặt IPython từ nguồn. Nếu bạn nhìn vào tập tin IPython/terminal/shortcuts.py bạn sẽ thấy rằng nó chứa các logic khác nhau; cụ thể là bạn sẽ tìm thấy:

# Ctrl+J == Enter, seemingly 
registry.add_binding(Keys.ControlJ, 
        filter=(HasFocus(DEFAULT_BUFFER) 
          & ~HasSelection() 
          & insert_mode 
        ))(newline_or_execute_outer(shell)) 

Ràng buộc này CtrlJ (nhập) vào hàm newline_or_execute_outer chịu trách nhiệm thêm dòng mới; nó được định nghĩa sau trong tệp. Đặc biệt nếu bạn nhấn Enter hai lần vào cuối một khối mã, nó sẽ thực thi khối mà không cần sử dụng bất kỳ phím tắt nào khác.

Strip logic có thêm dòng mới:

def execute_outer(shell): 
    def execute(event): 
     """When the user presses return, insert a newline or execute the code.""" 
     b = event.current_buffer 

     # some logic to also dismiss the completer 

     b.accept_action.validate_and_handle(event.cli, b) 
    return execute 

Bind nó xung quanh dòng 20-một cái gì đó:

registry.add_binding(Keys.ControlE, 
        filter=(HasFocus(DEFAULT_BUFFER) 
          & ~HasSelection() 
          & insert_mode 
        ))(execute_outer(shell)) 

Và thưởng thức. Nếu bạn không hài lòng với tài liệu, chúng tôi hoan nghênh trợ giúp; Ví dụ, lấy ý chính của câu trả lời ở đó và đóng góp chúng lại. Nó là một chút tổn thương để đọc bình luận gay gắt khi chúng ta nói trong ghi chú phát hành:

New terminal interface 

The overhaul of the terminal interface will probably cause a range of minor 
issues for existing users. This is inevitable for such a significant 
change, and we’ve done our best to minimise these issues. Some changes that 
we’re aware of, with suggestions on how to handle them: 

IPython no longer uses readline configuration (~/.inputrc). We hope that 
the functionality you want (e.g. vi input mode) will be available by 
configuring IPython directly (see Terminal IPython options). If something’s 
missing, please file an issue. 

... 

Giúp thực sự cải thiện IPython có keybinding cấu hình với tên hành động cũng được đánh giá cao, vì vậy sau đó bạn sẽ có thể trả lời câu hỏi của riêng bạn .

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