diff --git a/rc/filetype/latex.kak b/rc/filetype/latex.kak index ebdeb97c..5ed0866b 100644 --- a/rc/filetype/latex.kak +++ b/rc/filetype/latex.kak @@ -11,16 +11,21 @@ hook global BufCreate .*\.tex %{ # Initialization # ‾‾‾‾‾‾‾‾‾‾‾‾‾‾ -hook global WinSetOption filetype=latex %{ +hook global WinSetOption filetype=latex %( require-module latex -} + + hook window InsertChar \n -group latex-indent %{ latex-indent-newline } + hook window InsertChar \} -group latex-indent %{ latex-indent-closing-brace } + hook window ModeChange insert:.* -group latex-indent %{ latex-trim-indent } + hook -once -always window WinSetOption filetype=.* %{ remove-hooks latex-indent } +) hook -group latex-highlight global WinSetOption filetype=latex %{ add-highlighter window/latex ref latex hook -once -always window WinSetOption filetype=.* %{ remove-highlighter window/latex } } -provide-module latex %( +provide-module latex %~ # Highlighters # ‾‾‾‾‾‾‾‾‾‾‾‾ @@ -40,4 +45,47 @@ add-highlighter shared/latex/content/ regex '\\(emph|textit)\{([^}]+)\}' 2:defau # Bold text add-highlighter shared/latex/content/ regex '\\textbf\{([^}]+)\}' 1:default+b + +# Indent +# ------ + +define-command -hidden latex-trim-indent %{ + evaluate-commands -no-hooks -draft -itersel %{ + try %{ execute-keys 1s^(\h+)$ d } + } +} + +define-command -hidden latex-indent-newline %( + evaluate-commands -no-hooks -draft -itersel %( + # copy '%' comment prefix and following white spaces + try %{ execute-keys -draft k s^\h*%\h* y jgh P } + # preserve previous line indent + try %{ execute-keys -draft K } + # cleanup trailing whitespaces from previous line + try %{ execute-keys -draft k s\h+$ d } + # indent after line ending with { + try %( execute-keys -draft k \{$ j ) + # indent after line ending with \begin{...}[...]{...}, with multiple + # sets of arguments possible + try %( + execute-keys -draft \ + k \ + \\begin\h*\{[^\}]+\}(\h|\[.*\]|\{.*\})*$ \ + j + ) + ) ) + +define-command -hidden latex-indent-closing-brace %( + evaluate-commands -no-hooks -draft -itersel %( + # Align lone } with matching bracket + try %( execute-keys -draft _ \A\}\z m1 ) + # Align \end{...} with corresponding \begin{...} + try %( + execute-keys -draft h 1s\\end\h*\{([^\}]+)\}\z \ + \\begin\s*\{.\} 1 + ) + ) +) + +~