gh-133710: Enhance pyrepl auto-indent#140710
Open
tanloong wants to merge 11 commits intopython:mainfrom
Open
Conversation
ambv
reviewed
Jan 5, 2026
Lib/_pyrepl/readline.py
Outdated
Comment on lines
297
to
302
| # update stack | ||
| if char in "\"'" and (i == 0 or buffer[i - 1] != "\\"): | ||
| if str_delims and str_delims[-1] == char: | ||
| str_delims.pop() | ||
| else: | ||
| str_delims.append(char) |
Contributor
There was a problem hiding this comment.
You'd also have to add f-string and t-string support to that. So you'd have to parse braces, but only if they're not escaped and they're in the right string prefixes.
At this stage, I'm afraid this function will balloon into a poor reimplementation of a decent chunk of the tokenizer. But we already use the tokenizer properly for syntax highlighting. We even have specific functionality to discover unterminated multiline strings.
Look at _pyrepl.utils and think about how that could be reused here instead of the manual approach.
Contributor
Author
There was a problem hiding this comment.
Thanks for your review! I have made the change to rely on _pyrepl.utils.gen_colors for a tokenizer-based parsing of strings and comments.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This modifies
_should_auto_indent()to scan characters from the start of the buffer up to the target positionpos, tracking context to ignore irrelavant content within strings, then checks if the conditions for auto-indent are met.It uses a stack (
str_delims) to track quotes ("or'). When inside a string (stack not empty), characters like#or:are treated as literal text and are ignored. A flag (in_comment) marks when a#(not inside a string) has been encountered, ignoring all subsequent characters on that line as comment text. It tracks the indentation level of the last non-whitespace character (lastchar_line_indent), which helps ensure the colon is at a valid indentation level to trigger auto-indent.The function returns
Trueif the last non-whitespace character (outside comments/strings) is a colon (:), and the indentation level of the line whereposresides is not greater than the indentation of that colon.Hi @wiggin15, as this
_should_auto_indent()function is modified based on your original implementation (#119606), if you could help review when you have some spare time, I would be really appreciated.