python - 履歴 - spyder ショートカット一覧




IPython 5.0とコンソールのキーバインディング (2)

IPythonの新しいリリースは、 readlineにはもう依存しませんが、純粋なPythonライブラリのprompt-toolkit使用して、AppleやWindowsのシステムでメンテナンスの問題を解決しています。

新しい機能は、複数行のコードブロックを編集する機能です。カーソルキーを使用してコードブロック内を自由に移動できます。この機能は、少なくとも私にとっては問題です。コード全体を通訳者に渡すには、ショートカットのalt + retを使うか、あまり便利でないキーシーケンスescと retを使用する必要があります。

なぜなら私の端末エミュレータはXTermであり、多くのLinuxディストリビューションでは、ショートカットalt + retはアプリケーションに渡されませんが、IPythonが実行されているXTermによって直接使用されます。 @ThomasDickey、xtermのmantainerと共著者は、デフォルトでは、Fullscreenアクションのバインドを解除しても、EnterにModifierビットをアプリケーションに送信する気にしないと指摘しています)。

このため、少なくともこの特定のIPythonキーバインディングを変更したいと思います。

私は、previouosバージョン、 readlineベースのもの、新しい、5.0バージョンには当てはまらないIPythonの指示(ある種のもの)を見つけました。

私が必要とするのは、IPythonのユーザードキュメントで、バインドできるアクションの名前、アクションにバインドするショートカットの名前、および新しいキーバインディングを設定するための手順を見つけるための指示です。

このタイプの標準的な答え得られない場合は 、この特定のキーバインドを達成するためのレシピに満足しているかもしれません。レシピがIPython 6.0でも動作するという条件です


prompt_toolkitを使用しているときに設定のキーボードショートカットを変更することは(まだ)可能ではありません。 ソースからIPythonをインストールするとかなり簡単です。 ファイルIPython/terminal/shortcuts.pyを見ると、それにはさまざまなロジックが含まれていることがわかります。 特に見つけることができます:

# Ctrl+J == Enter, seemingly
registry.add_binding(Keys.ControlJ,
                     filter=(HasFocus(DEFAULT_BUFFER)
                             & ~HasSelection()
                             & insert_mode
                    ))(newline_or_execute_outer(shell))

これは、新しい行を追加する関数newline_or_execute_outer CtrlJ(enter)をバインドします。 後でファイル内で定義します。 特に、コードブロックの最後にEnterキーを2回押すと、他のショートカットを使用する必要はなく、ブロックを実行する必要があります。

新しい行を追加するロジックを削除する:

def execute_outer(shell):
    def execute(event):
        """When the user presses return, insert a newline or execute the code."""
        b = event.current_buffer

        # some logic to also dismiss the completer

        b.accept_action.validate_and_handle(event.cli, b)
    return execute

20行目にバインドしてください:

registry.add_binding(Keys.ControlE,
                     filter=(HasFocus(DEFAULT_BUFFER)
                             & ~HasSelection()
                             & insert_mode
                    ))(execute_outer(shell))

そしてお楽しみください。 ドキュメンテーションに不満がある場合は、ヘルプを歓迎します。 たとえば、回答の要点を取り上げて返信します。 リリースノートでは、厳しいコメントを読むのは少し怪しいです。

New terminal interface

The overhaul of the terminal interface will probably cause a range of minor
issues for existing users. This is inevitable for such a significant
change, and we’ve done our best to minimise these issues. Some changes that
we’re aware of, with suggestions on how to handle them:

IPython no longer uses readline configuration (~/.inputrc). We hope that
the functionality you want (e.g. vi input mode) will be available by
configuring IPython directly (see Terminal IPython options). If something’s
missing, please file an issue.

...

実際にIPythonを改良して、アクション名で設定可能なキーバインディングを持たせることもできますので、あなた自身の質問に答えることができます。


xtermの設定を変更することができます。

xtermは構成可能であり、文書化されています。 xtermマニュアルでは、「 デフォルトのキーバインディング」セクションに、このキーのデフォルトのバインディングが表示されます。

                        Alt <Key>Return:fullscreen() \n\

そのバインディングを複数の方法で抑制することができます。

  • omitTranslationリソースを使用して機能を抑制する
  • fullscreenリソースをnever設定する

しかし、それを抑止しても何か興味深いものを送ることはできません(xtermはEnterの修飾子を無視します)。 translationリソースの設定は、たとえば$HOME/.Xdefaultsファイルで行います:

*VT100*translations:      #override \n\ 
     Alt <Key>Return: string("\033[27;3;13~")






xterm