Подтвердить что ты не робот

IPython 5.0 и привязки клавиш в консоли

Новая версия IPython больше не зависит от readline, но использует чистую библиотеку Python prompt-toolkit, решая проблемы обслуживания в системах Apple и Windows.

Новая функция - это возможность редактировать многострочный блок кода, используя клавиши курсора, чтобы свободно перемещаться в блоке кода - с этой силой он приходит, по крайней мере, для меня, проблемой: поскольку вставки ret новую строку в вашем коде, чтобы передать весь блок интерпретатору, вы должны использовать ярлык alt + ret или, возможно, менее удобную последовательность клавиш esc, за которой следует ret.

Я говорю, это проблема, потому что мой эмулятор терминала - это XTerm, и во многих дистрибутивах Linux ярлык alt + ret не передается в приложение, но он напрямую используется XTerm в котором запущен IPython, для переключения полноты экрана упомянутого терминала (@ThomasDickey, xterm mantainer и соавтор указали, что по умолчанию xterm не хочет отправлять в приложение бит модификатора на Enter, даже если один отвязывает действие Fullscreen).

По этой причине я хотел бы изменить хотя бы эту специфическую привязку ключа IPython.

Я нашел инструкции (вроде) для версий previouos, основанных на readline, IPython, которые не относятся к новой версии 5.0.

Мне понадобятся инструкции, которые приводят меня к поиску в документации пользователя IPython имен возможных действий, которые я могу связать, имена ярлыков для привязки к действиям и процедуры, которые необходимо выполнить для настройки новой привязка клавиш.

Не имея такого канонического ответа, я могу быть доволен рецептом, чтобы выполнить эту специфическую привязку с условием, что рецепт все еще работает в IPython 6.0

4b9b3361

Ответ 1

Вы можете изменить конфигурацию xterm.

xterm настраивается (и документируется). В руководстве xterm раздел Default Key Bindings показывает привязку по умолчанию для этого ключа:

                        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~")

Ответ 2

Клавиши ctrl + j или ctrl + m проверяют запись.

Ответ 3

Изменение сочетаний клавиш в конфигурации при использовании 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))

Это связывает CtrlJ (ввод) с функцией newline_or_execute_outer, которая отвечает за добавление новых строк; он определяет позже в файле. В частности, если вы нажмете дважды в конце блока кода, он должен выполнить блок без необходимости использовать любые другие ярлыки.

Разделите логику, добавляющую новые строки:

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

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, чтобы иметь настраиваемый keybinding с именем действия, также приветствуется, поэтому вы сможете ответить на свой собственный вопрос.