Ipython: タブのオートコンプリートをctrl-spaceに変更します

作成日 2017年04月11日  ·  4コメント  ·  ソース: ipython/ipython

こんにちは、

オートコンプリートのキーバインディングをctrl-spaceに変更したいと思います。 私はここでそれについて読みました: http: //ipython.readthedocs.io/en/latest/config/details.html#keyboard-shortcuts。 しかし、私はそれをどのように行うのかわかりません。

最も参考になるコメント

基本的に、プロファイル内のスタートアップファイルにこのコードを追加する必要があります。

from prompt_toolkit.keys import Keys
from prompt_toolkit.key_binding.bindings.completion import generate_completions

ip = get_ipython()
bind_key = ip.pt_cli.application.key_bindings_registry.add_binding
bind_key(Keys.ControlSpace)(generate_completions)

ただし、コードを実行する前に、PTKを使用してターミナルを実行していることを常に確認する必要があります。 このようなものが機能するはずです:

def register_bindings():

    from prompt_toolkit.keys import Keys
    from prompt_toolkit.key_binding.bindings.completion import generate_completions

    bind_key = ip.pt_cli.application.key_bindings_registry.add_binding
    bind_key(Keys.ControlSpace)(generate_completions)

ip = get_ipython()
if getattr(ip, "pt_cli"): register_bindings()
del register_bindings

注:登録ロジックをifブロックに入れることもできますが、関数を使用すると、 bind_keyの名前が​​セッションの名前空間に漏れるのを防ぐことができます。 多数のバインディングとカスタムフィルターを定義すると、手動で削除しなければならない非常に多くの名前が作成されることになります。 すべてを関数に入れてから、関数の名前を削除する方が簡単です。 上記の単純なケースでは、ifブロックの方がおそらく良いでしょう。

全てのコメント4件

基本的に、プロファイル内のスタートアップファイルにこのコードを追加する必要があります。

from prompt_toolkit.keys import Keys
from prompt_toolkit.key_binding.bindings.completion import generate_completions

ip = get_ipython()
bind_key = ip.pt_cli.application.key_bindings_registry.add_binding
bind_key(Keys.ControlSpace)(generate_completions)

ただし、コードを実行する前に、PTKを使用してターミナルを実行していることを常に確認する必要があります。 このようなものが機能するはずです:

def register_bindings():

    from prompt_toolkit.keys import Keys
    from prompt_toolkit.key_binding.bindings.completion import generate_completions

    bind_key = ip.pt_cli.application.key_bindings_registry.add_binding
    bind_key(Keys.ControlSpace)(generate_completions)

ip = get_ipython()
if getattr(ip, "pt_cli"): register_bindings()
del register_bindings

注:登録ロジックをifブロックに入れることもできますが、関数を使用すると、 bind_keyの名前が​​セッションの名前空間に漏れるのを防ぐことができます。 多数のバインディングとカスタムフィルターを定義すると、手動で削除しなければならない非常に多くの名前が作成されることになります。 すべてを関数に入れてから、関数の名前を削除する方が簡単です。 上記の単純なケースでは、ifブロックの方がおそらく良いでしょう。

出来た! 早く返事をくれてありがとう!

上記を実行しようとすると、 AttributeError: 'TerminalInteractiveShell' object has no attribute 'pt_cli'ます。 これは既知の問題ですか?

キーボードショートカットのユーザー設定に次のように記述します

{
    "shortcuts":[
        {
            "command": "completer:invoke-file",
            "keys": [
                "Ctrl Space"
            ],
            "selector": ".jp-FileEditor .jp-mod-completer-enabled"
        },
        {
            "command": "completer:invoke-file",
            "keys": [
                "Ctrl Space"
            ],
            "selector": ".jp-FileEditor .jp-mod-completer-enabled"
        },
        {
            "command": "completer:invoke-notebook",
            "keys": [
                "Ctrl Space"
            ],
            "selector": ".jp-Notebook.jp-mod-editMode .jp-mod-completer-enabled"
        }

    ]
}
このページは役に立ちましたか?
0 / 5 - 0 評価