summaryrefslogtreecommitdiff
path: root/rc/filetype/python.kak
diff options
context:
space:
mode:
authorSimon Fowler <simon.fowler@anu.edu.au>2024-04-18 22:55:18 +1000
committerSimon Fowler <simon.fowler@anu.edu.au>2024-06-07 20:33:17 +1000
commit9c9aa2cf95a1503cddcba69aed8b5f1a234927d6 (patch)
treeaf0f1ada7f00de968304e178fe618838d6053730 /rc/filetype/python.kak
parentc93cb5c4d8f1c2aec21f8bdeba59dfb8f153499c (diff)
Support paragraph breaks in python block comments.
The current python filetype module treats a single empty comment line (typically created by hitting enter twice while in a block comment) as the end of a block comment, deleting the empty comment and ending comment prefix copying. This runs contrary to PEP8, which explicitly allows for paragraphs in block comments, with an empty comment as the paragraph separator. This change implements support for using a single empty comment as a paragraph separator, with two consecutive empty comments being treated as the end of the block comment; both empty comment lines are deleted and comment prefix copying is ended.
Diffstat (limited to 'rc/filetype/python.kak')
-rw-r--r--rc/filetype/python.kak50
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>
+ }
+ }
}
}