diff options
| author | Maxime Coste <mawww@kakoune.org> | 2024-06-11 19:33:33 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2024-06-11 19:33:33 +1000 |
| commit | 17c25cc86a6bf4779f58fe2d2a5c13147bb27f2b (patch) | |
| tree | fb3eff03e900644329c918900e5ac7b8f39ce348 /rc/filetype/python.kak | |
| parent | a35a7dc4a42ef0a0d83d5db7faeee7ad87ad0d24 (diff) | |
| parent | 9c9aa2cf95a1503cddcba69aed8b5f1a234927d6 (diff) | |
Merge remote-tracking branch 'sjjf/python_comment_paras'
Diffstat (limited to 'rc/filetype/python.kak')
| -rw-r--r-- | rc/filetype/python.kak | 50 |
1 files changed, 44 insertions, 6 deletions
diff --git a/rc/filetype/python.kak b/rc/filetype/python.kak index 65da1a89..4b1a9c76 100644 --- a/rc/filetype/python.kak +++ b/rc/filetype/python.kak @@ -167,14 +167,52 @@ define-command -hidden python-insert-on-new-line %{ evaluate-commands -itersel - execute-keys <semicolon> try %{ evaluate-commands -draft -save-regs '/"' %{ - # copy the commenting prefix - execute-keys -save-regs '' k x1s^\h*(#+\h*)<ret> y + # Handle block comment continuation/termination. + # + # This code applies in the context where we have a new line + # inserted, and the previous line is a block comment (i.e. a line + # that matches '^\h*#+\h*\S*$'). We assume that the comment will + # be continued, so we copy the prefix (all leading whitespace, any + # '#' characters, and then any additional whitespace before the + # next non-whitespace character) into the new line. + # + # PEP8's text on block comments says they can include an empty + # comment (i.e. '^\h*#+\h*$') as a paragraph separator - we + # leave a single empty comment as-is, to allow paragraph breaks, + # but if we see two consecutive empty comments we exit the + # comment block and delete the empty comments. + # Reference: https://peps.python.org/pep-0008/#block-comments + # + # first, make sure we're in the right context - don't wrap this + # in a try/catch so we fail out immediately + execute-keys -draft kxs^\h*#+\h*<ret> + + # now handle the coment continuation logic try %{ - # if the previous comment isn't empty, create a new one - execute-keys x<a-K>^\h*#+\h*$<ret> jxs^\h*<ret>P + # try and match a regular block comment, copying the prefix + execute-keys -draft -save-regs '' k x 1s^(\h*#+\h*)\S.*$ <ret> y + execute-keys -draft P } catch %{ - # if there is no text in the previous comment, remove it completely - execute-keys d + try %{ + # try and match a regular block comment followed by a single + # empty comment line + execute-keys -draft -save-regs '' kKx 1s^(\h*#+\h*)\S+\n\h*#+\h*$ <ret> y + execute-keys -draft P + } catch %{ + try %{ + # try and match a pair of empty comment lines, and delete + # them if we match + execute-keys -draft kKx <a-k> ^\h*#+\h*\n\h*#+\h*$ <ret> <a-d> + } catch %{ + # finally, we need a special case for a new line inserted + # into a file that consists of a single empty comment - in + # that case we can't expect to copy the trailing whitespace, + # so we add our own + execute-keys -draft -save-regs '' k x1s^(\h*#+)\h*$<ret> y + execute-keys -draft P + execute-keys -draft i<space> + } + } } } |
