Title: InteractiveConsole does not support arrow buttons · Issue #109108 · python/cpython · GitHub
Open Graph Title: InteractiveConsole does not support arrow buttons · Issue #109108 · python/cpython
X Title: InteractiveConsole does not support arrow buttons · Issue #109108 · python/cpython
Description: Feature or enhancement Proposal: Hello! The InteractiveConsole class is defined in the code module. Its behavior is different from a normal console, and I don't see an easy way to replicate this. The fact is that a regular Python REPL is...
Open Graph Description: Feature or enhancement Proposal: Hello! The InteractiveConsole class is defined in the code module. Its behavior is different from a normal console, and I don't see an easy way to replicate this. T...
X Description: Feature or enhancement Proposal: Hello! The InteractiveConsole class is defined in the code module. Its behavior is different from a normal console, and I don't see an easy way to replicate thi...
Opengraph URL: https://github.com/python/cpython/issues/109108
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"InteractiveConsole does not support arrow buttons","articleBody":"# Feature or enhancement\r\n\r\n### Proposal:\r\n\r\nHello!\r\n\r\nThe InteractiveConsole class is defined in the [code](https://docs.python.org/3/library/code.html) module. Its behavior is different from a normal console, and I don't see an easy way to replicate this.\r\n\r\nThe fact is that a regular Python REPL is able to understand that the \"up arrow\" button was pressed and get a line of text from the input history. Similarly, REPL understands that the \"down arrow\" has been pressed, which allows navigation through the input history.\r\n\r\nI see that the [standard implementation](https://github.com/python/cpython/blob/74fc96bc60f5c02bde50ff2f3516add99483e402/Lib/code.py#L265C5-L265C36) of this class allows you to override the method for text input:\r\n\r\n```python\r\ndef raw_input(self, prompt=\"\"):\r\n \"\"\"Write a prompt and read a line.\r\n\r\n The returned line does not include the trailing newline.\r\n When the user enters the EOF key sequence, EOFError is raised.\r\n\r\n The base implementation uses the built-in function\r\n input(); a subclass may replace this with a different\r\n implementation.\r\n\r\n \"\"\"\r\n return input(prompt)\r\n```\r\n\r\nHowever, the standard library does not provide an easy way to implement input with the arrows pressed.\r\n\r\nMy suggestion is to complicate the internal implementation of the class by adding 2 additional methods there:\r\n\r\n```python\r\ndef pressed_up(self, buffer: list) -\u003e bool:\r\n return False\r\n\r\ndef pressed_down(self, buffer: list) -\u003e bool:\r\n return False\r\n```\r\n\r\nThese methods should not do anything by default, but the user should be able to override them in order to add any actions related to pressing the arrows, for example, to call a line from the input history. \r\n\r\nThese methods should return a boolean value that answers the question \"do I need to finish typing when the arrow is pressed?\". If the answer is `True`, then the `raw_input` function should return a string that it concatenates from the characters in the buffer (the list that is passed to the input methods pressed_up and pressed_down). If the answer is `False`, the `raw_input` function should continue to read the input characters through stdout and put them into the buffer until it encounters a newline character.\r\n\r\nAt the same time, the function and external behavior of the `raw_input` method for the entire surrounding code should not change as a result of all these modifications. It should still return the string read from `stdin`. Only the internal implementation changes, which allows callbacks called when pressing special buttons on the keyboard to interact with the buffer of already entered characters and change it.\r\n\r\nThere is an alternative implementation of the same functionality. You can add only one additional method:\r\n\r\n```python\r\nfrom enum import Enum\r\n\r\nclass PressedButton(Enum):\r\n up = 1\r\n down = 2\r\n esc = 3\r\n ...\r\n\r\ndef pressed_button(self, buffer: list, button_index: PressedButton) -\u003e bool:\r\n return False\r\n```\r\n\r\nIn this case, each time a button is pressed on a keyboard that does not represent a letter, the same callback is called, and in addition to the buffer (which does not differ from the previous version), an indicator of which button was pressed is transmitted there. All possible button options should be presented in the form of an `enum`, which the user should be able to import from the module.\r\n\r\nThis mechanism is more general, but I assume that it may be a little more difficult to implement, and so far I don't see any useful ways to apply the additional features that it provides.\r\n\r\n\r\n### Has this already been discussed elsewhere?\r\n\r\nThis is a minor feature, which does not need previous discussion elsewhere\r\n\r\n### Links to previous discussion of this feature:\r\n\r\n_No response_","author":{"url":"https://github.com/pomponchik","@type":"Person","name":"pomponchik"},"datePublished":"2023-09-07T19:39:40.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":2},"url":"https://github.com/109108/cpython/issues/109108"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:bff49acc-205a-4a4d-8186-0c421f72d703 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | E9FE:2F21B4:50E6CE:688886:696B0DA4 |
| html-safe-nonce | 21ac3a39aac731c93227f1cdd7f65c05a9fe243621279db8d49499a4a965cc66 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFOUZFOjJGMjFCNDo1MEU2Q0U6Njg4ODg2OjY5NkIwREE0IiwidmlzaXRvcl9pZCI6IjE4MDM4NDQ2MjIwODU3MjE1MDgiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | cd7e77ef2eab57c1e4bcc9a7e18a3ae41b09441d0579507cbc69b60505f16356 |
| hovercard-subject-tag | issue:1886469613 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/109108/issue_layout |
| twitter:image | https://opengraph.githubassets.com/32e7795f3ea3b065a7db866747a5baac744cd5b97231d9420c47cf4153299e63/python/cpython/issues/109108 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/32e7795f3ea3b065a7db866747a5baac744cd5b97231d9420c47cf4153299e63/python/cpython/issues/109108 |
| og:image:alt | Feature or enhancement Proposal: Hello! The InteractiveConsole class is defined in the code module. Its behavior is different from a normal console, and I don't see an easy way to replicate this. T... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | pomponchik |
| hostname | github.com |
| expected-hostname | github.com |
| None | 5f99f7c1d70f01da5b93e5ca90303359738944d8ab470e396496262c66e60b8d |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 82560a55c6b2054555076f46e683151ee28a19bc |
| ui-target | canary-2 |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width