diff runtime/indent/kotlin.vim @ 33282:c9c720360002

runtime(kotlin): Add Kotlin runtime files (#13110) Commit: https://github.com/vim/vim/commit/e30d8e4ce01dc1aca95d25be9fd27c09855fd4be Author: dkearns <dougkearns@gmail.com> Date: Mon Sep 18 02:51:22 2023 +1000 runtime(kotlin): Add Kotlin runtime files (https://github.com/vim/vim/issues/13110) Closes udalov/kotlin-vimhttps://github.com/vim/vim/issues/39 Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Sun, 17 Sep 2023 19:00:07 +0200
parents
children
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/runtime/indent/kotlin.vim
@@ -0,0 +1,60 @@
+" Vim indent file
+" Language:     Kotlin
+" Maintainer:   Alexander Udalov
+" URL:          https://github.com/udalov/kotlin-vim
+" Last Change:  7 November 2021
+"               2023 Sep 17 by Vim Project (undo_indent)
+
+if exists('b:did_indent')
+    finish
+endif
+let b:did_indent = 1
+
+setlocal cinoptions& cinoptions+=j1,L0
+setlocal indentexpr=GetKotlinIndent()
+setlocal indentkeys=0},0),!^F,o,O,e,<CR>
+setlocal autoindent " TODO ?
+
+let b:undo_indent = "setlocal autoindent< cinoptions< indentexpr< indentkeys<"
+
+" TODO teach it to count bracket balance, etc.
+function! GetKotlinIndent()
+    if v:lnum == 0
+        return 0
+    endif
+
+    let prev_num = prevnonblank(v:lnum - 1)
+    let prev = getline(prev_num)
+    let prev_indent = indent(prev_num)
+    let cur = getline(v:lnum)
+
+    if cur =~ '^\s*\*'
+        return cindent(v:lnum)
+    endif
+
+    if prev =~ '^\s*\*/'
+        let st = prev
+        while st > 1
+            if getline(st) =~ '^\s*/\*'
+                break
+            endif
+            let st = st - 1
+        endwhile
+        return indent(st)
+    endif
+
+    let prev_open_paren = prev =~ '^.*(\s*$'
+    let cur_close_paren = cur =~ '^\s*).*$'
+    let prev_open_brace = prev =~ '^.*\({\|->\)\s*$'
+    let cur_close_brace = cur =~ '^\s*}.*$'
+
+    if prev_open_paren && !cur_close_paren || prev_open_brace && !cur_close_brace
+        return prev_indent + shiftwidth()
+    endif
+
+    if cur_close_paren && !prev_open_paren || cur_close_brace && !prev_open_brace
+        return prev_indent - shiftwidth()
+    endif
+
+    return prev_indent
+endfunction