ฉันจะใช้คีย์ vi ใน ipython ภายใต้ * nix ได้อย่างไร


97

ขณะนี้อยู่ใน Bash ฉันใช้set -o viเพื่อเปิดใช้งานโหมด vi ใน bash prompt ของฉัน

ฉันจะทำสิ่งนี้ใน ipython ได้อย่างไร

หมายเหตุ:หากคำตอบใช้ได้กับ * nix ทั้งหมดฉันจะลบ OS X ออกจากชื่อเรื่อง :)

คำตอบ:


171

ในกรณีที่มีคนหลงเข้ามาที่นี่เมื่อเร็ว ๆ นี้IPython 5.0 ได้เปลี่ยนจาก readline เป็น prompt_toolkitดังนั้นคำตอบที่อัปเดตสำหรับคำถามนี้คือการส่งตัวเลือก:

$ ipython --TerminalInteractiveShell.editing_mode=vi

... หรือตั้งค่าทั่วโลกในการกำหนดค่าโปรไฟล์ ( ~/.ipython/profile_default/ipython_config.pyสร้างด้วยipython profile createถ้าคุณไม่มี) ด้วย:

c.TerminalInteractiveShell.editing_mode = 'vi'

4
ฉันมาที่นี่เพื่อโพสต์คำตอบนี้ - ขอบคุณที่เอาชนะฉัน :)
Jason Sundram

2
ขอบคุณ. นี่เป็นเรื่องยากที่จะหาที่ใดก็ได้ในเอกสารสำหรับ IPython, Jupyter หรือ prompt_toolkit
ที่ n

2
ฉันจะเพิ่มการจับคู่คีย์แบบกำหนดเองได้ที่ไหน
Aravinda

คำตอบของฉันสำหรับคำถามนี้แสดงวิธีหนึ่งในการเพิ่มการผูกคีย์ที่กำหนดเอง
jellycola

2
มีวิธีใดบ้างในการติดตามว่าฉันอยู่ในโหมดปกติหรือโหมดแทรก?
Peeyush Kushwaha

32

ดูเหมือนว่าโซลูชันจะใช้ได้กับแอพที่เข้ากันได้กับ Readline อื่น ๆ อีกมากมาย:

ตั้งค่าสิ่งต่อไปนี้ใน~/.inputrcไฟล์ของคุณ:

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

ที่มา: http://www.jukie.net/bart/blog/20040326082602


7
จะมากset convert-meta onระวังด้วย มันขัดแย้งกับรายการ Unicode ดังนั้นหากคุณวางหรือพิมพ์ Unicode คุณสามารถทริกเกอร์เหตุการณ์ต่างๆได้ซึ่งอาจน่าแปลกใจ ตัวอย่างเช่นลองพิมพ์üแล้วคุณจะเห็นผลลัพธ์ที่น่าสนใจ
minrk

4
คุณรู้หรือไม่ว่าสองบรรทัดสุดท้ายทำอะไร? การตรวจสอบอย่างรวดเร็วแสดงให้เห็นว่าเพียงบรรทัดแรกให้การเชื่อมโยงคีย์ vi พื้นฐาน - ฉันหวังว่าฉันจะรู้ว่ามีเหตุผลที่จะเพิ่มคำอื่น ๆ หรือไม่
weronika

1
@weronika ดูเหมือนว่าset keymap viการเปลี่ยนแปลงที่ keymap (โหมด IE) ดังต่อไปนี้คำสั่งจะมีผลต่อและเปลี่ยนแปลงวิธีการบางปุ่มประพฤติset convert-meta on ฉันไม่แน่ใจว่าคุณต้องการหรือเปล่า
s4y

@weronika ดังนั้นset convert-meta on(และสิ่งที่อยู่ใต้บรรทัดนั้น) จะใช้กับโหมดคำสั่งเท่านั้นไม่ใช่โหมดแทรก
s4y

6
หมายเหตุ: สิ่งนี้ใช้ไม่ได้กับ IPython 5.0.0 อีกต่อไป ดูคำตอบของ @ imiric ด้านล่าง
Jason Sundram

11

คุณยังสามารถสลับแบบโต้ตอบระหว่างโหมด Vi-mode และโหมด Emacs ตามเอกสาร readlineเพื่อสลับไปมาคุณควรจะสามารถใช้คีย์ผสม MCj ได้ แต่ดูเหมือนว่าจะอนุญาตให้ฉันเปลี่ยนเป็นโหมด vi เท่านั้น - บน Mac ของฉัน (โดยที่ ESC ใช้เป็นคีย์ 'Meta' ) ESCคือ: CTRL+ j+ เพื่อสลับกลับไป Emacs โหมดหนึ่งสามารถใช้ Ce แต่ที่ไม่ปรากฏในการทำงานสำหรับฉัน - ฉันจะต้องทำแทน MCE - บน Mac ของฉันมันเป็น: ESC+ +CTRLe

FYI my ~ / .inputrc ถูกตั้งค่าดังนี้:

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

ฉันพยายามหาคำตอบว่าทำไม MCj ถึงไม่ทำงานตลอดเวลา!
shangxiao

9

ipythonใช้ไลบรารี readline และสามารถกำหนดค่าได้โดยใช้~/.inputrcไฟล์ คุณสามารถเพิ่ม

set editing-mode vi

ไปยังไฟล์นั้นเพื่อให้readlineแอปพลิเคชันที่ใช้ทั้งหมดใช้การเชื่อมโยงคีย์สไตล์ vi แทน Emacs


9
ipythonเปลี่ยนจากreadlineไลบรารี python ที่เรียกprompt_toolkitเข้า5.0.0ดังนั้นจึงไม่สามารถใช้งานได้อีกต่อไป
jellycola

ขอบคุณสิ่งนี้มีประโยชน์มากสำหรับการจัดการกับ IPython เวอร์ชันเก่า
timgeb

8

ฉันต้องการที่จะสามารถสลับโหมดโต้ตอบใน IPython 5 และฉันพบว่าคุณสามารถทำได้โดยการสร้างตัวจัดการพร้อมต์ใหม่ทันที:

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

0

คุณสามารถตั้งค่า vi ในไฟล์กำหนดค่าเริ่มต้น. ipython ของคุณ สร้างไฟล์ถ้าคุณไม่มีโดยเพิ่มไฟล์ที่~/.ipython/profile_default/startup/เรียกว่าstart.py. นี่คือตัวอย่าง:

# 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 * 

บรรทัดสุดท้ายคือถ้าคุณใช้ ipython กับ Django และต้องการนำเข้าโมเดลทั้งหมดของคุณตามค่าเริ่มต้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.