Files
u.nvim/AGENTS.md
Jonathan Apodaca f9ea5b0658
Some checks failed
ci / ci (push) Failing after 1m5s
Range.from_motion: preserve jumplist
2026-04-14 18:37:13 -06:00

1.6 KiB

AGENTS.md

Project

Single-file Neovim Lua micro-library (lua/u.lua) for range-based text operations, positions, operator-pending mappings, and text objects. Not a plugin — meant to be vendored by other plugins.

Commands

All tasks use mise:

  • mise run fmt — format (stylua)
  • mise run fmt:check — check formatting
  • mise run lint — type-check with emmylua_check (ignores .prefix/)
  • mise run test — run busted against Neovim 0.12.1 (includes test:prepare)
  • mise run test:all — test against 0.11.5, 0.12.1, and nightly
  • mise run test:coverage — test with luacov (only covers lua/u$)
  • mise run cifmt:checklinttest:all

Run a single spec file: busted spec/u_spec.lua (after mise run test:prepare).

Architecture

  • lua/u.lua — the entire library (~1300 lines): Pos, Range, opkeymap, define_txtobj, ucmd, repeat_
  • spec/u_spec.lua — all tests in one file
  • library/ — type stubs for busted/luv (stylua-ignored, used by emmylua)
  • .prefix/ — neovim version installs managed by nvimv (git-ignored, emmylua-ignored)
  • examples/ — usage examples (surround, splitjoin, text-objects, matcher)

Conventions

  • 1-based indexing everywhere (v2+). Pos.from00() / Range.from00() convert from 0-based Neovim API values.
  • Stylua: LuaJIT syntax, single quotes, no call parens, 2-space indent, sort requires, 100 col width
  • Tests run inside Neovim via busted's lua = "nvim -u NONE -i NONE -l" (set in .busted)
  • test:prepare installs busted rocks via luarocks test --prepare and manages nightly Neovim via nvimv