Bagaimana cara menggunakan kunci vi di ipython di bawah * nix?


95

Saat ini di Bash saya gunakan set -o viuntuk mengaktifkan mode vi di prompt bash saya.

Bagaimana cara melakukannya di ipython?

Catatan: Jika jawaban berlaku untuk semua * nix, saya akan menghapus OS X dari judul :)

Jawaban:


166

Jika seseorang baru-baru ini berkeliaran di sini, IPython 5.0 beralih dari readline ke prompt_toolkit , jadi jawaban yang diperbarui untuk pertanyaan ini adalah memberikan opsi:

$ ipython --TerminalInteractiveShell.editing_mode=vi

... atau untuk menyetelnya secara global dalam konfigurasi profil ( ~/.ipython/profile_default/ipython_config.py; buat dengan ipython profile createjika Anda tidak memilikinya) dengan:

c.TerminalInteractiveShell.editing_mode = 'vi'

4
Saya datang ke sini untuk memposting jawaban ini - terima kasih telah mengalahkan saya :)
Jason Sundram

2
Terima kasih. Ini sangat sulit ditemukan di mana pun di dokumen untuk IPython, Jupyter, atau prompt_toolkit.
n

2
Di mana saya menambahkan pemetaan pengikatan kunci khusus saya?
Aravinda

Jawaban saya untuk pertanyaan ini menunjukkan satu cara untuk menambahkan binding kunci kustom.
jellycola

2
Apakah ada cara untuk melacak jika saya dalam mode normal atau mode sisipan?
Peeyush Kushwaha

32

Sepertinya solusi berfungsi untuk banyak aplikasi lain yang kompatibel dengan garis baca:

Setel yang berikut di ~/.inputrcfile Anda :

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

Sumber: http://www.jukie.net/bart/blog/20040326082602


7
Berhati - hatilah set convert-meta on. Ini bentrok dengan entri unicode, jadi jika Anda menempel atau mengetik unicode, Anda dapat memicu berbagai peristiwa, yang mungkin mengejutkan. Misalnya, coba ketik ü, dan Anda akan melihat hasil yang menarik.
minrk

4
Tahukah Anda apa yang dilakukan dua baris terakhir? Pemeriksaan cepat menunjukkan bahwa hanya baris pertama yang memberikan keybindings vi dasar - Seandainya saya tahu apakah ada alasan untuk menambahkan yang lain.
weronika

1
@weronika Sepertinya set keymap viperubahan peta kunci mana (yaitu mode) yang akan dipengaruhi oleh perintah berikut , dan set convert-meta onmengubah perilaku beberapa kunci . Saya tidak yakin apakah Anda membutuhkannya.
s4y

@weronika Jadi, set convert-meta on(dan apa pun di bawah baris itu) hanya akan berlaku untuk mode perintah, bukan mode sisipkan.
s4y

6
Catatan: Ini tidak lagi berfungsi pada IPython 5.0.0. Lihat jawaban @imiric di bawah ini.
Jason Sundram

11

Anda juga dapat secara interaktif beralih antara mode Vi dan mode Emacs. Menurut dokumen readline untuk beralih di antara mereka, Anda seharusnya dapat menggunakan kombinasi tombol MCj tetapi itu hanya memungkinkan saya untuk beralih ke mode-vi - di Mac saya (di mana ESC digunakan sebagai tombol 'Meta' ) itu adalah: ESC+ CTRL+ j. Untuk beralih kembali ke mode Emacs, seseorang dapat menggunakan Ce tetapi tampaknya tidak berhasil untuk saya - saya malah harus melakukan MCe - di Mac saya: ESC+ CTRL+ e.

FYI ~ / .inputrc saya diatur sebagai berikut:

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

Saya sudah mencoba mencari tahu mengapa MCj tidak bekerja selama ini!
shangxiao

9

ipythonmenggunakan pustaka readline dan ini dapat dikonfigurasi menggunakan ~/.inputrcfile. Anda dapat menambahkan

set editing-mode vi

ke file tersebut untuk membuat semua readlineaplikasi berbasis menggunakan keybindings gaya vi sebagai ganti Emacs.


9
ipythonberalih dari readlineperpustakaan python disebut prompt_toolkitdalam 5.0.0jadi ini tidak lagi bekerja.
jellycola

Terima kasih, ini sangat berguna untuk menangani versi lama IPython.
timgeb

8

Saya harus dapat beralih mode secara interaktif di IPython 5 dan saya menemukan Anda dapat melakukannya dengan membuat ulang manajer cepat dengan cepat:

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

0

Anda dapat mengatur vi di file konfigurasi start-up .ipython. Buat satu jika Anda tidak memilikinya dengan menambahkan file ke ~/.ipython/profile_default/startup/bernama sesuatu seperti start.py. Berikut contohnya:

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

Baris terakhir itu adalah jika Anda menggunakan ipython dengan Django, dan ingin mengimpor semua model Anda secara default.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.