diff --git a/rc/autowrap.kak b/rc/autowrap.kak index a55c1edf..17d11da1 100644 --- a/rc/autowrap.kak +++ b/rc/autowrap.kak @@ -1,9 +1,34 @@ +## Maximum amount of characters per line decl int autowrap_column 80 -def autowrap-enable %{ - hook -group autowrap window InsertChar [^\n] %{ try %{ exec -draft ".{%opt{autowrap_column},}bixX[^\n]+\n[^\n]kx;d" } } +## Automatically wrap the selection +def autowrap-selection %{ + try %{ + ## : ensure that the cursor is located after the anchor, then reverse the + ## selection (make sure the cursor is at the beginning of the selection) + ## (?=[^\n]*\h)(?=[^\n]*[^\h])[^\n]{%opt{autowrap_column},}[^\n]: make sure + ## the selection is wrap-able (contains at least an horizontal space, any + ## non-whitespace character, and at least "autowrap_column" characters) + ## %opt{autowrap_column}l: place the cursor on the "autowrap_column"th character + ## w;i: move the cursor to the beginning of the word (if it overslaps + ## the "autowrap_column"th column), or do nothing if the "autowrap_column"th + ## character is a horizontal space, and insert a newline + ## kxXs\h+$d : select the line that we just made, as well as the one that was just + ## wrapped, and remove any trailing horizontal space + exec -draft "(?=[^\n]*\h)(?=[^\n]*[^\h])[^\n]{%opt{autowrap_column},}[^\n]%opt{autowrap_column}lw;ikxXs\h+$d " + } } +## Add a hook that will wrap the entire line every time a key is pressed +def autowrap-enable %{ + hook -group autowrap window InsertChar [^\n] %{ + try %{ + exec -draft "x:autowrap-selection" + } + } +} + +## Disable the automatic line wrapping, autowrap-selection remains available though def autowrap-disable %{ rmhooks window autowrap }