vimlrs 0.2.1

Faithful Rust port of the Vimscript (VimL) interpreter, from the Neovim C eval engine
Documentation
vim9script
# vim9_script_scope.vim — vim9 script-scope variables are visible inside `def`
# bodies by bare name (`:help vim9-scopes`). A `def` sees script-level `var` and
# `const` declarations without an `s:`/`g:` prefix; a legacy `:function` does
# not. Binary-verified against Vim 9.2. Self-tests into v:errors.
#
#   vimlrs examples/vim9_script_scope.vim

# ── a script-level `var` is readable inside a def by bare name ──
var greeting = 'hello'
def Read(): string
  return greeting
enddef
assert_equal('hello', Read())

# ── a script-level `const` is readable inside a def by bare name ──
const LIMIT = 42
def Limit(): number
  return LIMIT
enddef
assert_equal(42, Limit())

# ── a script var read inside an `if` condition in a def body ──
var threshold = 10
def Below(n: number): bool
  if n < threshold
    return true
  endif
  return false
enddef
assert_equal(true, Below(3))
assert_equal(false, Below(20))

# ── reassigning a script var inside an `if` in a def mutates the script var ──
var counter = 0
def Bump()
  if counter < 10
    counter = counter + 1
  endif
enddef
Bump()
Bump()
Bump()
assert_equal(3, counter)

# ── a script var used in arithmetic with a def-local ──
var base = 100
def AddBase(n: number): number
  var extra = 5
  return base + n + extra
enddef
assert_equal(115, AddBase(10))

# ── self-test epilogue ──
if !empty(v:errors)
  for e in v:errors
    echo 'FAIL:' e
  endfor
  throw len(v:errors) .. ' assertion(s) failed'
endif