Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(api): evaluate statusline string #16020

Merged
merged 1 commit into from Oct 18, 2021

Conversation

famiu
Copy link
Member

@famiu famiu commented Oct 14, 2021

Previously, there was no way to evaluate a statusline string through the Neovim API. This adds an API function nvim_eval_statusline to allow evaluating a statusline string and getting information regarding it.

Closes #15849

@github-actions github-actions bot added the api libnvim, Nvim RPC API label Oct 14, 2021
@zeertzjq zeertzjq added the statusline tabline, winbar, statuscolumn label Oct 14, 2021
@shadmansaleh
Copy link
Contributor

shadmansaleh commented Oct 14, 2021

I'm not sure if statusline_strwidth needs to be a api function. It should be trivial to expand the string and get width from there .

Also if this is exposing build_str_stl_hl what happens to highlights and tabline click thing ?

I think at lest highlights will be useful for tests and in floatline.

@famiu
Copy link
Member Author

famiu commented Oct 14, 2021

I'm not sure if statusline_strwidth needs to be a api function. It should be trivial to expand the string and get width from there .

That's true, but the reason I wanted to make it an API function was because it should be more performant to just return the return value of build_stl_str_hl instead of having to calculate it all over again. Though I suppose whether that's worth it is arguable.

Also if this is exposing build_str_stl_hl what happens to highlights and tabline click thing ?

I think at lest highlights will be useful for tests and in floatline.

I'll look into it then

@shadmansaleh
Copy link
Contributor

shadmansaleh commented Oct 14, 2021

it should be more performant to just return the return value of build_stl_str_hl instead of having to calculate it all over again. Though I suppose whether that's worth it is arguable.

That performance improvement is miniscule it won't be noticeable in anyway . Adding a new api function just for that doesn't seem justifiable to me. I feel like api should handle generic use cases instead of specific ones.

I don't exactly remember but don't String structs store it's length upon creation .

Also does this need to be exposed over rpc . I'm saying because this can be lua only too like vim.diff . Though maintainers will be able to tell you better on this.

@famiu
Copy link
Member Author

famiu commented Oct 14, 2021

it should be more performant to just return the return value of build_stl_str_hl instead of having to calculate it all over again. Though I suppose whether that's worth it is arguable.

That performance improvement is miniscule it won't be noticeable in anyway . Adding a new api function just for that doesn't seem justifiable to me. I feel like api should handle generic use cases instead of specific ones.

True I guess. I'll remove it in that case.

I don't exactly remember but doesn't String structs store it's length upon creation .

VimL strings do, Lua strings don't. But that's pointless either way since we need the display width of the string. The length is not equal to the displaywidth since there can be multi-byte or multi-width characters.

Also does this need to be exposed over rpc . I'm saying because this can be lua only too like vim.diff . Though maintainers will be able to tell you better on this.

Not sure about this one honestly

@famiu
Copy link
Member Author

famiu commented Oct 14, 2021

@shadmansaleh regarding highlight info, how exactly would you want that to be returned? Since each stl_hlrec_t contains the highlight group / ID alongside a pointer to the first character of the statusline where the highlight starts. What we could do is return the index of the character instead of a pointer, I suppose, but even then, that'd still require defining another API function just to get the highlight info.

@famiu famiu changed the title feat(api): expand and get display width of statusline feat(api): expand statusline Oct 14, 2021
@shadmansaleh
Copy link
Contributor

I have an idea . How about instead of nvim_expand_statusline_str(fmt, winid) we have it as nvim_expand_statusline_str(fmt, opts) . where opts is like {win = winid} if win isn't provided it runs on curwin . with opts this can later be expended without breaking . We could have sommething like eval_hl = true in opts on which hl_rect will also be handled .

Return value can be a dict that contains evaluated string + processed hl_rect when applicable ( how nvim_get_hl_by_name/id returns dictonaries ) . The cpointers in hl_rect makes no sence out of c . I feel like returning something like a list of { name = hl_name, start = start_pos, end = end_pos } makes more sence ( where hl_name is string of highlight name, start_pos is int start position of hl on evaluated string, similarly end_pos is int end position of hl on evaluated string. But that will require hl_rect to be processed hence it should optin to keep the eval part morew performent .

@clason
Copy link
Member

clason commented Oct 14, 2021

Yes. API functions should be future-proofed by taking dicts with optional arguments as far as possible.

@famiu famiu changed the title feat(api): expand statusline feat(api): evaluate statusline string Oct 14, 2021
@famiu
Copy link
Member Author

famiu commented Oct 14, 2021

@shadmansaleh thoughts on this now?

src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/keysets.lua Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/keysets.lua Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
@famiu
Copy link
Member Author

famiu commented Oct 15, 2021

@gpanders would it be necessary to reset cursorbind temporarily before calling build_stl_str_hl like how win_redr_custom does or would that be unnecessary?

@famiu famiu requested a review from gpanders October 15, 2021 14:55
@gpanders
Copy link
Member

@gpanders would it be necessary to reset cursorbind temporarily before calling build_stl_str_hl like how win_redr_custom does or would that be unnecessary?

Good question. To be honest I'm not 100% sure. My guess is yes, since it looks like build_stl_str_hl changes the current window which is why that's being done in win_redr_custom and in any case it can't hurt. I would advise adding a comment to that effect in nvim_eval_statusline.

@gpanders
Copy link
Member

gpanders commented Oct 15, 2021

I'm getting a SIGTRAP with the following:

:set stl=%1*%f
:echo nvim_eval_statusline(&stl, {'highlights': 1})

Backtrace:

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=1, subcode=0x18188d360)
    frame #0: 0x000000018188d360 libsystem_c.dylib`__chk_fail_overflow + 24
    frame #1: 0x000000018188d690 libsystem_c.dylib`__snprintf_chk + 60
  * frame #2: 0x0000000100037528 nvim`nvim_eval_statusline(str=<unavailable>, opts=<unavailable>, err=<unavailable>) at vim.c:3013:9 [opt]
    frame #3: 0x0000000100026740 nvim`handle_nvim_eval_statusline(channel_id=9223372036854775808, args=<unavailable>, error=0x000000016fdf7410) at dispatch_wrappers.generated.h:6370:19 [opt]
    frame #4: 0x000000010008e754 nvim`api_wrapper(argvars=<unavailable>, rettv=0x000000016fdf7d70, fptr=(nvim`handle_nvim_eval_statusline at dispatch_wrappers.generated.h:6335)) at funcs.c:276:19 [opt]
    frame #5: 0x000000010008b798 nvim`call_internal_func(fname="nvim_eval_statusline", argcount=2, argvars=0x000000016fdf7730, rettv=0x000000016fdf7d70) at funcs.c:196:3 [opt]
    frame #6: 0x00000001000a7bdc nvim`call_func(funcname=<unavailable>, len=20, rettv=<unavailable>, argcount_in=<unavailable>, argvars_in=<unavailable>, funcexe=0x000000016fdf78f0) at userfunc.c:1592:15 [opt]
    frame #7: 0x00000001000a75b0 nvim`get_func_tv(name="nvim_eval_statusline", len=20, rettv=0x000000016fdf7d70, arg=0x000000016fdf7d80, funcexe=0x000000016fdf78f0) at userfunc.c:459:11 [opt]
    frame #8: 0x00000001000832c8 nvim`eval_func(arg=0x000000016fdf7d80, name=<unavailable>, name_len=<unavailable>, rettv=0x000000016fdf7d70, evaluate=<unavailable>, basetv=0x0000000000000000) at eval.c:3304:13 [opt]
    frame #9: 0x0000000100082528 nvim`eval7(arg=0x000000016fdf7d80, rettv=0x000000016fdf7d70, evaluate=1, want_string=0) at eval.c:4232:15 [opt]
    frame #10: 0x0000000100081f54 nvim`eval6(arg=0x000000016fdf7d80, rettv=0x000000016fdf7d70, evaluate=1, want_string=<unavailable>) at eval.c:3903:7 [opt]
    frame #11: 0x0000000100081b88 nvim`eval5(arg=0x000000016fdf7d80, rettv=0x000000016fdf7d70, evaluate=1) at eval.c:3728:7 [opt]
    frame #12: 0x000000010008191c nvim`eval4(arg=0x000000016fdf7d80, rettv=0x000000016fdf7d70, evaluate=1) at eval.c:3622:7 [opt]
    frame #13: 0x00000001000817b4 nvim`eval3(arg=0x000000016fdf7d80, rettv=0x000000016fdf7d70, evaluate=1) at eval.c:3541:7 [opt]
    frame #14: 0x0000000100071228 nvim`eval1 [inlined] eval2(arg=0x000000016fdf7d80, rettv=0x000000016fdf7d70, evaluate=1) at eval.c:3470:7 [opt]
    frame #15: 0x0000000100071220 nvim`eval1(arg=0x000000016fdf7d80, rettv=0x000000016fdf7d70, evaluate=1) at eval.c:3394:7 [opt]
    frame #16: 0x000000010007e208 nvim`ex_echo(eap=0x000000016fdf7f30) at eval.c:9807:11 [opt]
    frame #17: 0x00000001000c3660 nvim`do_cmdline [inlined] do_one_cmd(cmdlinep=0x000000016fdf7f28, flags=0, cstack=0x000000016fdf8008, fgetline=(nvim`getexline at ex_getln.c:2576), cookie=0x0000000000000000) at ex_docmd.c:1983:5 [opt]
    frame #18: 0x00000001000c2420 nvim`do_cmdline(cmdline=<unavailable>, fgetline=(nvim`getexline at ex_getln.c:2576), cookie=<unavailable>, flags=0) at ex_docmd.c:604:20 [opt]
    frame #19: 0x0000000100161c48 nvim`nv_colon(cap=0x000000016fdf87d8) at normal.c:4817:18 [opt]
    frame #20: 0x000000010015f398 nvim`normal_execute(state=0x000000016fdf8748, key=<unavailable>) at normal.c:1164:3 [opt]
    frame #21: 0x0000000100213bdc nvim`state_enter(s=0x000000016fdf8748) at state.c:68:26 [opt]
    frame #22: 0x0000000100158bb4 nvim`normal_enter(cmdwin=<unavailable>, noexmode=<unavailable>) at normal.c:469:3 [opt]
    frame #23: 0x0000000100123950 nvim`main(argc=<unavailable>, argv=<unavailable>) at main.c:547:3 [opt]
    frame #24: 0x0000000181964420 libdyld.dylib`start + 4
(lldb)

Coming from this line:

snprintf(grpname, sizeof(grpname), "User%d", sp->userhl);

Btw sizeof(grpname) is just sizeof(char *), which I don't think is what you want since you are malloc'ing 6 bytes in the line before this. In fact, changing sizeof(grpname) to just 6 fixes the error above.

Copy link
Member

@gpanders gpanders left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since it's only six bytes let's just allocate it on the stack (ends up being fewer lines too when you account for the xfree).

src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
@famiu famiu requested a review from gpanders October 16, 2021 14:40
Copy link
Member

@gpanders gpanders left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code looks good to me. Just had the one question about the highlighting and some nit-picking on the docs.

src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
test/functional/api/vim_spec.lua Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
src/nvim/api/vim.c Outdated Show resolved Hide resolved
@famiu
Copy link
Member Author

famiu commented Oct 16, 2021

@gpanders BTW, on an unrelated note, @shadmansaleh suggested making the max width of the statusline and the buffer length (size of the char buf[]) of the statusline buffer configurable through opts. I think maxwidth being configurable makes sense, but I don't see any reason to allow buffer length to be configurable. Thoughts on this?

@gpanders
Copy link
Member

gpanders commented Oct 16, 2021

Also does this need to be exposed over rpc . I'm saying because this can be lua only too like vim.diff . Though maintainers will be able to tell you better on this.

Seems like it would be useful for external UIs that want to manage their own statusline displays, so I'd say yes.

BTW, on an unrelated note, @shadmansaleh suggested making the max width of the statusline and the buffer length (size of the char buf[]) of the statusline buffer configurable through opts.

Max width makes sense, buffer length does not. Allocating 4096 bytes has no meaningful performance difference from allocating 1024 bytes. The complexity trade-off isn't worth the marginal memory savings.

@shadmansaleh
Copy link
Contributor

shadmansaleh commented Oct 16, 2021

Length of buf seems too much of a technical detail to expose imo.

In that case expose maxwidth whe maxwidth is given use 2|3 * maxwidth as buflen.

I actually agreed on exposing maxwidth only . And the buflen part was just to make sure evaluated status expr fits buflen so buffer doesn't overflow not to save tiny bit of memory :D . I remembered default buflen being ~256 . if it's like 4096 / 1024 I think we are fine stl is unlikely to ever cross that.

Seems like it would be useful for external UIs that want to manage their own statusline displays, so I'd say yes.

That's a good point for this to be an api function 👍

@famiu famiu requested a review from gpanders October 16, 2021 17:20
Copy link
Member

@gpanders gpanders left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! Nice work

I made a couple of (very) minor changes, so be sure to pull before you squash your commits.

@famiu
Copy link
Member Author

famiu commented Oct 17, 2021

LGTM! Nice work

I made a couple of (very) minor changes, so be sure to pull before you squash your commits.

I also had to make a minor change to the code, though I don't think it really changes much. I'll squash the commits now

@famiu famiu requested a review from gpanders October 17, 2021 03:02
@famiu
Copy link
Member Author

famiu commented Oct 17, 2021

This should be ready for merge now

Copy link
Member

@justinmk justinmk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks well-wrought, thank you! And thanks to the reviewers.

Would you be willing to take over (or start over) #6607 ? I think UIs would be interested in structured 'statusline' and 'tabline' as UI events.

src/nvim/api/keysets.lua Outdated Show resolved Hide resolved

// Temporarily reset 'cursorbind' to prevent side effects from moving the cursor away and back.
int p_crb_save = ewp->w_p_crb;
ewp->w_p_crb = false;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be done in build_stl_str_hl ? Why is it not needed usually?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not exactly sure. All I know is it's done in win_redr_custom so I did it in the function as a precautionary measure

Copy link
Member Author

@famiu famiu Oct 18, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's probably not needed though considering that only win_redr_custom does it before calling build_stl_str_hl. Probably has something to do with the fact that it's redrawing windows, so cursorbind might cause an issue in that case. So maybe I should remove it?

src/nvim/api/vim.c Outdated Show resolved Hide resolved
@famiu
Copy link
Member Author

famiu commented Oct 18, 2021

Would you be willing to take over (or start over) #6607 ? I think UIs would be interested in structured 'statusline' and 'tabline' as UI events.

I could definitely take a look at it and give it a shot :)

I also plan to work on #9342 eventually so there's that as well

Adds API function `nvim_eval_statusline` to allow evaluating a
statusline string and obtaining information regarding it.

Closes neovim#15849
@famiu famiu requested review from bfredl and justinmk October 18, 2021 02:30
@vimpostor vimpostor mentioned this pull request Oct 18, 2021
@justinmk justinmk merged commit 9086938 into neovim:master Oct 18, 2021
@justinmk
Copy link
Member

Merged, don't want to block this. But would be great to have a better story for #16020 (comment) , either assert() something or cover it with a test or encapsulate in build_stl_str_hl.

Thank you!

/// - str: (string) Characters that will be displayed on the statusline.
/// - width: (number) Display width of the statusline.
/// - highlights: Array containing highlight information of the statusline. Only included when
/// the "highlights" key in {opts} is |TRUE|. Each element of the array is a
Copy link
Member

@justinmk justinmk Oct 19, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

|TRUE| is the old vimscript "truthy" concept, whereas API functions typically require strict boolean. (And this function uses api_object_to_bool so that applies here.)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

api_object_to_bool treats 1 and 0 as true and false, respectively, so I think |TRUE| is appropriate here.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh. Er, why are we doing that?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

whereas API functions typically require strict boolean

I'm not sure this is the case, a grep of api_object_to_bool implies it's quite common.

Copy link
Member

@justinmk justinmk Oct 19, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

a grep of api_object_to_bool implies it's quite common.

Not really. Mostly in newer functions, and mostly when dealing with Dicts. Probably just an accident of the fact that dealing with heterogenous Dicts is inconvenient, and api_object_to_bool is convenient.

@vimpostor vimpostor mentioned this pull request Nov 8, 2021
bfredl added a commit that referenced this pull request Nov 30, 2021
BREAKING CHANGES

* 32-bit windows builds are no longer provided.

* **build deps**: use libuv 1.42.0 upstream for WIN32 (#15889) (f6c0a37), closes #15889
  * removes Windows 7 support
  * removes support for mouse and alternate buffers in TUI for Windows 8 and 8.1

* **lsp/diagnostic:** highlight groups and signs for LSP diagnostics renamed (e.g. `LspDiagnosticsDefaultWarning` to `DiagnosticWarn`) (a5bbb93)

* **diagnostic:** make DiagnosticChanged a first class autocmd (#16098) (150a592), closes #16098
  * `au User LspDiagnosticsChanged` autocommands are not supported. Use the new first-class DiagnosticChanged event instead.

* **lua**: `register_keystroke_callback` => `on_key` (#15460) (69fe427)
  * **note**: this breaking change was included in 0.5.1

FEATURES

* **:source, nvim_exec:** defer script item creation until s:var access (da9b0ab)
* **:source, nvim_exec:** support script-local variables (d4ed51e), closes #13143 #11507
* **lua:** add trimempty optional parameter to vim.split (5fa26e2)
* **lua:** add vim.str_utf_{start,end} (#16129) (2230b57)
* **lua:** add vim.str_utf_pos function (d752cbc)
* **lsp:** aggregate code actions from all clients (#15121) (c36df20)
* **api:** add lua C bindings for xdiff (#14536) (3d3c0c6)
* **api:** evaluate statusline string #16020 (9086938)
* **api:** named marks set, get, delete #15346 (49fdc62)
* **api:** nvim_get_chan_info: include "argv" for jobs #15537 (0603eba), closes #15440
* **api:** win_viewport also sends line_count #15613 (086631c)
* **api:** support :terminal input callback in lua (9e41e82)
* **ci:** add backport PR action (#14766) (6cc456d)
* **decorations:** allow more than one stacked highlight in a virt_text (1495d36)
* **decorations:** support virtual lines (392c658) (8d7816c)
* **diagnostic:** move vim.lsp.diagnostic to vim.diagostic and support other sources (a5bbb93)
* **diagnostic:** add 'prefix' option to open_float (#16321) (3c74ba4)
* **diagnostic:** add option to include diagnostic source (d43151e)
* **diagnostic:** allow 'prefix' option to return highlight (cc48837)
* **diagnostic:** allow customized diagnostic messages (#15742) (d999c96)
* **diagnostic:** match(), tolist(), fromlist() #15704 (e61ea77)
* **diagnostic:** update jumplist on goto_next/prev (#15942) (b55944e)
* **diagnostic:** use `scope = 'line'` by default for `open_float()` (#16456) (217f9f8), closes #16453
* **diagnostic:** support severity_sort (32c0631)
* **checkhealth:** provide function for command line completion (8b43b07)
* **f_chansend:** support Blob data argument (7e9ea08)
* **job:** add parameter to close stdin (eb7f24b)
* **keywordprg:** use :terminal for external commands #15398 (a90513c), closes #2995 #2761
* **lsp:** add 'focus' option to open_floating_preview (#16465) (fff8827)
* **lsp:** add a registry for client side code action commands (6c03601)
* **lsp:** add client command support to codelens (#15820) (19a77cd)
* **lsp:** add codeAction/resolve support (#15818) (ec4731d)
* **lsp:** add exit_timeout flag (#16070) (80456cf)
* **lsp:** add formatexpr (#16186) (52fa1d2)
* **lsp:** add lsp healthcheck (e268026)
* **lsp:** add per-client commands (#16101) (519d8de)
* **lsp:** add tagfunc (#16103) (f940e7a)
* **lsp:** add warning message for large log size (e6777a7)
* **lsp:** allow configuring zindex for floating windows (#15086) (c487a73)
* **lsp:** allow diagnostics to be disabled for a buffer (#15134) (1aeb945)
* **lsp:** allow root_dir to be nil (#15430) (ff0833c)
* **lsp:** highlight active parameter in signature help (#15018) (af26371)
* **lsp:** improve vim.lsp.util.apply_text_edits (#15561) (41cfba6)
* **lsp:** include original request params in handler ctx (187579f)
* **lsp:** jump to diagnostics by position (#14795) (ea39ff5)
* **lsp:** Make line diagnostics display prettier (e43dbfd)
* **lsp:** make list handlers configurable (#15199) (3e00d4f)
* **lsp:** support textDocument/prepareRename (#15514) (c1f573f)
* **lsp:** use uv_spawn to check if server executable (#16430) (1a60580)
* **lsp:** use vim.ui.select() in codelenses (#16004) (e7ea54a)
* **lsp:** utilize textEdit.range for startbyte in omnifunc (#15957) (e9d6f7c)
* **lua:** add lua-cjson as vendored dependency (8decc9f)
* **lua:** add vim.mpack for msgpack support in lua (eaf661d)
* **lua:** allow passing handles to vim.b/w/t (6c5e7bd)
* **lua:** convert binary string with NULs to Blob (de9df82)
* **lua:** document support of packages with v:lua syntax (9dd371b)
* **lua:** enable stack traces in error output (#16228) (03b805a)
* **lua:** expose lua-cjson as vim.json (30fed27)
* **lua:** make vim.mpack support vim.NIL and vim.empty_dict() (0f59666)
* **match:** allow hl group to be defined after :match command (fca52f5)
* **msgpack:** convert Blobs to BIN strings (af6f454)
* **health:** support lua healthchecks (9249dcd), closes #15632
* **shada:** restore Blob globals properly (ef729fb)
* **terminal:** TermClose: set exit code in v:event.status #15406 (50b30de), closes #4713
* **treesitter:** add next, prev sibling method (1400841)
* **treesitter:** allow to set highlight priority for queries (242608e)
* **ui:** add `opt.kind` to `vim.ui.select` (#15838) (7ae86c1)
* **ui:** add vim.ui.input and use in lsp rename (#15959) (16d4af6)
* **ui:** add vim.ui.select and use in code actions (#15771) (63fde08)
* **vim script:** support calling v:lua as a method (b2994e3)

CHANGES

* **defaults:** auto-create backup dir (4600193)
* **defaults:** inccommand=nosplit #15395 (7215d35)
* **defaults:** set undo points in <C-U> and <C-W> (#15400) (2cb8db3)
* **defaults:** limit syntax cost on CmdwinEnter #15401 (622a36b), closes #6289 #6399
* **defaults:** map CTRL-L to search highlights, update diffs #15385 (0aa8128)
* **defaults:** map Y to y$ #13268 (5a111c1), closes #416 #6289
* **defaults:** remove 'options' from viewoptions #15397 (3954537), closes #6289
* **defaults:** set hidden (f6c72b7)
* **defaults:** set nojoinspaces (d417e67)
* **defaults:** switchbuf=uselast #15394 (4ba7495)
* **runtime:** add packages as `"/pack/*/start/*"` patterns to &rtp (9df7e02)
* **startup:** load builtin plugins with --clean #15893 (c7a63f3), closes #15605
* **terminal:** set cursorlineopt=number in terminal mode (#15493) (c61a386)
* **window:** skip non-focusable floats for :windo (#15378) (e8631cb)

PERFORMANCE IMPROVEMENTS

* **api:** avoid spurious allocations when converting small objects (705e8f1)
* **highlight:** use a hashtable for highlight group names (bb4b4d7)
* **lua:** optimize vim.deep_equal #15236 (4b452d4)
* **lua:** don't use regexes inside lua require'mod' (ea2023f), closes #15147 #15497
* **lsp:** improve json deserialization performance (#15854) (912a6e5)
* **map:** reduce double pointer indirection to single pointer indirection (9e651a9)
* **treesitter:** avoid string lookup of highlight name in hot loop (2460f0a)

FIXES

* **:source, nvim_exec:** handle Vimscript line continuations #14809 (6188926), closes #14807
* **:source:** copy curbuf lines to memory before sourcing #15111 (afdc9e6)
* allow str_utfindex second argument to be an explicit nil  (#16448) (512ec46)
* **api:** fix crash after set_option_value_for() #15390 (8b0e6cc), closes #14097 #13577
* **api:** fix nvim_buf_set_extmark (2338345)
* **autocmd:** fix conditions in block_autocmds, unblock_autocmds #15372 (29712ae), closes #6279
* **buffer_updates:** cleanup test behavior (54b2c68)
* **buffer_updates:** handle :delete of the very last line in buffer (8335e26)
* **buffer_updates:** handle :sort of already sorted buffer (ef687d3)
* **buffer_updates:** make `lockmarks` not affect extmarks and buffer updates. fixes #12861 (7d171b1)
* **bufupdates:** send correct updates for visual paste (1423146)
* **build:** add an env var to re-enable the colors (5087347)
* **build:** call find_package(Threads) before using its variables (f446ab3)
* **build:** export symbols on Windows (aa644b7)
* **build:** fix build failure in MinGW (0503e17)
* **build:** make vendored libmpack and libmpack-lua build properly (2a08aef)
* **channel:** throw error if sending to internal channel w/o terminal (3b89fee)
* **checkhealth:** duplicate checks if module name has "-" #15935 (a36c6e5)
* **checkhealth:** mitigate issues with duplicate healthchecks #15919 (acd5e83), closes #15259
* **ci:** disable broken test on openbsd on all CI due to resource constraints (a3e2636)
* **ci:** re-run GHA for ready_for_review events (#15377) (c6ef956)
* **decorations:** crash when :bdelete (extmark_free_all) after clear_namespace (cd353aa), closes #15212
* **defaults:** "syntax sync maxlines=1" on CmdwinEnter #15552 (5f8518b), closes #15401
* **defaults:** do not map Y in visual-mode #15387 (54726e8), closes #13268
* **diagnostic:** allow floats to be focusable (#16093) (427bac6)
* **diagnostic:** change default severity_sort order (938ed45)
* **diagnostic:** clamp line numbers in setqflist and setloclist (5b0d8f8)
* **diagnostic:** correctly handle folder level diagnostics (f87779a)
* **diagnostic:** deepcopy diagnostics before clamping line numbers (2abc799)
* **diagnostic:** do not focus floats in goto functions (#16433) (b5b025f)
* **diagnostic:** don't clamp line numbers in setqflist (0341c68)
* **diagnostic:** don't return nil when callers expect a table (#15765) (057606e)
* **diagnostic:** don't use nil col if missing from qflist (#16357) (5e46f64)
* **diagnostic:** error on invalid severity value (#15965) (d5dd0aa)
* **diagnostic:** fix navigation with diagnostics placed past end of line (34bb5fa)
* **diagnostic:** fix option resolution in open_float (#16229) (fd34784)
* **diagnostic:** fix wrong data type in setqflist() (3fd1450)
* **diagnostic:** get line count per buffer when clamping (c59f200)
* **diagnostic:** handle an unknown or missing client (#16242) (1fdbd29)
* **diagnostic:** handle diagnostics placed past the end of line (#16095) (a2994c8)
* **diagnostic:** make set() go through cache when calling show() (d93f47d)
* **diagnostic:** only update decorations for loaded buffers (#15715) (924e8e4)
* **diagnostic:** preserve fields from LSP diagnostics via user_data (#15735) (17b7968)
* **diagnostic:** remove useless highlight links (#15683) (c13242c), closes #15585
* disable clipboard when test registers (dd63d93)
* **docgen:** add tagfunc.lua (0746f00)
* **doc:** various fixes #15604 (4eb1ebb)
* **eval:** add the vimscript-1 feature to has() (18b32fc)
* **eval:** checking for a non-empty string is too strict (#15987) (1dbbaf8)
* **eval:** fix has('wsl') #16153 (16d06fa), closes #12642 #16143
* **eval:** fixup for empty modifier in fnamemodify (#16368) (a7ad509), closes #16367
* **extmark:** fix missing virt_lines when using id param of set_extmark (995dbd2)
* **extmarks:** splice extmarks on nv_Undo #15920 (e069361)
* **fileio:** replace characters over INT_MAX with U+FFFD (#16354) (a2e5c2f), closes #11877
* **float:** fix potential heap corruption in win_redr_border (de670f3)
* **float:** redraw if w_border_adj changed (7ff1bc1)
* **heath/provider.vim:** using list as string #16007 (5365f24), closes #15988
* **highlight:** remove syncolor.vim, always include syntax colors (9afa0d2), closes #15176 #12573 #15205
* **inccommand:** ignore trailing commands only for *previewed* command #15638 (1f8c91b), closes #8796 #7494
* include ci/ in exported tarball (d6f03aa), closes #15856
* **input:** never reinterpret unmapped ALT- chrods in Terminal mode (#16222) (5ce35ab)
* **input:** resolve isolated (non-ALT/META) mappings #13109 (c4857b6), closes #13042 #13086 #15869
* **jobwait:** always drain process event queues #15402 (3c081d0), closes #15349
* **lsp_spec:** tests depended on previous session (069d1de)
* **lsp:** accept file URIs without a hostname (a2c2a08)
* **lsp:** add done flag to messages returned in util.get_progress_messages() (#15985) (45fa70a)
* **lsp:** add placeholder cancel function (#16189) (4da0351)
* **lsp:** add textDocument/prepareRename to capability map (#15961) (fcc11d5), closes #15899
* **lsp:** adjust legacy show diagnostic functions to use correct scope (#16106) (dc6c9fe)
* **lsp:** allow diagnostic.clear to accept nil bufnr (#15137) (4ed2d4f)
* **lsp:** avoid duplicates in client attached buffers (#16099) (c5525f2)
* **lsp:** avoid serializing boolean as key (#15810) (96614f8)
* **lsp:** change rpc start notify level to warn (#16467) (04c7b55)
* **lsp:** change signature of buf_highlight_references (#16345) (eb3d591)
* **lsp:** correctly parse LSP snippets #15579 (516775e), closes #15522
* **lsp:** default to UTF-16 in make_position_params (2e3a474)
* **lsp:** do not index nil client in progress (#16262) (8f31b21)
* **lsp:** do not invoke handlers for unsupported methods (#15926) (d288daa)
* **lsp:** don't update active_clients on exit_timeout (#16192) (98f5782)
* **lsp:** enable additional capabilities (#15470) (5d63354)
* **lsp:** ensure buffers are re-attached on rename (#16266) (ee3a58d)
* **lsp:** Ensure users get feedback on references/symbols errors or empty results (256570a)
* **lsp:** expose ContentModified error code to callbacks (#15262) (3f09732)
* **lsp:** fix cursor row after textEdits (#16038) (bd2f61c)
* **lsp:** gracefully handle nil workspaceFolders (#16284) (0ecc58c)
* **lsp:** guard textDocument/codeAction command logic #15769 (433bda4)
* **lsp:** improve symbols_to_items performance (#16197) (5ad15c9)
* **lsp:** Include client name in handler error messages (#15227) (24f2b9e)
* **lsp:** pass bufnr for async formatting (#15084) (c31bc6e)
* **lsp:** persist diagnostic config for clients (bcc9ba5)
* **lsp:** prevent double <text> for cached plaintext markup (910967e)
* **lsp:** restore diagnostics extmarks on buffer changes (#15011) (77b33e4)
* **lsp:** rewrite incremental sync (#16252) (2ecf0a4)
* **lsp:** send buffer contents joined on fileformat-specific linebreak (#16334) (134a638)
* **lsp:** send textDocument/didChange for each buffer (#16431) (3451121)
* **lsp:** support duplicate params in signature help (#15032) (9132b76)
* **lsp:** update lsp-handler signature in call_hierarchy (#15738) (8164adc)
* **lsp:** update workspace/applyEdit handler signature (#15573) (3f526fe)
* **lua:** fix vim.deepcopy for metatables & cycled tables (#16435) (eb876a0)
* **lua:** preserve argument lists which are not lists (6896d22)
* **man.vim:** ensure buftype=nofile after :tag or :stag #15675 (29bc648), closes #15650
* **man.vim:** filetype=man is too eager #15488 (2548a9e), closes #15487 #15487
* **mouse:** fix mouse drag positions on multigrid #12667 (0dcfd0e), closes #15091
* **mouse:** correct dragged position in composed layout (810da1a)
* **multigrid:** mouse events crash neovim (28ac6c0)
* **nvim_open_win:** crash if autocmds delete buffer/window #15549 (0c06da1), closes #15548
* **options:** using :set fillchars should clear local value (7528bce)
* prevent K_EVENT from stopping Select mode CTRL-O #15688 (5f144ef)
* **provider:** compare versions as number, not string (python 3.10 support) #15937 (e16adbf), closes #14586
* **screen:** make display_tick monotonic up to 2^64. fixes #16152 (9e88c9c)
* **screen:** missing search highlights when redrawing from timer #15380 (db695cc), closes #13074 #14064
* **shared:** do not treat empty tables as list in deep extend (#15094) (526fc60)
* **sign:** reset auto sign column with minimum in float win minimal style (c8f57f6)
* **startup:** init.lua: set $MYVIMRC to absolute path #15748 (c76cddf)
* **termdebug:** replace mapset with nvim_set_keymap (#15699) (4d7dcbe)
* **termdebug:** replace term_getline with getbufline #15598 (11289ad)
* **terminal:** close without ! if the job is stopped (55defa1), closes #4683
* **terminal:** free terminal if close_buffer() closes a closed terminal (#16264) (14def4d)
* **test/dumplog:** tostring(rv) before formatting as string (ddaa0cc)
* **tests:** use isolated XDG_DATA_HOME in startup tests (8e663e2)
* **treesitter:** do not map hl_group when no mapping is set (f489d98)
* **treesitter:** run predicates more often in iter_matches (458f2aa)
* **tui:** extend smglr ignores to smglp and smgrp (#16239) (3ba800f)
* **tui:** remove obsolete $NVIM detection #15791 (4414584), closes #12937 #11390
* **tutor:** formatting, layout #15098 (c52ec8f), closes #15088
* **ui:** use nowait for q mapping in floating window (#16427) (c132144)
* **v:lua:** fix emsg when calling v:lua directly (da9005a)
* **vim-patch.sh:** run nvim with -u NONE -n #16179 (97ae0ab)
* **vim.opt:** vimL map string values not trimmed (#14982) (4906156)
* **window:** win_close from other tabpage #15454 (90b2da1), closes #15313
* **windowing:** positioning of relative floats (9065730)
Shougo pushed a commit to Shougo/neovim that referenced this pull request Dec 1, 2021
BREAKING CHANGES

* 32-bit windows builds are no longer provided.

* **build deps**: use libuv 1.42.0 upstream for WIN32 (neovim#15889) (f6c0a37), closes neovim#15889
  * removes Windows 7 support
  * removes support for mouse and alternate buffers in TUI for Windows 8 and 8.1

* **lsp/diagnostic:** highlight groups and signs for LSP diagnostics renamed (e.g. `LspDiagnosticsDefaultWarning` to `DiagnosticWarn`) (a5bbb93)

* **diagnostic:** make DiagnosticChanged a first class autocmd (neovim#16098) (150a592), closes neovim#16098
  * `au User LspDiagnosticsChanged` autocommands are not supported. Use the new first-class DiagnosticChanged event instead.

* **lua**: `register_keystroke_callback` => `on_key` (neovim#15460) (69fe427)
  * **note**: this breaking change was included in 0.5.1

FEATURES

* **:source, nvim_exec:** defer script item creation until s:var access (da9b0ab)
* **:source, nvim_exec:** support script-local variables (d4ed51e), closes neovim#13143 neovim#11507
* **lua:** add trimempty optional parameter to vim.split (5fa26e2)
* **lua:** add vim.str_utf_{start,end} (neovim#16129) (2230b57)
* **lua:** add vim.str_utf_pos function (d752cbc)
* **lsp:** aggregate code actions from all clients (neovim#15121) (c36df20)
* **api:** add lua C bindings for xdiff (neovim#14536) (3d3c0c6)
* **api:** evaluate statusline string neovim#16020 (9086938)
* **api:** named marks set, get, delete neovim#15346 (49fdc62)
* **api:** nvim_get_chan_info: include "argv" for jobs neovim#15537 (0603eba), closes neovim#15440
* **api:** win_viewport also sends line_count neovim#15613 (086631c)
* **api:** support :terminal input callback in lua (9e41e82)
* **ci:** add backport PR action (neovim#14766) (6cc456d)
* **decorations:** allow more than one stacked highlight in a virt_text (1495d36)
* **decorations:** support virtual lines (392c658) (8d7816c)
* **diagnostic:** move vim.lsp.diagnostic to vim.diagostic and support other sources (a5bbb93)
* **diagnostic:** add 'prefix' option to open_float (neovim#16321) (3c74ba4)
* **diagnostic:** add option to include diagnostic source (d43151e)
* **diagnostic:** allow 'prefix' option to return highlight (cc48837)
* **diagnostic:** allow customized diagnostic messages (neovim#15742) (d999c96)
* **diagnostic:** match(), tolist(), fromlist() neovim#15704 (e61ea77)
* **diagnostic:** update jumplist on goto_next/prev (neovim#15942) (b55944e)
* **diagnostic:** use `scope = 'line'` by default for `open_float()` (neovim#16456) (217f9f8), closes neovim#16453
* **diagnostic:** support severity_sort (32c0631)
* **checkhealth:** provide function for command line completion (8b43b07)
* **f_chansend:** support Blob data argument (7e9ea08)
* **job:** add parameter to close stdin (eb7f24b)
* **keywordprg:** use :terminal for external commands neovim#15398 (a90513c), closes neovim#2995 neovim#2761
* **lsp:** add 'focus' option to open_floating_preview (neovim#16465) (fff8827)
* **lsp:** add a registry for client side code action commands (6c03601)
* **lsp:** add client command support to codelens (neovim#15820) (19a77cd)
* **lsp:** add codeAction/resolve support (neovim#15818) (ec4731d)
* **lsp:** add exit_timeout flag (neovim#16070) (80456cf)
* **lsp:** add formatexpr (neovim#16186) (52fa1d2)
* **lsp:** add lsp healthcheck (e268026)
* **lsp:** add per-client commands (neovim#16101) (519d8de)
* **lsp:** add tagfunc (neovim#16103) (f940e7a)
* **lsp:** add warning message for large log size (e6777a7)
* **lsp:** allow configuring zindex for floating windows (neovim#15086) (c487a73)
* **lsp:** allow diagnostics to be disabled for a buffer (neovim#15134) (1aeb945)
* **lsp:** allow root_dir to be nil (neovim#15430) (ff0833c)
* **lsp:** highlight active parameter in signature help (neovim#15018) (af26371)
* **lsp:** improve vim.lsp.util.apply_text_edits (neovim#15561) (41cfba6)
* **lsp:** include original request params in handler ctx (187579f)
* **lsp:** jump to diagnostics by position (neovim#14795) (ea39ff5)
* **lsp:** Make line diagnostics display prettier (e43dbfd)
* **lsp:** make list handlers configurable (neovim#15199) (3e00d4f)
* **lsp:** support textDocument/prepareRename (neovim#15514) (c1f573f)
* **lsp:** use uv_spawn to check if server executable (neovim#16430) (1a60580)
* **lsp:** use vim.ui.select() in codelenses (neovim#16004) (e7ea54a)
* **lsp:** utilize textEdit.range for startbyte in omnifunc (neovim#15957) (e9d6f7c)
* **lua:** add lua-cjson as vendored dependency (8decc9f)
* **lua:** add vim.mpack for msgpack support in lua (eaf661d)
* **lua:** allow passing handles to vim.b/w/t (6c5e7bd)
* **lua:** convert binary string with NULs to Blob (de9df82)
* **lua:** document support of packages with v:lua syntax (9dd371b)
* **lua:** enable stack traces in error output (neovim#16228) (03b805a)
* **lua:** expose lua-cjson as vim.json (30fed27)
* **lua:** make vim.mpack support vim.NIL and vim.empty_dict() (0f59666)
* **match:** allow hl group to be defined after :match command (fca52f5)
* **msgpack:** convert Blobs to BIN strings (af6f454)
* **health:** support lua healthchecks (9249dcd), closes neovim#15632
* **shada:** restore Blob globals properly (ef729fb)
* **terminal:** TermClose: set exit code in v:event.status neovim#15406 (50b30de), closes neovim#4713
* **treesitter:** add next, prev sibling method (1400841)
* **treesitter:** allow to set highlight priority for queries (242608e)
* **ui:** add `opt.kind` to `vim.ui.select` (neovim#15838) (7ae86c1)
* **ui:** add vim.ui.input and use in lsp rename (neovim#15959) (16d4af6)
* **ui:** add vim.ui.select and use in code actions (neovim#15771) (63fde08)
* **vim script:** support calling v:lua as a method (b2994e3)

CHANGES

* **defaults:** auto-create backup dir (4600193)
* **defaults:** inccommand=nosplit neovim#15395 (7215d35)
* **defaults:** set undo points in <C-U> and <C-W> (neovim#15400) (2cb8db3)
* **defaults:** limit syntax cost on CmdwinEnter neovim#15401 (622a36b), closes neovim#6289 neovim#6399
* **defaults:** map CTRL-L to search highlights, update diffs neovim#15385 (0aa8128)
* **defaults:** map Y to y$ neovim#13268 (5a111c1), closes neovim#416 neovim#6289
* **defaults:** remove 'options' from viewoptions neovim#15397 (3954537), closes neovim#6289
* **defaults:** set hidden (f6c72b7)
* **defaults:** set nojoinspaces (d417e67)
* **defaults:** switchbuf=uselast neovim#15394 (4ba7495)
* **runtime:** add packages as `"/pack/*/start/*"` patterns to &rtp (9df7e02)
* **startup:** load builtin plugins with --clean neovim#15893 (c7a63f3), closes neovim#15605
* **terminal:** set cursorlineopt=number in terminal mode (neovim#15493) (c61a386)
* **window:** skip non-focusable floats for :windo (neovim#15378) (e8631cb)

PERFORMANCE IMPROVEMENTS

* **api:** avoid spurious allocations when converting small objects (705e8f1)
* **highlight:** use a hashtable for highlight group names (bb4b4d7)
* **lua:** optimize vim.deep_equal neovim#15236 (4b452d4)
* **lua:** don't use regexes inside lua require'mod' (ea2023f), closes neovim#15147 neovim#15497
* **lsp:** improve json deserialization performance (neovim#15854) (912a6e5)
* **map:** reduce double pointer indirection to single pointer indirection (9e651a9)
* **treesitter:** avoid string lookup of highlight name in hot loop (2460f0a)

FIXES

* **:source, nvim_exec:** handle Vimscript line continuations neovim#14809 (6188926), closes neovim#14807
* **:source:** copy curbuf lines to memory before sourcing neovim#15111 (afdc9e6)
* allow str_utfindex second argument to be an explicit nil  (neovim#16448) (512ec46)
* **api:** fix crash after set_option_value_for() neovim#15390 (8b0e6cc), closes neovim#14097 neovim#13577
* **api:** fix nvim_buf_set_extmark (2338345)
* **autocmd:** fix conditions in block_autocmds, unblock_autocmds neovim#15372 (29712ae), closes neovim#6279
* **buffer_updates:** cleanup test behavior (54b2c68)
* **buffer_updates:** handle :delete of the very last line in buffer (8335e26)
* **buffer_updates:** handle :sort of already sorted buffer (ef687d3)
* **buffer_updates:** make `lockmarks` not affect extmarks and buffer updates. fixes neovim#12861 (7d171b1)
* **bufupdates:** send correct updates for visual paste (1423146)
* **build:** add an env var to re-enable the colors (5087347)
* **build:** call find_package(Threads) before using its variables (f446ab3)
* **build:** export symbols on Windows (aa644b7)
* **build:** fix build failure in MinGW (0503e17)
* **build:** make vendored libmpack and libmpack-lua build properly (2a08aef)
* **channel:** throw error if sending to internal channel w/o terminal (3b89fee)
* **checkhealth:** duplicate checks if module name has "-" neovim#15935 (a36c6e5)
* **checkhealth:** mitigate issues with duplicate healthchecks neovim#15919 (acd5e83), closes neovim#15259
* **ci:** disable broken test on openbsd on all CI due to resource constraints (a3e2636)
* **ci:** re-run GHA for ready_for_review events (neovim#15377) (c6ef956)
* **decorations:** crash when :bdelete (extmark_free_all) after clear_namespace (cd353aa), closes neovim#15212
* **defaults:** "syntax sync maxlines=1" on CmdwinEnter neovim#15552 (5f8518b), closes neovim#15401
* **defaults:** do not map Y in visual-mode neovim#15387 (54726e8), closes neovim#13268
* **diagnostic:** allow floats to be focusable (neovim#16093) (427bac6)
* **diagnostic:** change default severity_sort order (938ed45)
* **diagnostic:** clamp line numbers in setqflist and setloclist (5b0d8f8)
* **diagnostic:** correctly handle folder level diagnostics (f87779a)
* **diagnostic:** deepcopy diagnostics before clamping line numbers (2abc799)
* **diagnostic:** do not focus floats in goto functions (neovim#16433) (b5b025f)
* **diagnostic:** don't clamp line numbers in setqflist (0341c68)
* **diagnostic:** don't return nil when callers expect a table (neovim#15765) (057606e)
* **diagnostic:** don't use nil col if missing from qflist (neovim#16357) (5e46f64)
* **diagnostic:** error on invalid severity value (neovim#15965) (d5dd0aa)
* **diagnostic:** fix navigation with diagnostics placed past end of line (34bb5fa)
* **diagnostic:** fix option resolution in open_float (neovim#16229) (fd34784)
* **diagnostic:** fix wrong data type in setqflist() (3fd1450)
* **diagnostic:** get line count per buffer when clamping (c59f200)
* **diagnostic:** handle an unknown or missing client (neovim#16242) (1fdbd29)
* **diagnostic:** handle diagnostics placed past the end of line (neovim#16095) (a2994c8)
* **diagnostic:** make set() go through cache when calling show() (d93f47d)
* **diagnostic:** only update decorations for loaded buffers (neovim#15715) (924e8e4)
* **diagnostic:** preserve fields from LSP diagnostics via user_data (neovim#15735) (17b7968)
* **diagnostic:** remove useless highlight links (neovim#15683) (c13242c), closes neovim#15585
* disable clipboard when test registers (dd63d93)
* **docgen:** add tagfunc.lua (0746f00)
* **doc:** various fixes neovim#15604 (4eb1ebb)
* **eval:** add the vimscript-1 feature to has() (18b32fc)
* **eval:** checking for a non-empty string is too strict (neovim#15987) (1dbbaf8)
* **eval:** fix has('wsl') neovim#16153 (16d06fa), closes neovim#12642 neovim#16143
* **eval:** fixup for empty modifier in fnamemodify (neovim#16368) (a7ad509), closes neovim#16367
* **extmark:** fix missing virt_lines when using id param of set_extmark (995dbd2)
* **extmarks:** splice extmarks on nv_Undo neovim#15920 (e069361)
* **fileio:** replace characters over INT_MAX with U+FFFD (neovim#16354) (a2e5c2f), closes neovim#11877
* **float:** fix potential heap corruption in win_redr_border (de670f3)
* **float:** redraw if w_border_adj changed (7ff1bc1)
* **heath/provider.vim:** using list as string neovim#16007 (5365f24), closes neovim#15988
* **highlight:** remove syncolor.vim, always include syntax colors (9afa0d2), closes neovim#15176 neovim#12573 neovim#15205
* **inccommand:** ignore trailing commands only for *previewed* command neovim#15638 (1f8c91b), closes neovim#8796 neovim#7494
* include ci/ in exported tarball (d6f03aa), closes neovim#15856
* **input:** never reinterpret unmapped ALT- chrods in Terminal mode (neovim#16222) (5ce35ab)
* **input:** resolve isolated (non-ALT/META) mappings neovim#13109 (c4857b6), closes neovim#13042 neovim#13086 neovim#15869
* **jobwait:** always drain process event queues neovim#15402 (3c081d0), closes neovim#15349
* **lsp_spec:** tests depended on previous session (069d1de)
* **lsp:** accept file URIs without a hostname (a2c2a08)
* **lsp:** add done flag to messages returned in util.get_progress_messages() (neovim#15985) (45fa70a)
* **lsp:** add placeholder cancel function (neovim#16189) (4da0351)
* **lsp:** add textDocument/prepareRename to capability map (neovim#15961) (fcc11d5), closes neovim#15899
* **lsp:** adjust legacy show diagnostic functions to use correct scope (neovim#16106) (dc6c9fe)
* **lsp:** allow diagnostic.clear to accept nil bufnr (neovim#15137) (4ed2d4f)
* **lsp:** avoid duplicates in client attached buffers (neovim#16099) (c5525f2)
* **lsp:** avoid serializing boolean as key (neovim#15810) (96614f8)
* **lsp:** change rpc start notify level to warn (neovim#16467) (04c7b55)
* **lsp:** change signature of buf_highlight_references (neovim#16345) (eb3d591)
* **lsp:** correctly parse LSP snippets neovim#15579 (516775e), closes neovim#15522
* **lsp:** default to UTF-16 in make_position_params (2e3a474)
* **lsp:** do not index nil client in progress (neovim#16262) (8f31b21)
* **lsp:** do not invoke handlers for unsupported methods (neovim#15926) (d288daa)
* **lsp:** don't update active_clients on exit_timeout (neovim#16192) (98f5782)
* **lsp:** enable additional capabilities (neovim#15470) (5d63354)
* **lsp:** ensure buffers are re-attached on rename (neovim#16266) (ee3a58d)
* **lsp:** Ensure users get feedback on references/symbols errors or empty results (256570a)
* **lsp:** expose ContentModified error code to callbacks (neovim#15262) (3f09732)
* **lsp:** fix cursor row after textEdits (neovim#16038) (bd2f61c)
* **lsp:** gracefully handle nil workspaceFolders (neovim#16284) (0ecc58c)
* **lsp:** guard textDocument/codeAction command logic neovim#15769 (433bda4)
* **lsp:** improve symbols_to_items performance (neovim#16197) (5ad15c9)
* **lsp:** Include client name in handler error messages (neovim#15227) (24f2b9e)
* **lsp:** pass bufnr for async formatting (neovim#15084) (c31bc6e)
* **lsp:** persist diagnostic config for clients (bcc9ba5)
* **lsp:** prevent double <text> for cached plaintext markup (910967e)
* **lsp:** restore diagnostics extmarks on buffer changes (neovim#15011) (77b33e4)
* **lsp:** rewrite incremental sync (neovim#16252) (2ecf0a4)
* **lsp:** send buffer contents joined on fileformat-specific linebreak (neovim#16334) (134a638)
* **lsp:** send textDocument/didChange for each buffer (neovim#16431) (3451121)
* **lsp:** support duplicate params in signature help (neovim#15032) (9132b76)
* **lsp:** update lsp-handler signature in call_hierarchy (neovim#15738) (8164adc)
* **lsp:** update workspace/applyEdit handler signature (neovim#15573) (3f526fe)
* **lua:** fix vim.deepcopy for metatables & cycled tables (neovim#16435) (eb876a0)
* **lua:** preserve argument lists which are not lists (6896d22)
* **man.vim:** ensure buftype=nofile after :tag or :stag neovim#15675 (29bc648), closes neovim#15650
* **man.vim:** filetype=man is too eager neovim#15488 (2548a9e), closes neovim#15487 neovim#15487
* **mouse:** fix mouse drag positions on multigrid neovim#12667 (0dcfd0e), closes neovim#15091
* **mouse:** correct dragged position in composed layout (810da1a)
* **multigrid:** mouse events crash neovim (28ac6c0)
* **nvim_open_win:** crash if autocmds delete buffer/window neovim#15549 (0c06da1), closes neovim#15548
* **options:** using :set fillchars should clear local value (7528bce)
* prevent K_EVENT from stopping Select mode CTRL-O neovim#15688 (5f144ef)
* **provider:** compare versions as number, not string (python 3.10 support) neovim#15937 (e16adbf), closes neovim#14586
* **screen:** make display_tick monotonic up to 2^64. fixes neovim#16152 (9e88c9c)
* **screen:** missing search highlights when redrawing from timer neovim#15380 (db695cc), closes neovim#13074 neovim#14064
* **shared:** do not treat empty tables as list in deep extend (neovim#15094) (526fc60)
* **sign:** reset auto sign column with minimum in float win minimal style (c8f57f6)
* **startup:** init.lua: set $MYVIMRC to absolute path neovim#15748 (c76cddf)
* **termdebug:** replace mapset with nvim_set_keymap (neovim#15699) (4d7dcbe)
* **termdebug:** replace term_getline with getbufline neovim#15598 (11289ad)
* **terminal:** close without ! if the job is stopped (55defa1), closes neovim#4683
* **terminal:** free terminal if close_buffer() closes a closed terminal (neovim#16264) (14def4d)
* **test/dumplog:** tostring(rv) before formatting as string (ddaa0cc)
* **tests:** use isolated XDG_DATA_HOME in startup tests (8e663e2)
* **treesitter:** do not map hl_group when no mapping is set (f489d98)
* **treesitter:** run predicates more often in iter_matches (458f2aa)
* **tui:** extend smglr ignores to smglp and smgrp (neovim#16239) (3ba800f)
* **tui:** remove obsolete $NVIM detection neovim#15791 (4414584), closes neovim#12937 neovim#11390
* **tutor:** formatting, layout neovim#15098 (c52ec8f), closes neovim#15088
* **ui:** use nowait for q mapping in floating window (neovim#16427) (c132144)
* **v:lua:** fix emsg when calling v:lua directly (da9005a)
* **vim-patch.sh:** run nvim with -u NONE -n neovim#16179 (97ae0ab)
* **vim.opt:** vimL map string values not trimmed (neovim#14982) (4906156)
* **window:** win_close from other tabpage neovim#15454 (90b2da1), closes neovim#15313
* **windowing:** positioning of relative floats (9065730)
lewis6991 pushed a commit to lewis6991/neovim that referenced this pull request Dec 12, 2021
Adds API function `nvim_eval_statusline` to allow evaluating a
statusline string and obtaining information regarding it.

Closes neovim#15849
@famiu famiu deleted the feat/api/expand-statusline branch May 23, 2022 15:00
@dundargoc dundargoc removed the request for review from bfredl October 29, 2022 12:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api libnvim, Nvim RPC API statusline tabline, winbar, statuscolumn
Projects
None yet
Development

Successfully merging this pull request may close these issues.

API function to expand statusline string
7 participants