summaryrefslogtreecommitdiff
path: root/autoload/tools/autowrap.kak
diff options
context:
space:
mode:
Diffstat (limited to 'autoload/tools/autowrap.kak')
-rw-r--r--autoload/tools/autowrap.kak50
1 files changed, 50 insertions, 0 deletions
diff --git a/autoload/tools/autowrap.kak b/autoload/tools/autowrap.kak
new file mode 100644
index 0000000..d742f6e
--- /dev/null
+++ b/autoload/tools/autowrap.kak
@@ -0,0 +1,50 @@
+declare-option -docstring "maximum amount of characters per line, after which a newline character will be inserted" \
+ int autowrap_column 80
+
+declare-option -docstring %{
+ when enabled, paragraph formatting will reformat the whole paragraph in which characters are being inserted
+ This can potentially break formatting of documents containing markup (e.g. markdown)
+} bool autowrap_format_paragraph no
+declare-option -docstring %{
+ command to which the paragraphs to wrap will be passed
+ all occurences of '%c' are replaced with `autowrap_column`
+} str autowrap_fmtcmd 'fold -s -w %c'
+
+define-command -hidden autowrap-cursor %{ evaluate-commands -save-regs '/"|^@m' %{
+ try %{
+ ## if the line isn't too long, do nothing
+ execute-keys -draft "x<a-k>^[^\n]{%opt{autowrap_column},}[^\n]<ret>"
+
+ try %{
+ reg m "%val{selections_desc}"
+
+ ## if we're adding characters past the limit, just wrap them around
+ execute-keys -draft "<a-h><a-k>.{%opt{autowrap_column}}\h*[^\s]*<ret>1s(\h+)[^\h]*\z<ret>c<ret>"
+ } catch %{
+ ## if we're adding characters in the middle of a sentence, use
+ ## the `fmtcmd` command to wrap the entire paragraph
+ evaluate-commands %sh{
+ if [ "${kak_opt_autowrap_format_paragraph}" = true ] \
+ && [ -n "${kak_opt_autowrap_fmtcmd}" ]; then
+ format_cmd=$(printf %s "${kak_opt_autowrap_fmtcmd}" \
+ | sed "s/%c/${kak_opt_autowrap_column}/g")
+ printf %s "
+ evaluate-commands -draft %{
+ execute-keys '<a-]>px<a-j>|${format_cmd}<ret>'
+ try %{ execute-keys s\h+$<ret> d }
+ }
+ select '${kak_main_reg_m}'
+ "
+ fi
+ }
+ }
+ }
+} }
+
+define-command autowrap-enable -docstring "Automatically wrap the lines in which characters are inserted" %{
+ hook -group autowrap window InsertChar [^\n] autowrap-cursor
+}
+
+define-command autowrap-disable -docstring "Disable automatic line wrapping" %{
+ remove-hooks window autowrap
+}