runtime(idris2): include filetype,indent+syntax plugins for (L)Idris2 + ipkg

closes: #15993

Co-authored-by: Christian Clason <ch.clason+github@icloud.com>
Signed-off-by: Serhii Khoma <srghma@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/runtime/indent/idris2.vim b/runtime/indent/idris2.vim
new file mode 100644
index 0000000..d3c306e
--- /dev/null
+++ b/runtime/indent/idris2.vim
@@ -0,0 +1,183 @@
+" Vim indent file
+" Language:            Idris 2
+" Maintainer:          Idris Hackers (https://github.com/edwinb/idris2-vim), Serhii Khoma <srghma@gmail.com>
+" Author:              raichoo <raichoo@googlemail.com>
+" Last Change:         2024 Nov 05
+" License:             Vim (see :h license)
+" Repository:          https://github.com/ShinKage/idris2-nvim
+"
+" indentation for idris (idris-lang.org)
+"
+" Based on haskell indentation by motemen <motemen@gmail.com>
+"
+" Indentation configuration variables:
+"
+" g:idris2_indent_if (default: 3)
+"   Controls indentation after 'if' statements
+"   Example:
+"     if condition
+"     >>>then expr
+"     >>>else expr
+"
+" g:idris2_indent_case (default: 5)
+"   Controls indentation of case expressions
+"   Example:
+"     case x of
+"     >>>>>Left y => ...
+"     >>>>>Right z => ...
+"
+" g:idris2_indent_let (default: 4)
+"   Controls indentation after 'let' bindings
+"   Example:
+"     let x = expr in
+"     >>>>body
+"
+" g:idris2_indent_rewrite (default: 8)
+"   Controls indentation after 'rewrite' expressions
+"   Example:
+"     rewrite proof in
+"     >>>>>>>>expr
+"
+" g:idris2_indent_where (default: 6)
+"   Controls indentation of 'where' blocks
+"   Example:
+"     function args
+"     >>>>>>where helper = expr
+"
+" g:idris2_indent_do (default: 3)
+"   Controls indentation in 'do' blocks
+"   Example:
+"     do x <- action
+"     >>>y <- action
+"
+" Example configuration in .vimrc:
+" let g:idris2_indent_if = 2
+
+if exists('b:did_indent')
+  finish
+endif
+
+setlocal indentexpr=GetIdrisIndent()
+setlocal indentkeys=!^F,o,O,}
+
+let b:did_indent = 1
+let b:undo_indent = "setlocal indentexpr< indentkeys<"
+
+" we want to use line continuations (\) BEGINNING
+let s:cpo_save = &cpo
+set cpo&vim
+
+" Define defaults for indent configuration
+let s:indent_defaults = {
+  \ 'idris2_indent_if': 3,
+  \ 'idris2_indent_case': 5,
+  \ 'idris2_indent_let': 4,
+  \ 'idris2_indent_rewrite': 8,
+  \ 'idris2_indent_where': 6,
+  \ 'idris2_indent_do': 3
+  \ }
+
+" we want to use line continuations (\) END
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" Set up indent settings with user overrides
+for [key, default] in items(s:indent_defaults)
+  let varname = 'g:' . key
+  if !exists(varname)
+    execute 'let' varname '=' default
+  endif
+endfor
+
+if exists("*GetIdrisIndent")
+  finish
+endif
+
+function! GetIdrisIndent()
+  let prevline = getline(v:lnum - 1)
+
+  if prevline =~ '\s\+(\s*.\+\s\+:\s\+.\+\s*)\s\+->\s*$'
+    return match(prevline, '(')
+  elseif prevline =~ '\s\+{\s*.\+\s\+:\s\+.\+\s*}\s\+->\s*$'
+    return match(prevline, '{')
+  endif
+
+  if prevline =~ '[!#$%&*+./<>?@\\^|~-]\s*$'
+    let s = match(prevline, '[:=]')
+    if s > 0
+      return s + 2
+    else
+      return match(prevline, '\S')
+    endif
+  endif
+
+  if prevline =~ '[{([][^})\]]\+$'
+    return match(prevline, '[{([]')
+  endif
+
+  if prevline =~ '\<let\>\s\+.\+\<in\>\s*$'
+    return match(prevline, '\<let\>') + g:idris2_indent_let
+  endif
+
+  if prevline =~ '\<rewrite\>\s\+.\+\<in\>\s*$'
+    return match(prevline, '\<rewrite\>') + g:idris2_indent_rewrite
+  endif
+
+  if prevline !~ '\<else\>'
+    let s = match(prevline, '\<if\>.*\&.*\zs\<then\>')
+    if s > 0
+      return s
+    endif
+
+    let s = match(prevline, '\<if\>')
+    if s > 0
+      return s + g:idris2_indent_if
+    endif
+  endif
+
+  if prevline =~ '\(\<where\>\|\<do\>\|=\|[{([]\)\s*$'
+    return match(prevline, '\S') + &shiftwidth
+  endif
+
+  if prevline =~ '\<where\>\s\+\S\+.*$'
+    return match(prevline, '\<where\>') + g:idris2_indent_where
+  endif
+
+  if prevline =~ '\<do\>\s\+\S\+.*$'
+    return match(prevline, '\<do\>') + g:idris2_indent_do
+  endif
+
+  if prevline =~ '^\s*\<\(co\)\?data\>\s\+[^=]\+\s\+=\s\+\S\+.*$'
+    return match(prevline, '=')
+  endif
+
+  if prevline =~ '\<with\>\s\+([^)]*)\s*$'
+    return match(prevline, '\S') + &shiftwidth
+  endif
+
+  if prevline =~ '\<case\>\s\+.\+\<of\>\s*$'
+    return match(prevline, '\<case\>') + g:idris2_indent_case
+  endif
+
+  if prevline =~ '^\s*\(\<namespace\>\|\<\(co\)\?data\>\)\s\+\S\+\s*$'
+    return match(prevline, '\(\<namespace\>\|\<\(co\)\?data\>\)') + &shiftwidth
+  endif
+
+  if prevline =~ '^\s*\(\<using\>\|\<parameters\>\)\s*([^(]*)\s*$'
+    return match(prevline, '\(\<using\>\|\<parameters\>\)') + &shiftwidth
+  endif
+
+  if prevline =~ '^\s*\<mutual\>\s*$'
+    return match(prevline, '\<mutual\>') + &shiftwidth
+  endif
+
+  let line = getline(v:lnum)
+
+  if (line =~ '^\s*}\s*' && prevline !~ '^\s*;')
+    return match(prevline, '\S') - &shiftwidth
+  endif
+
+  return match(prevline, '\S')
+endfunction
+
+" vim:et:sw=2:sts=2