diff --git a/rc/core/comment.kak b/rc/core/comment.kak index 4dee7df7..ecca1c44 100644 --- a/rc/core/comment.kak +++ b/rc/core/comment.kak @@ -143,23 +143,38 @@ define-command comment-line -docstring '(un)comment selected lines using line co echo "fail \"The 'comment_line' option is empty, could not comment the line\"" fi } - evaluate-commands -draft %{ + evaluate-commands -save-regs '"/' -draft %{ # Select the content of the lines, without indentation execute-keys gi try %{ # Keep non-empty lines execute-keys \A\s*\z + } + + try %{ + set-register / "\A\Q%opt{comment_line}\E\h?" try %{ - # Select the comment characters and remove them - set-register / "\A\Q%opt{comment_line}\E\h*" - execute-keys sd - } catch %{ - # Comment the line + # See if there are any uncommented lines in the selection + execute-keys -draft + + # There are uncommented lines, so comment everything set-register '"' "%opt{comment_line} " + align-selections-left execute-keys P + } catch %{ + # All lines were commented, so uncomment everything + execute-keys sd } } } } + +define-command align-selections-left -docstring 'extend selections to the left to align with the leftmost selected column' %{ + evaluate-commands %sh{ + leftmost_column=$(echo "$kak_selections_desc" | tr ' ' '\n' | cut -d',' -f1 | cut -d'.' -f2 | sort -n | head -n1) + aligned_selections=$(echo "$kak_selections_desc" | sed -E "s/\.[0-9]+,/.$leftmost_column,/g") + echo "select $aligned_selections" + } +} diff --git a/test/indent/comment/comment-multiple-lines-indented/cmd b/test/indent/comment/comment-multiple-lines-indented/cmd new file mode 100644 index 00000000..2330d00f --- /dev/null +++ b/test/indent/comment/comment-multiple-lines-indented/cmd @@ -0,0 +1 @@ +jXXXXX:comment-line diff --git a/test/indent/comment/comment-multiple-lines-indented/in b/test/indent/comment/comment-multiple-lines-indented/in new file mode 100644 index 00000000..f5e027ab --- /dev/null +++ b/test/indent/comment/comment-multiple-lines-indented/in @@ -0,0 +1,6 @@ +a: + b: 1 + c: + d: 2 + + e: 3 diff --git a/test/indent/comment/comment-multiple-lines-indented/out b/test/indent/comment/comment-multiple-lines-indented/out new file mode 100644 index 00000000..34c257e6 --- /dev/null +++ b/test/indent/comment/comment-multiple-lines-indented/out @@ -0,0 +1,6 @@ +a: + # b: 1 + # c: + # d: 2 + + # e: 3 diff --git a/test/indent/comment/comment-multiple-lines-indented/rc b/test/indent/comment/comment-multiple-lines-indented/rc new file mode 100644 index 00000000..4808655d --- /dev/null +++ b/test/indent/comment/comment-multiple-lines-indented/rc @@ -0,0 +1,4 @@ +source "%val{runtime}/colors/default.kak" +source "%val{runtime}/rc/base/yaml.kak" +source "%val{runtime}/rc/core/comment.kak" +set buffer filetype yaml diff --git a/test/indent/comment/comment-multiple-lines-unindented/cmd b/test/indent/comment/comment-multiple-lines-unindented/cmd new file mode 100644 index 00000000..f67b66d6 --- /dev/null +++ b/test/indent/comment/comment-multiple-lines-unindented/cmd @@ -0,0 +1 @@ +%:comment-line diff --git a/test/indent/comment/comment-multiple-lines-unindented/in b/test/indent/comment/comment-multiple-lines-unindented/in new file mode 100644 index 00000000..f5e027ab --- /dev/null +++ b/test/indent/comment/comment-multiple-lines-unindented/in @@ -0,0 +1,6 @@ +a: + b: 1 + c: + d: 2 + + e: 3 diff --git a/test/indent/comment/comment-multiple-lines-unindented/out b/test/indent/comment/comment-multiple-lines-unindented/out new file mode 100644 index 00000000..e9df3e3a --- /dev/null +++ b/test/indent/comment/comment-multiple-lines-unindented/out @@ -0,0 +1,6 @@ +# a: +# b: 1 +# c: +# d: 2 + +# e: 3 diff --git a/test/indent/comment/comment-multiple-lines-unindented/rc b/test/indent/comment/comment-multiple-lines-unindented/rc new file mode 100644 index 00000000..4808655d --- /dev/null +++ b/test/indent/comment/comment-multiple-lines-unindented/rc @@ -0,0 +1,4 @@ +source "%val{runtime}/colors/default.kak" +source "%val{runtime}/rc/base/yaml.kak" +source "%val{runtime}/rc/core/comment.kak" +set buffer filetype yaml diff --git a/test/indent/comment/comment-multiple-lines-when-partially-commented/cmd b/test/indent/comment/comment-multiple-lines-when-partially-commented/cmd new file mode 100644 index 00000000..f67b66d6 --- /dev/null +++ b/test/indent/comment/comment-multiple-lines-when-partially-commented/cmd @@ -0,0 +1 @@ +%:comment-line diff --git a/test/indent/comment/comment-multiple-lines-when-partially-commented/in b/test/indent/comment/comment-multiple-lines-when-partially-commented/in new file mode 100644 index 00000000..3e177da0 --- /dev/null +++ b/test/indent/comment/comment-multiple-lines-when-partially-commented/in @@ -0,0 +1,6 @@ +a: + # b: 1 + c: + d: 2 + + e: 3 diff --git a/test/indent/comment/comment-multiple-lines-when-partially-commented/out b/test/indent/comment/comment-multiple-lines-when-partially-commented/out new file mode 100644 index 00000000..4e6debd4 --- /dev/null +++ b/test/indent/comment/comment-multiple-lines-when-partially-commented/out @@ -0,0 +1,6 @@ +# a: +# # b: 1 +# c: +# d: 2 + +# e: 3 diff --git a/test/indent/comment/comment-multiple-lines-when-partially-commented/rc b/test/indent/comment/comment-multiple-lines-when-partially-commented/rc new file mode 100644 index 00000000..4808655d --- /dev/null +++ b/test/indent/comment/comment-multiple-lines-when-partially-commented/rc @@ -0,0 +1,4 @@ +source "%val{runtime}/colors/default.kak" +source "%val{runtime}/rc/base/yaml.kak" +source "%val{runtime}/rc/core/comment.kak" +set buffer filetype yaml diff --git a/test/indent/comment/uncomment-multiple-indented-lines/cmd b/test/indent/comment/uncomment-multiple-indented-lines/cmd new file mode 100644 index 00000000..f67b66d6 --- /dev/null +++ b/test/indent/comment/uncomment-multiple-indented-lines/cmd @@ -0,0 +1 @@ +%:comment-line diff --git a/test/indent/comment/uncomment-multiple-indented-lines/in b/test/indent/comment/uncomment-multiple-indented-lines/in new file mode 100644 index 00000000..1bd4ba61 --- /dev/null +++ b/test/indent/comment/uncomment-multiple-indented-lines/in @@ -0,0 +1,3 @@ +# a: +# b: 1 +# c: 2 diff --git a/test/indent/comment/uncomment-multiple-indented-lines/out b/test/indent/comment/uncomment-multiple-indented-lines/out new file mode 100644 index 00000000..0969f779 --- /dev/null +++ b/test/indent/comment/uncomment-multiple-indented-lines/out @@ -0,0 +1,3 @@ +a: + b: 1 + c: 2 diff --git a/test/indent/comment/uncomment-multiple-indented-lines/rc b/test/indent/comment/uncomment-multiple-indented-lines/rc new file mode 100644 index 00000000..4808655d --- /dev/null +++ b/test/indent/comment/uncomment-multiple-indented-lines/rc @@ -0,0 +1,4 @@ +source "%val{runtime}/colors/default.kak" +source "%val{runtime}/rc/base/yaml.kak" +source "%val{runtime}/rc/core/comment.kak" +set buffer filetype yaml