diff --git a/runtime/indent/vim.vim b/runtime/indent/vim.vim
index 2ae3658..2f59dfc 100644
--- a/runtime/indent/vim.vim
+++ b/runtime/indent/vim.vim
@@ -1,214 +1,22 @@
-" Vim indent file
-" Language:	Vim script
-" Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2022 Jun 24
+vim9script
 
-" Only load this indent file when no other was loaded.
-if exists("b:did_indent")
-  finish
+# Vim indent file
+# Language:	Vim script
+# Maintainer:	Bram Moolenaar <Bram@vim.org>
+# Last Change:	2022 Sep 27
+
+# Only load this indent file when no other was loaded.
+if exists('b:did_indent')
+    finish
 endif
-let b:did_indent = 1
 
-setlocal indentexpr=GetVimIndent()
-setlocal indentkeys+==endif,=enddef,=endfu,=endfor,=endwh,=endtry,=},=else,=cat,=finall,=END,0\\,0=\"\\\ 
+b:did_indent = true
+b:undo_indent = 'setlocal indentkeys< indentexpr<'
+
+import autoload '../autoload/dist/vimindent.vim'
+
+setlocal indentexpr=vimindent.Expr(v:lnum)
+setlocal indentkeys+==endif,=enddef,=endfu,=endfor,=endwh,=endtry,=},=else,=cat,=finall,=END,0\\
+execute('setlocal indentkeys+=0=\"\\\ ,0=#\\\ ')
 setlocal indentkeys-=0#
 setlocal indentkeys-=:
-
-let b:undo_indent = "setl indentkeys< indentexpr<"
-
-" Only define the function once.
-if exists("*GetVimIndent")
-  finish
-endif
-let s:keepcpo= &cpo
-set cpo&vim
-
-function GetVimIndent()
-  let ignorecase_save = &ignorecase
-  try
-    let &ignorecase = 0
-    return GetVimIndentIntern()
-  finally
-    let &ignorecase = ignorecase_save
-  endtry
-endfunc
-
-" Legacy script line continuation and Vim9 script operators that must mean an
-" expression that continues from the previous line.
-let s:lineContPat = '^\s*\(\\\|"\\ \|->\)'
-
-function GetVimIndentIntern()
-  " If the current line has line continuation and the previous one too, use
-  " the same indent.  This does not skip empty lines.
-  let cur_text = getline(v:lnum)
-  let cur_has_linecont = cur_text =~ s:lineContPat
-  if cur_has_linecont && v:lnum > 1 && getline(v:lnum - 1) =~ s:lineContPat
-    return indent(v:lnum - 1)
-  endif
-
-  " Find a non-blank line above the current line.
-  let lnum = prevnonblank(v:lnum - 1)
-
-  " The previous line, ignoring line continuation
-  let prev_text_end = lnum > 0 ? getline(lnum) : ''
-
-  " If the current line doesn't start with '\' or '"\ ' and below a line that
-  " starts with '\' or '"\ ', use the indent of the line above it.
-  if !cur_has_linecont
-    while lnum > 0 && getline(lnum) =~ s:lineContPat
-      let lnum = lnum - 1
-    endwhile
-  endif
-
-  " At the start of the file use zero indent.
-  if lnum == 0
-    return 0
-  endif
-
-  " the start of the previous line, skipping over line continuation
-  let prev_text = getline(lnum)
-  let found_cont = 0
-
-  " Add a 'shiftwidth' after :if, :while, :try, :catch, :finally, :function
-  " and :else.  Add it three times for a line that starts with '\' or '"\ '
-  " after a line that doesn't (or g:vim_indent_cont if it exists).
-  let ind = indent(lnum)
-
-  " In heredoc indenting works completely differently.
-  if has('syntax_items') 
-    let syn_here = synIDattr(synID(v:lnum, 1, 1), "name")
-    if syn_here =~ 'vimLetHereDocStop'
-      " End of heredoc: use indent of matching start line
-      let lnum = v:lnum - 1
-      while lnum > 0
-	let attr = synIDattr(synID(lnum, 1, 1), "name")
-	if attr != '' && attr !~ 'vimLetHereDoc'
-	  return indent(lnum)
-	endif
-	let lnum -= 1
-      endwhile
-      return 0
-    endif
-    if syn_here =~ 'vimLetHereDoc'
-      if synIDattr(synID(lnum, 1, 1), "name") !~ 'vimLetHereDoc'
-	" First line in heredoc: increase indent
-	return ind + shiftwidth()
-      endif
-      " Heredoc continues: no change in indent
-      return ind
-    endif
-  endif
-
-  if cur_text =~ s:lineContPat && v:lnum > 1 && prev_text !~ s:lineContPat
-    let found_cont = 1
-    if exists("g:vim_indent_cont")
-      let ind = ind + g:vim_indent_cont
-    else
-      let ind = ind + shiftwidth() * 3
-    endif
-  elseif prev_text =~ '^\s*aug\%[roup]\s\+' && prev_text !~ '^\s*aug\%[roup]\s\+[eE][nN][dD]\>'
-    let ind = ind + shiftwidth()
-  else
-    " A line starting with :au does not increment/decrement indent.
-    " A { may start a block or a dict.  Assume that when a } follows it's a
-    " terminated dict.
-    " ":function" starts a block but "function(" doesn't.
-    if prev_text !~ '^\s*au\%[tocmd]' && prev_text !~ '^\s*{.*}'
-      let i = match(prev_text, '\(^\||\)\s*\(export\s\+\)\?\({\|\(if\|wh\%[ile]\|for\|try\|cat\%[ch]\|fina\|finall\%[y]\|def\|el\%[seif]\)\>\|fu\%[nction][! ]\)')
-      if i >= 0
-	let ind += shiftwidth()
-	if strpart(prev_text, i, 1) == '|' && has('syntax_items')
-	      \ && synIDattr(synID(lnum, i, 1), "name") =~ '\(Comment\|String\|PatSep\)$'
-	  let ind -= shiftwidth()
-	endif
-      endif
-    endif
-  endif
-
-  " If the previous line contains an "end" after a pipe, but not in an ":au"
-  " command.  And not when there is a backslash before the pipe.
-  " And when syntax HL is enabled avoid a match inside a string.
-  let i = match(prev_text, '[^\\]|\s*\(ene\@!\)')
-  if i > 0 && prev_text !~ '^\s*au\%[tocmd]'
-    if !has('syntax_items') || synIDattr(synID(lnum, i + 2, 1), "name") !~ '\(Comment\|String\)$'
-      let ind = ind - shiftwidth()
-    endif
-  endif
-
-  " For a line starting with "}" find the matching "{".  Align with that line,
-  " it is either the matching block start or dictionary start.
-  " Use the mapped "%" from matchit to find the match, otherwise we may match
-  " a { inside a comment or string.
-  if cur_text =~ '^\s*}'
-    if maparg('%') != ''
-      exe v:lnum
-      silent! normal %
-      if line('.') < v:lnum
-	let ind = indent('.')
-      endif
-    else
-      " todo: use searchpair() to find a match
-    endif
-  endif
-
-  " Look back for a line to align with
-  while lnum > 1
-    " Below a line starting with "}" find the matching "{".
-    if prev_text =~ '^\s*}'
-      if maparg('%') != ''
-	exe lnum
-	silent! normal %
-	if line('.') < lnum
-	  let lnum = line('.')
-	  let ind = indent(lnum)
-	  let prev_text = getline(lnum)
-	else
-	  break
-	endif
-      else
-	" todo: use searchpair() to find a match
-	break
-      endif
-    elseif prev_text =~ s:lineContPat
-      " looks like a continuation like, go back one line
-      let lnum = lnum - 1
-      let ind = indent(lnum)
-      let prev_text = getline(lnum)
-    else
-      break
-    endif
-  endwhile
-
-  " Below a line starting with "]" we must be below the end of a list.
-  " Include a "}" and "},} in case a dictionary ends too.
-  if prev_text_end =~ '^\s*\(},\=\s*\)\=]'
-    let ind = ind - shiftwidth()
-  endif
-
-  let ends_in_comment = has('syntax_items')
-	\ && synIDattr(synID(lnum, len(getline(lnum)), 1), "name") =~ '\(Comment\|String\)$'
-
-  " A line ending in "{" or "[" is most likely the start of a dict/list literal,
-  " indent the next line more.  Not for a continuation line or {{{.
-  if !ends_in_comment && prev_text_end =~ '\s[{[]\s*$' && !found_cont
-    let ind = ind + shiftwidth()
-  endif
-
-  " Subtract a 'shiftwidth' on a :endif, :endwhile, :endfor, :catch, :finally,
-  " :endtry, :endfun, :enddef, :else and :augroup END.
-  " Although ":en" would be enough only match short command names as in
-  " 'indentkeys'.
-  if cur_text =~ '^\s*\(endif\|endwh\|endfor\|endtry\|endfu\|enddef\|cat\|finall\|else\|aug\%[roup]\s\+[eE][nN][dD]\)'
-    let ind = ind - shiftwidth()
-    if ind < 0
-      let ind = 0
-    endif
-  endif
-
-  return ind
-endfunction
-
-let &cpo = s:keepcpo
-unlet s:keepcpo
-
-" vim:sw=2
