Jak używać klawiszy vi w ipythonie pod * nix?

97

Obecnie w Bash używam, set -o viaby włączyć tryb vi w moim znaku zachęty basha.

Jak mam to zrobić w Ipythonie?

Uwaga: jeśli odpowiedź dotyczy wszystkich * nix, usunę OS X z tytułu :)

gak
źródło

Odpowiedzi:

170

W przypadku, gdy ktoś tu ostatnio błąkał, IPython 5.0 przełączył się z readline na prompt_toolkit , więc zaktualizowaną odpowiedzią na to pytanie jest podanie opcji:

$ ipython --TerminalInteractiveShell.editing_mode=vi

... lub ustawić go globalnie w konfiguracji profilu ( ~/.ipython/profile_default/ipython_config.py; utwórz go, ipython profile createjeśli go nie masz) za pomocą:

c.TerminalInteractiveShell.editing_mode = 'vi'
imiryczny
źródło
4
Przyszedłem, aby opublikować tę odpowiedź - dzięki za pokonanie mnie :)
Jason Sundram
2
Dzięki. Jest to irytująco trudne do znalezienia w dowolnym miejscu dokumentacji dla IPython, Jupyter lub prompt_toolkit.
nth
2
Gdzie mogę dodać własne mapowania powiązań klawiszy?
Aravinda,
Moja odpowiedź na to pytanie pokazuje jeden ze sposobów dodawania niestandardowych powiązań klawiszy.
jellycola
2
Czy jest jakiś sposób, aby śledzić, czy jestem w trybie normalnym, czy w trybie wstawiania?
Peeyush Kushwaha
32

Wygląda na to, że rozwiązanie działa w przypadku wielu innych aplikacji zgodnych z Readline:

Ustaw w ~/.inputrcpliku:

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

Źródło: http://www.jukie.net/bart/blog/20040326082602

gak
źródło
7
Bądź bardzo ostrożny set convert-meta on. Koliduje z wpisem Unicode, więc jeśli wkleisz lub wpiszesz Unicode, możesz wywołać różne zdarzenia, co może być zaskakujące. Na przykład spróbuj wpisać ü, a zobaczysz interesujący wynik.
minrk
4
Czy wiesz, co robią ostatnie dwie linijki? Szybkie sprawdzenie pokazuje, że tylko pierwsza linia podaje podstawowe skróty klawiszowe vi - chciałbym wiedzieć, czy był powód, aby dodać pozostałe.
weronika
@weronika Tak więc set convert-meta on(i wszystko poniżej tej linii) będzie dotyczyło tylko trybu poleceń, a nie trybu wstawiania.
s4y
6
Uwaga: to już nie działa od wersji IPython 5.0.0. Zobacz odpowiedź @ imiric poniżej.
Jason Sundram
11

Możesz także interaktywnie przełączać się między trybami Vi i Emacs. Zgodnie z dokumentacją readline, aby przełączać się między nimi, powinieneś być w stanie użyć kombinacji klawiszy MCj, ale wydaje mi się, że pozwala mi to tylko przejść do trybu vi - na moim Macu (gdzie klawisz ESC jest używany jako klawisz „Meta” ) to: ESC+ CTRL+ j. Aby wrócić do trybu Emacsa, można użyć Ce, ale to nie działa dla mnie - zamiast tego musiałem zrobić MCe - na moim Macu jest to: ESC+ CTRL+ e.

FYI mój ~ / .inputrc jest skonfigurowany w następujący sposób:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
Pierz
źródło
Próbowałem dowiedzieć się, dlaczego MCj nie działa przez cały ten czas!
shangxiao
9

ipythonużywa biblioteki readline i można to skonfigurować za pomocą ~/.inputrcpliku. Możesz dodać

set editing-mode vi

do tego pliku, aby wszystkie readlineaplikacje oparte na nim używały skrótów klawiszowych w stylu vi zamiast Emacsa.

Noufal Ibrahim
źródło
9
ipythonprzełączane z readlinedo biblioteki Pythona o nazwie prompt_toolkitw 5.0.0tak to już nie działa.
jellycola
Dzięki, było to bardzo przydatne do radzenia sobie ze starą wersją IPythona.
timgeb
8

Musiałem mieć możliwość interaktywnego przełączania trybów w IPython 5 i odkryłem, że możesz to zrobić, odtwarzając menedżera monitów w locie:

a = get_ipython().configurables[0]; a.editing_mode='vi'; a.init_prompt_toolkit_cli()
Lex R.
źródło
0

Możesz ustawić vi w swoim pliku konfiguracyjnym .ipython start-up. Utwórz go, jeśli go nie masz, dodając plik o ~/.ipython/profile_default/startup/nazwie podobnej do start.py. Oto przykład:

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

Ta ostatnia linia dotyczy sytuacji, gdy używasz ipython z Django i chcesz domyślnie importować wszystkie swoje modele.

gregory
źródło