diff --git a/rc/base/fish.kak b/rc/base/fish.kak index d6200461a..d8cfab391 100644 --- a/rc/base/fish.kak +++ b/rc/base/fish.kak @@ -42,8 +42,10 @@ def -hidden _fish_filter_around_selections %{ def -hidden _fish_indent_on_char %{ eval -no-hooks -draft -itersel %{ - # deindent on (else|end) command insertion - try %{ exec -draft w(else|end) } + # align middle and end structures to start and indent when necessary + try %{ exec -draft ^\h*(else)$^\h*(if)s\A|\Z' } + try %{ exec -draft ^\h*(end)$^\h*(begin|for|function|if|switch|while)s\A|\Z' } + try %{ exec -draft ^\h*(case)$^\h*(switch)s\A|\Z'' } } } @@ -53,12 +55,20 @@ def -hidden _fish_indent_on_new_line %{ try %{ exec -draft K } # filter previous line try %{ exec -draft k:_fish_filter_around_selections } - # copy '#' comment prefix and following white spaces + # indent after start structure + try %{ exec -draft kx^\h*(begin|case|else|for|function|if|switch|while)\bj } + } +} + +def -hidden _fish_insert_on_new_line %{ + eval -no-hooks -draft -itersel %{ + # copy _#_ comment prefix and following white spaces try %{ exec -draft kxs^\h*\K#\h*yjp } - # indent after (case|else) commands - try %{ exec -draft kx(case|else)j } - # indent after (begin|for|function|if|switch|while) commands and add 'end' command - try %{ exec -draft kx(begin|for|function|(?xypjaendk } + # wisely add end structure + eval -save-regs x %{ + try %{ exec -draft kxs^\h+"xy } catch %{ reg x '' } + try %{ exec -draft kx^x(begin|for|function|if|switch|while)jiXK^x(begin|for|function|if|switch|while).*\nxend$jxypjaend } + } } } @@ -68,13 +78,13 @@ def -hidden _fish_indent_on_new_line %{ hook global WinSetOption filetype=fish %{ addhl ref fish - hook window InsertEnd .* -group fish-hooks _fish_filter_around_selections hook window InsertChar .* -group fish-indent _fish_indent_on_char hook window InsertChar \n -group fish-indent _fish_indent_on_new_line + hook window InsertChar \n -group fish-insert _fish_insert_on_new_line } hook global WinSetOption filetype=(?!fish).* %{ rmhl fish rmhooks window fish-indent - rmhooks window fish-hooks + rmhooks window fish-insert }