Commit Graph
100 Commits
Author SHA1 Message Date
bfredl 69e61d52e2 Merge pull request #41186 from Rawan10101/fix-wasm-browser
feat(wasm): track and fix ongoing issues + add WASM build workflow
2026-08-14 12:59:12 +02:00
bfredl 8a0eb8f10b Merge pull request #41212 from bfredl/unmagic
refactor(ex_cmds): use function arguments for magic behavior
2026-08-10 14:17:57 +02:00
bfredl 344ea602f6 refactor(ex_cmds): use function arguments for magic behavior
Now this was a cargo cult anti-pattern to write home about.
Doing painful save-and-restore bookkeeping around a separate
`magic_overruled` decoy global is just as messy as doing painful
save-and-restore logic around `p_magic` itself. only that now you need
to wrap every access to the effective value in a function call.

This replaces this with a marvellous new Clean Code technique™:
passing in the intended behavior as a function parameter to functions
where either the option or an explicit value might be used.
2026-08-10 13:26:51 +02:00
bfredl 0abc9ccc19 Merge pull request #40772 from Rawan10101/wasm-browser
feat(wasm-emcc): add browser support for Neovim
2026-08-04 12:11:17 +02:00
bfredl 26357692c8 Merge pull request #40649 from dchinmay2/push-ppxvyxntnsuu
build(zig): bump ziglua to fix building with system lua
2026-07-28 08:25:12 +02:00
bfredl c1e09659b4 Merge pull request #40628 from Rawan10101/wasm-runtime-bundling
build(wasm): bundle runtime files into MEMFS
2026-07-12 17:53:45 +02:00
bfredl e684a3dd18 Merge pull request #38546 from dchinmay2/push-pozrrzptmvnv
build(zig): add formatc and lintc steps
2026-07-10 11:18:43 +02:00
bfredl f034e5f66b Merge pull request #40522 from bfredl/neopath
refactor(test): unify XDG path handling (cmake vs zig)
2026-07-06 11:47:13 +02:00
bfredl 349f810eed refactor(test): unify XDG path handling (cmake vs zig)
fixes #40381
2026-07-06 10:55:20 +02:00
bfredl 7a4186e1d5 Merge pull request #40306 from Rawan10101/wasm-stubs
build(wasm): add missing platform stubs
2026-07-01 20:57:02 +02:00
bfredl b22a8e2f00 Merge pull request #40475 from bfredl/vim.NIL
fix(lua): give nicer error message when trying to index vim.NIL
2026-06-29 19:28:52 +02:00
bfredl 71b28da0f4 fix(lua): give nicer error message when trying to index vim.NIL
The added test shows the context, one expected a JSON field
to be a Object but it was a null value

pros: shows `vim.NIL` instead of `a userdata`
cons: the context `field 'foo'` is lost. I think this is generated
with internal magic which is hard to replicate.
2026-06-29 14:20:09 +02:00
bfredl f653ca5ace Merge pull request #40323 from bfredl/no_default_again
fix(tests): use builtin default attributes in more places
2026-06-19 21:11:13 +02:00
bfredl 90157d3790 fix(tests): use builtin default attributes in more places 2026-06-19 19:42:28 +02:00
bfredl fd4655ea3a Merge pull request #40099 from bfredl/uniluna
feat(startup)!: "standalone" mode -ll is kill
2026-06-04 15:04:03 +02:00
bfredl 03aff28b73 feat(startup)!: "standalone" mode -ll is kill
This was originally used because we needed a lua interpreter to run the
standalone _busted_ lua application (except we used fuckery behind the
scenes to fake its binary dependencies with our own binary
dependencies). Now we longer do that, we instead run `test.harness` as a
standard nvim -l script. as this mode is no longer used in tests it
risks going to bitrot anyway.

NB: -ll mode still had some theoretical benefits like quicker
initialization and more "native" printing behavior, etc.
But we can incrementally work on "nvim -l" mode instead
of maintaining a separate special thing.
2026-06-04 14:35:41 +02:00
bfredl 45d7201b83 Merge pull request #40048 from bfredl/noinstall
fix(build.zig): fixes and improvements
2026-06-04 12:36:37 +02:00
bfredl d8e9593024 feat(build.zig): easier cross-complilation
invocation of cross-compilation changed, see news.txt blurb
2026-06-04 11:33:35 +02:00
bfredl 2a78df3a5a refactor(build.zig): no need to pass around b.graph.io next to b 2026-06-04 11:33:35 +02:00
bfredl b9913e78cc build(ci): check zig fmt 2026-06-04 11:33:35 +02:00
bfredl 3f67dabcc7 fix(test): check for SIGINT between tests
when running `zig build functionaltest`, it might
take a while until the test harness nvim instance checks
for interrupts, which causes a lot of tests to keep running after
CTRL+C. Check after each test instead
2026-06-04 11:33:35 +02:00
bfredl aceb0627c8 fix(build.zig): do not depend on b.install_path on configure time
This is in preparation of zig 0.17 where b.install_path is no
longer known inside `pub fn build()`.

Builds which should hardcode a runtime path into the binary has to specify it.
We could use a nlua0 helper to encode the install path at build time but
I think this is cleaner anyway. (like currently the appimage still
encodes a temporary build path which is nonsensical, it is better to
just include none)

Similarily b.args will not be available anymore (there will just
be an opaque pass-through)
2026-06-04 11:33:35 +02:00
bfredl 772cfcf267 Merge pull request #39074 from bfredl/retromania
build(zig): run oldtests in zig builds (RETROMANIA HYPERDRIVE)
2026-06-02 12:34:40 +02:00
bfredl 49dc3d9424 build(zig): run oldtests in zig builds with new lua runner
The new lua based runner replaces Makefile, runnvim.sh and runnvim.vim

As it happens, we run a `--headless` nvim inside a `:terminal` layer,
this is pointless.
Also there is still a lot remnants for oldesttests, but we don't
have any except for test1.in which just checks the environment
for following, nonexistant oldesttests. so just skip that.

For now, the actual vimscript code which runs in vim-under-test is
completely unchanged.

On macos, luajit is finally working with the latest ziglua master.
Also fix some minor bugs regarding locales, such as incorrect
HAVE_WORKING_LIBINTL checks
2026-06-02 11:12:11 +02:00
bfredl fb5aad1d07 Merge pull request #40008 from Rawan10101/feat/wasm-emscripten-zig016
build: add wasm/emscripten build support
2026-06-01 20:36:58 +02:00
bfredl c71e4ab2df Merge pull request #40018 from bfredl/neoziglua
fix(build): ziglua API change (very very minorly)
2026-05-27 11:59:07 +02:00
bfredl dd5b738ffc fix(build): ziglua API change (very very minorly) 2026-05-27 11:22:03 +02:00
bfredl 2d192f3e6d Merge pull request #39920 from bfredl/luastring
fix(lua): use even safer and even better error() message conversion
2026-05-25 16:35:40 +02:00
bfredl 24e23de721 fix(lua): use even safer and even better error() message conversion
problem:
this crashes neovim:

ondska = setmetatable({}, {__tostring = error})
error(ondska)

solution:

make it not crash neovim
2026-05-25 11:06:02 +02:00
bfredl 2e82e0bcf6 Merge pull request #39887 from bfredl/o_dod_suss
fix(warnings): annotate or ignore all uses of printf formatting
2026-05-20 12:55:30 +02:00
bfredl 3d391cf84d fix(warnings): annotate or ignore all uses of printf formatting
This fixes all clang 22 warnings of the form: "warning: diagnostic behavior
may be improved by adding the 'format(printf, 3, 4)' attribute to the
declaration of 'some_function'"

dialog_msg() was essentially a NULL-handling wrapper. but some callsites
already use their own NULL handling or NULL:s are impossible as the
value has already been assumed non-NULL. Non-locally assuming
a buffer size is also a code smell, especially if we can
just use "sizeof buff" without a wrapper.

append_redir() is... whatever it is.
2026-05-19 19:42:58 +02:00
bfredl c7ea9c075a Merge pull request #39429 from ollien/mouse-n-visual
fix(mouse): mouse=n should not adjust visual selection
2026-05-19 12:36:26 +02:00
bfredl e932d6ff17 fix(api): regressions with lua return values #39837
fixes #39834
fixes #39833
fixes #39851
2026-05-18 09:05:49 -04:00
bfredl 0aa7d2f4d5 feat(api): nvim_buf_call, win_call can has multiple return values #39801
from the "because we can and it is not much code" department. (diffcount
excluding tests is actually negative)

fixes https://github.com/neovim/neovim/issues/39636#issuecomment-4397141270
2026-05-17 10:25:22 -04:00
bfredl 7673adc952 Merge pull request #38675 from bfredl/errdefer
feat(ui_client): "press ENTER" free nvim crashes
2026-05-12 11:00:26 +02:00
bfredl 8275b7b491 Merge pull request #39736 from bfredl/odod
fix(style): some clang-tidy 22 fixes
2026-05-11 16:27:14 +02:00
bfredl 7e9015fecb fix(style): some clang-tidy 22 fixes
CI currently uses clang-tidy 20, but this affects local builds
and CI is going to be upgraded sooner or later.

Some remaining systematic issues:

- clang-tidy warns agains any atoi() or atol() usage (because of no
  error handling)

- functions which takes (char *fmt, char *only_string_arg) and expect
  fmt to contain exactly one "%s" usage.

- error: initializing non-local variable with non-const expression depending on
  uninitialized non-local variable (cppcoreguidelines-interfaces-global-init)

  This is a much worse problem in C++ (hence C++ core guidelines) where
  initialization is intermingled with arbitrary code execution. I
  "think" in plain C, the linker will either resolve all these
  deterministically or barf an error. But with some restructuring
  we could make all static initialization actually static..
2026-05-11 13:31:10 +02:00
bfredl 9c42db1181 feat(ui_client): "press ENTER" free nvim crash debugging
This feature might be a little silly and niche, but it is very useful
for _my_ workflow (and open source is about mee)

An issue which is never present on high quality RELEASE builds, but
might occur on Debug builds is that the Nvim server crashes
on some error in your unfinished PR code. If you compile your debug
builds with sanitizers enabled, as you should, the ASAN/UBSAN runtime
will print some useful info about your mistake to stderr or a log file,
such as a stack trace. This can be used to jump to the error in the
code.

This allows the nvim server to install a signal hander in the ui client,
which can load this log file in a good safe version of nvim and parse it
using 'errorformat'

This is inspired by the "press ENTER" free workflow of ui2 and applies
it beyond the lifetime cycle of the nvim instance.

example config:
```lua
    local asan = vim.env.ASAN_OPTIONS
    if asan ~= nil and string.match(asan, "log_path=/tmp/nvim_asan")  then
      local myname = "/tmp/nvim_asan."..vim.uv.getpid()

      local args = {"--embed", "-n", "+set efm=%+A%*[^/]%f:%l:%c", "+silent cfile "..myname, "+silent cfirst", "+silent copen"}

      vim.api.nvim__set_restart_on_crash("nvim", args)
    end
```

and run your debug nvim like so

    ASAN_OPTIONS=handle_abort=1,handle_sigill=1,log_path=/tmp/nvim_asan ./build/bin/nvim
2026-05-11 11:00:03 +02:00
bfredl 77a27076e8 Merge pull request #39469 from bfredl/systempipa
fix(vim.system): use REAL PIPES for vim.system, similar to jobs
2026-04-30 13:31:45 +02:00
bfredl 46fa9354b6 fix(vim.system): use REAL PIPES for vim.system, similar to jobs
This is essentially the #35991 fix for the #35984 issue,
but applied to vim.system().
2026-04-30 12:22:57 +02:00
bfredl 2124ffb27b Merge pull request #39339 from bfredl/reunification
fix(build.zig): reunify parser install path
2026-04-23 15:55:52 +02:00
bfredl d50cca5b87 fix(build.zig): reunify parser install path
Both for tests and for system wide install, $PREFIX/lib/nvim/parser
is a valid path for tree-sitter parsers. This also brings the build.zig
behavior in line with how we set up the paths in CMakeLists.txt
2026-04-23 15:37:37 +02:00
bfredl fe60268258 Merge pull request #39076 from bfredl/zig0.16
IT IS HAPPENING: Zig 0.16
2026-04-21 20:09:57 +02:00
bfredl 52693e7af3 fix(build): more changes to make zig 0.16.0 work 2026-04-21 12:46:01 +02:00
bfredl 64fee8e075 Merge pull request #38928 from bfredl/alot_is_alot
refactor(oldtest): one test_alot.vim file is already alot
2026-04-10 20:20:49 +02:00
bfredl eea1b99282 refactor(oldtest): one test_alot.vim file is already alot
neovim always uses encoding=utf8. Thus a lot of utf8 tests are just a
lot of tests. Meanwhile test_regexp_latin.vim is a bit of a lone child,
it can just run as a separate test without a shell layer (running it in
the same process as its utf8 sibling is not allowed
2026-04-10 13:21:20 +02:00
bfredl 7a27c5b0c8 Merge pull request #38704 from bfredl/oldunix
fix(oldtests): unix.vim was ignored
2026-04-08 14:20:25 +02:00
bfredl 0ce48e7a9c fix(oldtests): move useful settings from ignored unix.vim
the unix.vim file was probably accidentally ignored at some point.
An actual invokation of nvim-under-test would in practice look like

  ["/path/to/neovim/build/bin/nvim", "-u", "unix.vim", "-U", "NONE", "-i", "NONE", "--noplugin", "--headless", "-u", "NONE", "--cmd", "set shortmess-=F", "-S", "runtest.vim", "test_arabic.vim"]

but -u NONE cancels out the earlier -u unix.vim

By now, too many tests rely on specific behavior from "NONE", so copy in
the useful parts of unix.vim to the cmdline again. also, some tests
conflict with `directory=.` (or even `directory=Xtempswapdir`) so don't use that.

`-U NONE` is dead code in Nvim, remove it.
2026-04-08 13:12:14 +02:00
bfredl b64d96ed8d Merge pull request #38741 from dchinmay2/push-qzzkxtlkrquz
build(zig): update version
2026-04-04 10:34:47 +02:00
bfredl acf294f1fd Merge pull request #35587 from vanaigr/decor-fix-col_until
fix(decor): clamp last column by decor provider range
2026-03-23 21:06:59 +01:00
bfredl 2f07bd0c1f Merge pull request #38148 from bfredl/gnuology
fix(build): glibc 2.43 happened
2026-03-05 11:52:56 +01:00
bfredl f0d981544b fix(build): glibc 2.43 happened
using the GNU compiler we just get a bunch of const warnings we can fix.
clang, however, gets really upset that the standard library suddenly
starts using a lot of c11 features, despite us being in -std=gnu99 mode.

Basically, _GNU_SOURCE which we set is taken as a _carte blanche_ by the
glibc headers to do whatever they please, and thus we must inform clang
that everything is still OK.
2026-03-05 10:48:25 +01:00
bfredl 6535353b6d Merge pull request #38128 from bfredl/neodamage
refactor(marktree): use better structure for damaged pairs after splice
2026-03-04 09:04:32 +01:00
bfredl 00e51d2d1c refactor(marktree): use better structure for damaged pairs after splice
Previous implementation used a full sort but this is unnecessary. Pairs
do not need to be processed in id-order, all that we did was make
"start" and "end" marks find each other. This can be done with a hash
table instead. The "grow only" khash_t mentioned in the TODO is
the since long merged #24985 5970157e refactor with dense value array,
to not regress on memory locality.
2026-03-03 11:23:20 +01:00
bfredl 044300b72c Merge pull request #38074 from bfredl/mapfix
fix(map): use names like Map_key_value not Map_keyvalue
2026-02-27 13:58:04 +01:00
bfredl 84d3bbef23 fix(map): use names like Map_key_value not Map_keyvalue
This makes little difference in practice except for extremely unlikely
ambiguities. But it looks nicer in compiler errors and stacktraces where
you see the fully expanded names
2026-02-27 11:47:07 +01:00
bfredl 8f1c161d9d Merge pull request #38040 from bfredl/seenfix
fix(marktree): fix edge case bug regarding changing intersections
2026-02-26 12:49:29 +01:00
bfredl 37c0efb21c fix(marktree): fix edge case bug regarding changing intersections
fix #37867

This bug happens when only one end is moved between different nodes,
but the other end is also moved but within the same node.
When this happens we need the correct previous position even for the
internal move. This code shall be refactored to make the intent clearer,
(and avoid some unnecessary processing) but this is a fix for the observable
bug.

Thanks to KevinGoodsell for providing a deterministic
reproduce using fuzzing techniques.
2026-02-26 10:30:41 +01:00
bfredl 3a4a7a7efb Merge pull request #37722 from bfredl/fastpackadd
perf(runtime): hardware accelerated "packadd opt_package"
2026-02-26 10:29:49 +01:00
bfredl 3aa04f7ee4 perf(runtime): hardware accelerated "packadd opt_package"
fixes #37586

when doing `packadd mypackage` up to two exact paths are added
to &rtp. Instead of recalculating runtime_search_path from scratch,
we can "just" splice these two paths in

This is simple in theory, but get complicated in practice as
"after" dirs do exist and need some wrangling.

Echasnovski did some benchmarking, to show that this reduces overhead
of a init.lua configuration style where separate `packadd!` calls are
used spread out during the config. In addition, "batched" addition
(either using "start" packages or packadd! a lot of opt packages at
once) does not regress.

A theoretical simplification could be to NEVER explicitly add "after"
dirs to &rtp, but implicitly add all existing "after" dirs in reverse
order when calculating the effective run time path. This might be tricky
to do without breaking 12 tpope plugins again tho.

We might also instead consider solutions where &rtp remains fully expanded but no longer is the main source of truth. But this is all post 0.12 work. This PR is an alright stopgap to make 0.12 fully support intended use cases of vim.pack.add() .
2026-02-25 09:39:54 +01:00
bfredl 4d754d2704 Merge pull request #37265 from bfredl/zigluajit
fix(build): build.zig: use luajit also on windows
2026-02-23 18:43:28 +01:00
bfredl 8069df2661 fix(build): build.zig: use luajit for windows
These were disabled as they failed when tested with cross-compiling,
but it works fine for windows natively on ci, so let's use that.

mac os builds after disabling debug info, which currently
triggers a bug in zig's MachO linker: natecraddock/ziglua#191
Tracking issue: https://codeberg.org/ziglang/zig/issues/30669
Unfortunately actually using the JIT of luajit still triggers
issues on mac os, so we cannot use it yet.

Also sync luajit version used via ziglua to a recent one
like we use in cmake, see natecraddock/ziglua#196
2026-02-23 10:33:06 +01:00
bfredl fa9e071b83 Merge pull request #37826 from glepnir/hl_underline_int_overflow
fix(highlight): blend underline check and use 64-bit key for attr cache to support 32-bit attr values
2026-02-18 09:46:41 +01:00
bfredl 4f44705a47 Merge pull request #37189 from bfredl/zigsafe
ci: test -Doptimize=ReleaseSafe
2026-01-16 09:14:54 +01:00
bfredl b4db223d33 fix(build): treesitter parsers are not ReleaseSafe 2026-01-15 11:43:46 +01:00
bfredl 1427b94200 fix(typval): allocated dynamic size must be at least the static size
fixes #37160
2026-01-15 11:43:46 +01:00
bfredl ad1c07ebb9 build(ci): test zig build -Doptimize=ReleaseSafe
the ReleaseSafe build mode activates UBSAN rules
which was previously untested, most notably `-fsanitize=object-size`
2026-01-15 11:43:40 +01:00
bfredl 6082b7f850 Merge pull request #37040 from p00f/push-nwlkmnvmmlrt
feat(build.zig): add option to use system dependencies
2026-01-15 11:07:40 +01:00
bfredl 686a9edd38 Merge pull request #35991 from bfredl/neopipe
fix(shell): ceci n'est pas une pipe
2026-01-13 10:31:32 +01:00
bfredl 5581a53437 fix(shell): ceci n'est pas une pipe
On linux /dev/stdin is defined as a symlink to /proc/self/fd/0
This in turn is defined as a "magic" symlink which is allowed to point
to internal kernel objects which really does not have a file
name. As a glaring inconsistency, fopen("/proc/self/fd/0", "r")
works if fd was originally opened using pipe() but not using
socketpair(). As it happens UV_CREATE_PIPE does not create pipes
but creates socket pairs. These two unfortunate conditions
means that using /dev/stdin and similar does not work in
shell commands in nvim on linux. as a work around, override
libuv's descicion and create an actual pipe pair.

This change is not needed on BSD:s but done unconditionally for simplicity,
except for on windows where it is not done for stdout because of windows

fixes #35984
2026-01-13 09:41:51 +01:00
bfredl 05de037795 Merge pull request #36819 from bfredl/zigrt
feat(build): make build.zig useful for full runtime install
2025-12-12 12:50:38 +01:00
bfredl 8e0692cdc5 feat(build): support full runtime distribution work
Working towards making the build.zig build actually useful for
users..

For building a full runtime distribution in /usr or /opt/nvim or
whatever, use

sudo zig build install -p /usr

by default "zig build" will now work like "make" e.g. just build the binary
and the generated parts of the runtime. This will work for development,
but you need to use both parts of the runtime, just like with
an "uninstalled" cmake build:

   zig build
   VIM=. ./zig-out/bin/nvim --clean --cmd "set rtp+=./zig-out/runtime"

As a wrapper, `zig build run_dev` can be used
2025-12-09 12:57:14 +01:00
bfredl 6741c134e1 fix(build): zig build can has git version 2025-12-03 11:48:14 +01:00
bfredl d84e786112 fix(tests): use correct signature for unpacker_teardown() 2025-11-12 14:19:06 +01:00
bfredl 5d3df1c41a Merge pull request #36495 from bfredl/deflate
fix(build): remove .tar.gz workaround for bug fixed in zig 0.15.2
2025-11-09 13:52:30 +01:00
bfredl f98b5ee619 fix(build): remove .tar.gz workaround for bug fixed in zig 0.15.2
The issue affecting this particular archive was fixed in
https://github.com/ziglang/zig/pull/25512, and this was included in
zig 0.15.2
2025-11-09 11:59:32 +01:00
bfredl d825e51169 Merge pull request #36381 from bfredl/nobilium
feat(build): HAVE_UNIBILIUM
2025-10-31 10:17:02 +01:00
bfredl e1ffa8d33b feat(build): HAVE_UNIBILIUM
compile time features are hot again.

Note: this changes the &term value for builtin definition from
'builtin_xterm' to just 'xterm'. It's an xterm regardless of we use an
external definition or an internal. Prior to this commit the vast
majority of POSIX users will have used external terminfo, so plugins and
scripts are only going to have checked for &term == 'xterm' or 'tmux' or
whatever.
The status of external loading is still available in "nvim -V3" output.
2025-10-31 08:39:32 +01:00
bfredl 2621066104 Merge pull request #36270 from bfredl/zig0.15.2
build(deps): bump zig to v0.15.2
2025-10-31 08:36:29 +01:00
bfredl 1df2171f2c build(deps): bump zig to v0.15.2 2025-10-30 21:29:52 +01:00
bfredl b75a68ff06 Merge pull request #36367 from bfredl/metadata_iii
refactor(build): split out metadata step
2025-10-29 11:37:14 +01:00
bfredl a4c9247a1a Merge pull request #36233 from bfredl/neotermkeyi
refactor(termkey): make termkey use builtin info
2025-10-29 10:28:50 +01:00
bfredl 829a5dc83e refactor(build): split out metadata step
This was part of an attempt to add "git describe" to zig build
without re-building too much. This doesn't yet work as zig upstream
changes are are also needed, but I think this was a sensible refactor
even in isolation, so breaking it out.

"API dispatch" doesn't depend on any ui event stuff nor on
version, that was just an accident of the metadata collection
being crammed into the same file.

Remove "manual invocation" instruction. this is going to bitrot anyway.
Both cmake and build.zig allows you to extract the command line of a
step, so you can debug it separately.
2025-10-29 10:23:55 +01:00
bfredl 4b678a499c refactor(termkey): make termkey use internal terminfo properly
problem: termkey/driver-ti.c had its internal dependency upon unibilium
which would completely skip builtin terminfo defs.
solution: add termkey info to TerminfoEntry struct

NOTE: this disables a lot of named function keys which are present as
terminfo "keys" both are mostly unset in terminfo entries for modern
terminals, and also  not recognized by nvim as mappable keys
anyway, except a few ones like `<undo>` which this still will keep.

We probably don't want to encode up to F63 keys forever. While only 12
physical keys are available on modern keybords, instead Chords using
F-keys are usually encoded as high key numbers, like <C-S-F3>
becoming <F39> . But reconsideirg that has implications for configuration
that is best done as a separate (breaking) change.
2025-10-29 09:43:36 +01:00
bfredl be73c35943 Merge pull request #36242 from bfredl/o_dod
fix(tui): use the correct offset for invisible cursor after sync
2025-10-18 20:07:19 +02:00
bfredl 460738e02d fix(tui): use the correct offset for invisible cursor after sync
fixes #36237
2025-10-18 19:29:04 +02:00
bfredl 86d90f3fff Merge pull request #36234 from bfredl/neoterm2
fix(tui): CSI is not ESC (sync mode)
2025-10-18 13:05:59 +02:00
bfredl 03eb331abf fix(tui): CSI is not ESC (sync mode) 2025-10-18 12:17:36 +02:00
bfredl d44d7f7c5e Merge pull request #35952 from bfredl/neocurses
perf(tui): faster implementation of terminfo
2025-10-18 12:07:31 +02:00
bfredl e656d7be2e perf(tui): faster implementation of terminfo
The processing of terminfo can be separated into two steps:

1. The initialization of terminfo, which includes trying to find $TERM
   in a terminfo database file. As a fallback, common terminfo
   definitions are compiled in. After this, we apply a lot of ad-hoc
   patching to cover over limitations of terminfo.

2. While processing updates from nvim, actually using terminfo strings
   and formatting them with runtime values. for this part, terminfo
   essentially is a hyper-enhanced version of snprintf(), including
   a sm0l stack based virtual machine which can manipulate the runtime
   parameters.

This PR completely replaces libuniblium for step 2, with code
vendored from NetBSD's libtermkey which has been adapted to use typesafe
input parameters and to write into an output buffer in place.

The most immedatiate effects is a performance enhancement of
update_attrs() which is a very hot function when profiling the
TUI-process part of screen updates. In a stupid microbenchmark
(essentially calling nvim__screenshot over and over in a loop) this
leads to a speedup of ca 1.5x for redrawing the screen on the TUI-side.
What this means in practise when using nvim as a text editor is probably
no noticible effect at all, and when reabusing nvim as idk a full screen
RGB ASCII art rendrer maybe an increase from 72 to 75 FPS LMAO.

As nice side-effect, reduce the usage of unibilium to initialization only..
which will make it easier to remove, replace or make unibilium optional,
adressing #31989. Specifically, the builtin fallback doesn't use
unibilium at all, so a unibilium-free build is in principle possible
if the builtin definitions are good enough.

As a caveat, this PR doesn't touch libtermkey at all, which still has a
conditional dependency on unibilium. This will be investigated in a
follow-up PR

Note: the check of $TERMCOLOR was moved from tui/tui.c to
_defaults.lua in d7651b27d5 as we want to
skip the logic in _defaults.lua if the env var was set, but there
is no harm in TUI getting the right value when the TUI is trying to
initialize its terminfo shenanigans. Also this check is needed when
a TUI connects to a `--headless` server later, which will observe
a different $TERMCOLOR value than the nvim core process itself.
2025-10-18 11:36:16 +02:00
bfredl f1a8bb45ca Merge pull request #35387 from bfredl/zigci
build(ci): run more zig builds on ci
2025-09-15 14:09:10 +02:00
bfredl 0458a1e694 build(ci): bump zig to 0.15.1 and add more platforms
- Bump zig version to 0.15.1 and workaround zig fetch hang (ziglang/zig#24916)
- add mac os zig build (currently without luajit, linker failure)
- Add windows zig build, currently with very limited testing
2025-09-15 12:10:23 +02:00
bfredl 0923ba322b Merge pull request #35706 from bfredl/fixdoc
fix(gen): prevent "make doc" failure due to temporary files
2025-09-11 12:00:13 +02:00
bfredl 805dd5d047 fix(gen): prevent "make doc" failure due to temporary files
Notably, the existence of a swap file like .buffer.c.swp might cause
mayhem. As a reasonable filter, only process *.c and *.h files using the
c grammar.
2025-09-10 12:24:30 +02:00
bfredl b95aedeae4 Merge pull request #35536 from bfredl/skipahead
perf(highlight): allow decoration providers to skip ranges without data

fixes #35644
2025-09-09 20:53:31 +02:00
bfredl 5119c03be7 fix(treesitter): use subpriorities for tree ordering
This partially reverts 0b8a72b739,
that is unreverts 15e77a56b7

"priority" is an internal neovim concept which does not occur in shared
queries. Ideally a single priority space should eventually be enough
for our needs. But as we don't want to poke at the usages of
priorities right now in the wider ecosystem,
introduce the "subpriorities" so that treesitter code can distinguish
highlights of the same priorities with different tree nesting depth.

This mainly affects `injection.combined` as parent-tree nodes might appear
in the middle of child-tree nodes which otherwise is not possible.
2025-09-09 12:56:49 +02:00
bfredl f9d2115a35 perf(highlight): allow decoration providers to skip ranges without data
Continuing the work of #31400

That PR allowed the provider to be invoked multiple times per line.
We want only to do that when there actually is more data later on the
line. Additionally, we want to skip over lines which contain no new
highlight items. The TS query cursor already tells us what the next
position with more data is, so there is no need to reinvoke the range
callback before that.

NB: this removes the double buffering introduced in #32619 which
is funtamentally incompatible with this (nvim core is supposed to keep
track of long ranges by itself, without requiring a callback reinvoke
blitz). Need to adjust the priorities some other way to fix the same issue.
2025-09-09 12:54:04 +02:00
bfredl 772f1966a3 Merge pull request #31400 from vanaigr/decor-provider-range
feat(decor): add range-based highlighting
2025-08-29 10:33:15 +02:00
bfredl df9ff9cfa8 Merge pull request #35434 from bfredl/zigtag2
fix(build): workaround errors in zig build due to stale cache
2025-08-22 19:40:38 +02:00
bfredl ec8a0c7340 fix(build): workaround errors in zig build due to stale cache
addDirectoryArg with a source dir is not enough to depend on changes
to invidiual files. as a workaround, mark this step as having
side-effects (always being run) for now.
2025-08-22 19:10:43 +02:00