Making auto indentation work
See original GitHub issueAs noted in spike https://github.com/microsoft/vscode-python/issues/8669
There are three approaches to solve this:
1.
VSCode Language Configuration
VSCode provides OnEnterRules
and indentationRules
which dedents/indents the block given the previous line matches the regex. But regexes can’t be used to cover every case, and the current rules are not powerful enough. https://github.com/microsoft/vscode/issues/66235
Also sometimes just knowledge of previous line is not sufficient to make a decision on the indent.
2.
On-type indenting
When editor.formatOnType
is set to true
, one can intervene in between when a user types and indent accordingly. We currently use this in onEnterFormatter.ts
and other places. We can use this to cover all the cases one by one. But on-type formatting is not enabled by default nor is very popular (and enables a slew of formatting rules other than cursor alignment), so forcing users to enable on-type formatting as a whole would be good to avoid.
3.
Add a key binding for enter
We can add something like
"keybindings": [
{
"command": "<Command key>",
"key": "enter",
"when": "editorTextFocus && editorLangId == python"
}
],
(may need more modifying)
and use that to intervene. This way we don’t need to have editor.formatOnType
enabled. However we need to keep in mind that in this case we’re responsible for cursor alignment after the user presses enter, otherwise cursor would stay where it is.
As there is no progress on vscode upstream issues related to 1.
, ~going with 3.
makes the most sense at this point.~
https://github.com/kbrose/vsc-python-indent/blob/master/src/indent.ts seems like a wonderful place to take help from. It covers most cases (https://github.com/microsoft/vscode-python/issues/481) we currently have open issues for and is well documented. We can use npm package python-indent-parser
similarly to the way @kbrose does.
Also another thing to note here is that having both language configuration and key bindings can override each other sometimes. So we should be moving away from regexes when we solve work items for this.
EDIT: We’ve decided to go with 2.
Work items
- Turn on
editor.formatOnType
totrue
by default when using python language. - Modify
onEnterFormatter.ts
to support only indenting. (onTypeIndenting
) - Move
languageConfiguration.ts
to.json
. - ~Cut down regexes in language configuration so that it doesn’t conflict with
onTypeIndenting
.~ - Rules in
languageConfiguration.ts
may conflict withonTypeIndenting
. If you can identify such conflicts, turn off rules inlanguageConfiguration.ts
wheneditor.formatOnType
is set totrue
. - Look into how https://github.com/kbrose/vsc-python-indent/blob/master/src/indent.ts solves each of these issues. I’ve verified it works fine for most of these.
https://github.com/microsoft/vscode-python/issues/481 (function call)
https://github.com/microsoft/vscode-python/issues/684 (meta issue)
https://github.com/microsoft/vscode-python/issues/1314 (tests)
https://github.com/microsoft/vscode-python/issues/7344 (
async for
andasync with
) https://github.com/microsoft/vscode-python/issues/6886 (moving a line breaks things) https://github.com/microsoft/vscode-python/issues/3284 (trailing slash) https://github.com/microsoft/vscode-python/issues/16105 which was introduced when we removed theonEnterFormatter.ts
whenonType
formatting is on.
Note we also do dedenting when user presses semi-colon : https://github.com/Microsoft/vscode-python/blob/3c7bb774519ebf5aed91f90e10c7b8dd0fc567ec/src/client/typeFormatters/blockFormatProvider.ts#L25 Make sure these does not conflict with what Kbrose’s extension is doing.
Issue Analytics
- State:
- Created 4 years ago
- Reactions:13
- Comments:7
@J-Fields If you browse through the mentioned issues, we used to have
indentationRules
, and it caused a few bugs, so we decided to remove it. Also I am not sure if we can override their effect withformatOnType
, i.e I am not sure what happens when rules conflict.As
indentationRules
don’t support every indentation scenario, we can try addingindentationRules
after all the other work is done.I have not personally noticed any misbehaving on that front. The only issue I’ve received about unexpected behavior related to overriding
Enter
was related to the vim plugin, which I resolved here.