Update runtime files
diff --git a/runtime/indent/clojure.vim b/runtime/indent/clojure.vim
index fadcaf4..5bfbfbb 100644
--- a/runtime/indent/clojure.vim
+++ b/runtime/indent/clojure.vim
@@ -5,7 +5,7 @@
 "                     Meikel Brandmeyer <mb@kotka.de>
 " URL:                https://github.com/clojure-vim/clojure.vim
 " License:            Vim (see :h license)
-" Last Change:        2021-10-26
+" Last Change:        2022-03-24
 
 if exists("b:did_indent")
 	finish
diff --git a/runtime/indent/ruby.vim b/runtime/indent/ruby.vim
index 559d865..6ce8529 100644
--- a/runtime/indent/ruby.vim
+++ b/runtime/indent/ruby.vim
@@ -4,7 +4,7 @@
 " Previous Maintainer:	Nikolai Weibull <now at bitwi.se>
 " URL:			https://github.com/vim-ruby/vim-ruby
 " Release Coordinator:	Doug Kearns <dougkearns@gmail.com>
-" Last Change:		2021 Feb 03
+" Last Change:		2022 Mar 22
 
 " 0. Initialization {{{1
 " =================
@@ -40,9 +40,11 @@
 " Now, set up our indentation expression and keys that trigger it.
 setlocal indentexpr=GetRubyIndent(v:lnum)
 setlocal indentkeys=0{,0},0),0],!^F,o,O,e,:,.
-setlocal indentkeys+==end,=else,=elsif,=when,=ensure,=rescue,==begin,==end
+setlocal indentkeys+==end,=else,=elsif,=when,=in\ ,=ensure,=rescue,==begin,==end
 setlocal indentkeys+==private,=protected,=public
 
+let b:undo_indent = "setlocal indentexpr< indentkeys< smartindent<"
+
 " Only define the function once.
 if exists("*GetRubyIndent")
   finish
@@ -85,14 +87,17 @@
 " Regex used for words that, at the start of a line, add a level of indent.
 let s:ruby_indent_keywords =
       \ '^\s*\zs\<\%(module\|class\|if\|for' .
-      \   '\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure\|rescue' .
+      \   '\|while\|until\|else\|elsif\|case\|when\|in\|unless\|begin\|ensure\|rescue' .
       \   '\|\%(\K\k*[!?]\?\s\+\)\=def\):\@!\>' .
       \ '\|\%([=,*/%+-]\|<<\|>>\|:\s\)\s*\zs' .
       \    '\<\%(if\|for\|while\|until\|case\|unless\|begin\):\@!\>'
 
+" Def without an end clause: def method_call(...) = <expression>
+let s:ruby_endless_def = '\<def\s\+\k\+[!?]\=\%((.*)\|\s\)\s*='
+
 " Regex used for words that, at the start of a line, remove a level of indent.
 let s:ruby_deindent_keywords =
-      \ '^\s*\zs\<\%(ensure\|else\|rescue\|elsif\|when\|end\):\@!\>'
+      \ '^\s*\zs\<\%(ensure\|else\|rescue\|elsif\|when\|in\|end\):\@!\>'
 
 " Regex that defines the start-match for the 'end' keyword.
 "let s:end_start_regex = '\%(^\|[^.]\)\<\%(module\|class\|def\|if\|for\|while\|until\|case\|unless\|begin\|do\)\>'
@@ -104,15 +109,31 @@
       \ '\|\%(^\|[^.:@$]\)\@<=\<do:\@!\>'
 
 " Regex that defines the middle-match for the 'end' keyword.
-let s:end_middle_regex = '\<\%(ensure\|else\|\%(\%(^\|;\)\s*\)\@<=\<rescue:\@!\>\|when\|elsif\):\@!\>'
+let s:end_middle_regex = '\<\%(ensure\|else\|\%(\%(^\|;\)\s*\)\@<=\<rescue:\@!\>\|when\|\%(\%(^\|;\)\s*\)\@<=\<in\|elsif\):\@!\>'
 
 " Regex that defines the end-match for the 'end' keyword.
 let s:end_end_regex = '\%(^\|[^.:@$]\)\@<=\<end:\@!\>'
 
-" Expression used for searchpair() call for finding match for 'end' keyword.
-let s:end_skip_expr = s:skip_expr .
-      \ ' || (expand("<cword>") == "do"' .
-      \ ' && getline(".") =~ "^\\s*\\<\\(while\\|until\\|for\\):\\@!\\>")'
+" Expression used for searchpair() call for finding a match for an 'end' keyword.
+function! s:EndSkipExpr()
+  if eval(s:skip_expr)
+    return 1
+  elseif expand('<cword>') == 'do'
+        \ && getline(".") =~ '^\s*\<\(while\|until\|for\):\@!\>'
+    return 1
+  elseif getline('.') =~ s:ruby_endless_def
+    return 1
+  elseif getline('.') =~ '\<def\s\+\k\+[!?]\=([^)]*$'
+    " Then it's a `def method(` with a possible `) =` later
+    call search('\<def\s\+\k\+\zs(', 'W', line('.'))
+    normal! %
+    return getline('.') =~ ')\s*='
+  else
+    return 0
+  endif
+endfunction
+
+let s:end_skip_expr = function('s:EndSkipExpr')
 
 " Regex that defines continuation lines, not including (, {, or [.
 let s:non_bracket_continuation_regex =
@@ -572,6 +593,11 @@
       call cursor(info.plnum, closing.pos + 1)
       normal! %
 
+      if strpart(info.pline, closing.pos) =~ '^)\s*='
+        " special case: the closing `) =` of an endless def
+        return indent(s:GetMSL(line('.')))
+      endif
+
       if s:Match(line('.'), s:ruby_indent_keywords)
         return indent('.') + info.sw
       else
@@ -610,7 +636,7 @@
   let info = a:pline_info
   let col = s:Match(info.plnum, s:ruby_indent_keywords)
 
-  if col > 0
+  if col > 0 && s:Match(info.plnum, s:ruby_endless_def) <= 0
     call cursor(info.plnum, col)
     let ind = virtcol('.') - 1 + info.sw
     " TODO: make this better (we need to count them) (or, if a searchpair
@@ -657,7 +683,7 @@
   " TODO: this does not take into account contrived things such as
   " module Foo; class Bar; end
   let col = s:Match(info.plnum_msl, s:ruby_indent_keywords)
-  if col > 0
+  if col > 0 && s:Match(info.plnum_msl, s:ruby_endless_def) <= 0
     let ind = indent(info.plnum_msl) + info.sw
     if s:Match(info.plnum_msl, s:end_end_regex)
       let ind = ind - info.sw