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 :)

gak
sumber

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'
imiric
sumber
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

gak
sumber
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
Pierz
sumber
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.

Noufal Ibrahim
sumber
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()
Lex R
sumber
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.

gregory
sumber