Thanks for your comments, Thomas. Your questions and concerns are valid. The PR changes virtually every one of Leo's files, so it's worth discussing why any of those changes are worthwhile.
My initial posting did not cover many of the nuances, partly because I wasn't aware of some of them. The motivation for the PR follows.
Compatibility
Leo has been able to read "blackened" Python sentinel comments for at least several years. Such sentinels start with # @ instead of #@. In other words, blackened sentinels have exactly one space between the comment delimiter (#) and the sentinel marker (@). This space is the only difference between blackened sentinels and Leo's legacy sentinels.
The PR changes nothing about how Leo reads sentinels.
The only question is whether Leo will write blackened sentinels for Python files. That's all the PR changes. Previously, Leo wrote legacy sentinels by default. The -b, and --black-sentinels command-line options would cause Leo to write blackened sentinels. Again, only for Python files.
How should Leo write sentinels by default? The
--black-sentinels
command-line option isn't optimal. Instead, a new setting, say
@bool write-legacy-python-sentinels, will allow each outline to pick the default operation. The default (in leoSettings.leo) for this setting will be True, but leoPyRef.leo will specify using blackened sentinels.
In short, most users will see no change at all. However, Leo's own code base will use blackened sentinels. Furthermore, users will have more flexibility in choosing which of their external Python files will use blackened sentinels. The next section explains why these choices matter.
Why ruff format should replace Leo's beautify commands
The short answer is the ruff format (the speedy version of black) does a much better job of formatting Python code than Leo's homespun beautify commands. The difference is shocking. And it's more than a bit embarrassing that Leo's beautifier produces different results than does black.
I agree that the speed of the beautifier isn't paramount, but ruff format beats Leo's beautifier all ends up. It's shocking how much more convenient automatic formatting is. In contrast, Leo's beautifier only adjusts inter-token whitespace. That's not good enough. But to get the benefits of better formatting, users must accept blackened sentinels.
And there is one more important point to make. Leo's beautifier is token-based. It will probably break (or produce suboptimal results) whenever Python adds any new kind of token. This has happened in the past whenever Python adds a new kind of statement. It may well happen in the future. The present PR will preserve Leo's beautifier commands, but a later PR should remove them. Removing those commands will reduce the maintenance burden for future Leo devs, including myself. I'm really tired of tracking new Python language features.
Summary
Leo has been able to read blackened sentinels for several years. The PR does not change any of the underlying machinery.
Similarly, Leo's users have been able to choose whether Leo will write blackened sentinels via a command-line argument. The PR will remove that command-line argument in favor of a more flexible user setting. The default will be to write legacy sentinels.
I strongly prefer using ruff format to beautify Leo's code, but that's only possible for external files containing blackened sentinels. The advantages of using ruff format to beautify Leo's code are overwhelming. How did I ever live with the old way?
Finally, the PR changes almost all of Leo's files, but ruff format made most of the changes automatically. The PR will discuss all changes that I made by hand. In other words, the PR isn't as scary as it looks.
Edward