## Maximum amount of characters per line decl int autowrap_column 80 def -hidden _autowrap-break-line %{ 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 overlaps ## the "autowrap_column"th column), or do nothing if the "autowrap_column"th ## character is a horizontal space, and insert a newline ## :_autowrap-break-line: select the second half of the buffer that was just split, ## and call itself recursively until all lines in the selection ## are correctly split exec -draft " (?=[^\n]*\h)(?=[^\n]*[^\h])[^\n]{%opt{autowrap_column},}[^\n] %opt{autowrap_column}l w;i :_autowrap-break-line" } } ## Automatically wrap the selection def autowrap-selection -docstring "Wrap the selection" %{ eval -draft _autowrap-break-line try %{ exec -draft "^[^\n]*\h*\n\h*[^\n]+$ s\h*\n\h*(?=[^\z])c" } } ## Add a hook that will wrap the entire line every time a key is pressed def autowrap-enable -docstring "Wrap the lines in which characters are inserted" %{ hook -group autowrap window InsertChar [^\n] %{ exec -draft ":autowrap-selection" } } ## Disable the automatic line wrapping, autowrap-selection remains available though def autowrap-disable -docstring "Disable automatic line wrapping" %{ rmhooks window autowrap }