* nix下のipythonでviキーを使用するにはどうすればよいですか?


94

現在Bash set -o viでは、bashプロンプトでviモードを有効にするために使用しています。

これをipythonで実行するにはどうすればよいですか?

注:すべての* nixに回答が当てはまる場合は、タイトルからOS Xを削除します:)

回答:


165

最近誰かがここをさまよう場合、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 2016

この質問に対する私の回答は、カスタムキーバインディングを追加する1つの方法を示しています。
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
最後の2行が何をするか知っていますか?簡単なチェックで、最初の行だけで基本的なviキー割り当てが示されていることがわかります。他の行を追加する理由があったかどうかを知りたいのですが。
ウェロニカ


@weronikaしたがって、set convert-meta on(およびその行の下にあるものはすべて)コマンドモードにのみ適用され、挿入モードには適用されません。
s4y 2013

6
注:これはIPython 5.0.0以降では機能しません。以下の@imiricの回答を参照してください。
Jason Sundram

11

ViモードとEmacsモードをインタラクティブに切り替えることもできます。readline docsによると、それらを切り替えるにはMCjキーの組み合わせを使用できるはずですが、それだけでviモードに切り替えることができます-私のMac(ESCが「Meta」キーとして使用されている場合) )それは:ESC+ CTRL+ + jです。Emacsモードに切り替えるには、Ceを使用できますが、私には機能しないようでした。代わりにMCeを実行する必要がありました-Macの場合:ESC+ CTRL+ e

ちなみに私の〜/ .inputrcは次のように設定されています:

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

MCjがこの間ずっと機能しなかった理由を突き止めようと努めてきました。
shangxiao 2015

9

ipythonreadlineライブラリを使用し、これは~/.inputrcファイルを使用して設定可能です。あなたは付け加えられます

set editing-mode vi

すべてのreadlineベースのアプリケーションがEmacsの代わりにviスタイルのキー割り当てを使用するように、そのファイルに追加します。


9
ipythonからreadline呼び出されるpythonライブラリに切り替えprompt_toolkit5.0.0ため、これは機能しなくなりました。
jellycola

おかげで、これはIPythonの古いバージョンを扱うのに非常に役立ちました。
timgeb

8

IPython 5でインタラクティブにモードを切り替えることができるようにする必要がありましたが、プロンプトマネージャーをオンザフライで再作成することで切り替えできることがわかりました。

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

0

.ipython起動設定ファイルでviを設定できます。ない場合は、の~/.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 * 

最後の行は、Djangoでipythonを使用していて、デフォルトですべてのモデルをインポートする場合です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.