Làm cách nào để sử dụng khóa vi trong ipython dưới * nix?


94

Hiện tại trong Bash tôi sử dụng set -o viđể bật chế độ vi trong lời nhắc bash của mình.

Làm cách nào để làm được điều này trong ipython?

Lưu ý: Nếu câu trả lời áp dụng cho tất cả * nix, tôi sẽ xóa OS X khỏi tiêu đề :)

Câu trả lời:


165

Trong trường hợp ai đó đang lang thang ở đây gần đây, IPython 5.0 đã chuyển từ readline sang prompt_toolkit , vì vậy câu trả lời cập nhật cho câu hỏi này là chuyển một tùy chọn:

$ ipython --TerminalInteractiveShell.editing_mode=vi

... hoặc để đặt nó trên toàn cục trong cấu hình hồ sơ ( ~/.ipython/profile_default/ipython_config.py; tạo nó bằng ipython profile createnếu bạn không có) với:

c.TerminalInteractiveShell.editing_mode = 'vi'

4
Tôi đến đây để gửi câu trả lời này - cảm ơn vì đánh bại tôi vào nó :)
Jason Sundram

2
Cảm ơn. Điều này rất khó tìm thấy ở bất kỳ đâu trong các tài liệu dành cho IPython, Jupyter hoặc prompt_toolkit.
thứ n

2
Tôi thêm ánh xạ liên kết khóa tùy chỉnh của mình ở đâu?
Aravinda

Câu trả lời của tôi cho câu hỏi này chỉ ra một cách để thêm các ràng buộc khóa tùy chỉnh.
jellycola

2
Có cách nào để theo dõi xem tôi đang ở chế độ bình thường hay chế độ chèn?
Peeyush Kushwaha

32

Có vẻ như một giải pháp phù hợp với nhiều ứng dụng tương thích với dòng đọc khác:

Đặt những điều sau trong ~/.inputrctệp của bạn :

set editing-mode vi
set keymap vi
set convert-meta on

Nguồn: http://www.jukie.net/bart/blog/20040326082602


7
Hãy rất cẩn thận với set convert-meta on. Nó xung đột với mục nhập unicode, vì vậy nếu bạn dán hoặc nhập unicode, bạn có thể kích hoạt các sự kiện khác nhau, điều này có thể gây ngạc nhiên. Ví dụ, hãy thử gõ ü, và bạn sẽ thấy một kết quả thú vị.
minrk

4
Bạn có biết hai dòng cuối có tác dụng gì không? Kiểm tra nhanh cho thấy rằng chỉ dòng đầu tiên cung cấp các liên kết chính vi cơ bản - tôi ước mình biết liệu có lý do gì để thêm các liên kết khác hay không.
weronika


@weronika Vì vậy, set convert-meta on(và bất kỳ thứ gì bên dưới dòng đó) sẽ chỉ áp dụng cho chế độ lệnh, không phải chế độ chèn.
s4y

6
Lưu ý: Tính năng này không còn hoạt động kể từ IPython 5.0.0. Xem câu trả lời của @ imiric bên dưới.
Jason Sundram

11

Bạn cũng có thể tương tác chuyển đổi giữa chế độ Vi-mode và chế độ Emacs. Theo tài liệu dòng đọc để chuyển đổi giữa chúng, bạn được cho là có thể sử dụng tổ hợp phím MCj nhưng điều đó dường như chỉ cho phép tôi chuyển sang chế độ vi - trên máy Mac của tôi (trong đó ESC được sử dụng làm phím 'Meta' ) nó là: ESC+ CTRL+ j. Để chuyển về chế độ Emacs, người ta có thể sử dụng Ce nhưng điều đó dường như không hiệu quả với tôi - thay vào đó tôi phải làm MCe - trên máy Mac của tôi, đó là: ESC+ CTRL+ e.

FYI my ~ / .inputrc được thiết lập như sau:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on

Tôi đã cố gắng tìm ra lý do tại sao MCj không hoạt động suốt thời gian qua!
shangxiao

9

ipythonsử dụng thư viện dòng đọc và điều này có thể định cấu hình bằng cách sử dụng ~/.inputrctệp. Bạn có thể thêm

set editing-mode vi

vào tệp đó để làm cho tất cả các readlineứng dụng dựa trên sử dụng liên kết khóa kiểu vi thay vì Emac.


9
ipythonđã chuyển từ readlinethư viện python được gọi prompt_toolkitvào 5.0.0để điều này không còn hoạt động.
jellycola

Cảm ơn, điều này rất hữu ích để xử lý phiên bản cũ của IPython.
timgeb

8

Tôi cần có thể chuyển đổi chế độ một cách tương tác trong IPython 5 và tôi thấy bạn có thể làm như vậy bằng cách tạo lại trình quản lý nhắc một cách nhanh chóng:

a = get_ipython().configurables[0]; a.editing_mode='vi'; a.init_prompt_toolkit_cli()

0

Bạn có thể đặt vi trong tệp cấu hình khởi động .ipython của mình. Tạo một tệp nếu bạn chưa có bằng cách thêm tệp vào ~/.ipython/profile_default/startup/tên giống như vậy start.py. Đây là một ví dụ:

# Initializing script for ipython in ~/.ipython/profile_default/startup/
from IPython import get_ipython
ipython = get_ipython()

# If in ipython, set vi and load autoreload extension
if 'ipython' in globals():
    ipython.editing_mode = 'vi'
    ipython.magic('load_ext autoreload')
    ipython.magic('autoreload 2')
from Myapp.models import * 

Dòng cuối cùng đó là nếu bạn sử dụng ipython với Django và muốn nhập tất cả các mô hình của mình theo mặc định.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.