aboutsummaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAge
* docs(eval): getline and indent function support string typeglepnir2024-02-29
| | | | | | Problem: getline and indent function missing string type in param. Solution: add string type in eval gen.
* vim-patch:9.1.0143: [security]: autocmd causes use-after-free in ↵zeertzjq2024-02-29
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | set_curbuf() (#27664) Problem: [security]: autocmd cause use-after-free in set_curbuf() (kawarimidoll) Solution: check side-effect of BufLeave autocommand, when the number of windows changed, close windows containing buffers that will be wiped, if curbuf changed unexpectedly make sure b_nwindows is decremented otherwise it cannot be wiped set_curbuf() already makes some efforts to ensure the BufLeave autocommands do not cause issues. However there are still 2 issues that are not taken care of: 1) If a BufLeave autocommand opens a new window containing the same buffer as that is going got be closed in close_buffer() a bit later, we suddenly have another window open, containing a free'd buffer. So we must check if the number of windows changed and if it does (and the current buffer is going to be wiped (according to the 'bufhidden' setting), let's immediately close all windows containing the current buffer using close_windows() 2) If a BufLeave autocommand changes our current buffer (displays it in the current window), buf->b_nwindow will be incremented. As part of set_curbuf() we will however enter another buffer soon, which means, the newly created curbuf will have b_nwindows still have set, even so the buffer is no longer displayed in a window. This causes later problems, because it will no longer be possible to wipe such a buffer. So just before entering the final buffer, check if the curbuf changed when calling the BufLeave autocommand and if it does (and curbuf is still valid), decrement curbuf->b_nwindows. Both issues can be verified using the provided test (however the second issue only because such an impacted buffer won't be wiped, causing futher issues in later tests). fixes: vim/vim#13839 closes: vim/vim#14104 https://github.com/vim/vim/commit/55f8bba73be5f9c3a5a4d0d6c5f56e65f2c7d3fc Co-authored-by: Christian Brabandt <cb@256bit.org>
* vim-patch:9.1.0142: getregion() can be improved (#27662)zeertzjq2024-02-29
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: getregion() can be improved (after v9.1.120) Solution: change getregion() implementation to use pos as lists and one optional {opt} dictionary (Shougo Matsushita) Note: The following is a breaking change! Currently, the getregion() function (included as of patch v9.1.120) takes 3 arguments: the first 2 arguments are strings, describing a position, arg3 is the type string. However, that is slightly inflexible, there is no way to specify additional arguments. So let's instead change the function signature to: getregion(pos1, pos2 [, {Dict}]) where both pos1 and pos2 are lists. This is slightly cleaner, and gives us the flexibility to specify additional arguments as key/value pairs to the optional Dict arg. Now it supports the "type" key to specify the selection type (characterwise, blockwise or linewise) and now in addition one can also define the selection type, independently of what the 'selection' option actually is. Technically, this is a breaking change, but since the getregion() Vimscript function is still quite new, this should be fine. closes: vim/vim#14090 https://github.com/vim/vim/commit/19b718828d8d5fab52d94c6cdba694641879ab38 Co-authored-by: Shougo Matsushita <Shougo.Matsu@gmail.com>
* vim-patch:9.1.0141: Put in Visual mode wrong if it replaces fold marker (#27661)zeertzjq2024-02-29
| | | | | | | | | | Problem: Put in Visual mode wrong if it replaces fold marker. Solution: Temporarily disable folding during put in Visual mode. (zeertzjq) fixes: vim/vim#14097 closes: vim/vim#14100 https://github.com/vim/vim/commit/4e141c66b9104136ddcf9cc240d2fbc83d825a5a
* refactor(metadata): generate all metadata in luabfredl2024-02-28
| | | | | | | | Then we can just load metadata in C as a single msgpack blob. Which also can be used directly as binarly data, instead of first unpacking all the functions and ui_events metadata to immediately pack it again, which was a bit of a silly walk (and one extra usecase of `msgpack_rpc_from_object` which will get yak shaved in the next PR)
* vim-patch:9.1.0140: cursor on wrong row after 1 char 'below' virtual text ↵zeertzjq2024-02-28
| | | | | | | | | | | | | | | | | | | | when EOL is shown (#27651) Problem: The cursor screen row was incorrectly being calculated when the cursor follows a 1 character text_align 'below' virtual text line, resulting in the cursor being shown on the wrong line. This was caused by a cell size of 2 instead of 1 being used for the EOL character, which propagated to the calculation of space for putting the 'below' virtual text on its own line. (rickhowe) Solution: Fix the size used for the EOL character in calculating the cursor's screen position (Dylan Thacker-Smith) fixes: vim/vim#11959 related: vim/vim#12028 closes: vim/vim#14096 https://github.com/vim/vim/commit/da0c9137d1ec96f4d79b818502d2f921a21f710e Co-authored-by: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
* feat(docs): replace lua2dox.luaLewis Russell2024-02-27
| | | | | | | | | | | | | | | | | | | | | | | | | | Problem: The documentation flow (`gen_vimdoc.py`) has several issues: - it's not very versatile - depends on doxygen - doesn't work well with Lua code as it requires an awkward filter script to convert it into pseudo-C. - The intermediate XML files and filters makes it too much like a rube goldberg machine. Solution: Re-implement the flow using Lua, LPEG and treesitter. - `gen_vimdoc.py` is now replaced with `gen_vimdoc.lua` and replicates a portion of the logic. - `lua2dox.lua` is gone! - No more XML files. - Doxygen is now longer used and instead we now use: - LPEG for comment parsing (see `scripts/luacats_grammar.lua` and `scripts/cdoc_grammar.lua`). - LPEG for C parsing (see `scripts/cdoc_parser.lua`) - Lua patterns for Lua parsing (see `scripts/luacats_parser.lua`). - Treesitter for Markdown parsing (see `scripts/text_utils.lua`). - The generated `runtime/doc/*.mpack` files have been removed. - `scripts/gen_eval_files.lua` now instead uses `scripts/cdoc_parser.lua` directly. - Text wrapping is implemented in `scripts/text_utils.lua` and appears to produce more consistent results (the main contributer to the diff of this change).
* docs: fix type of setreg() argument {options} (#27631)Maria José Solano2024-02-27
|
* vim-patch:9.1.0137: <Del> in cmdline mode doesn't delete composing chars ↵zeertzjq2024-02-27
| | | | | | | | | | (#27636) Problem: <Del> in cmdline mode doesn't delete composing chars Solution: Use mb_head_off() and mb_ptr2len() (zeertzjq) closes: vim/vim#14095 https://github.com/vim/vim/commit/ff2b79d23956263ab0120623c37e0b4498be01db
* refactor(msgpack): remove dead unpacker code in helpersbfredl2024-02-26
| | | | | Unpacker code now lives in unpacker.c This was part of the old unpacker which I forgor to remove.
* Merge pull request #27599 from bfredl/nofileallocbfredl2024-02-26
|\ | | | | refactor(fileio): remove API shell layer encouraging unnecessary allocations
| * refactor(shada): devirtualize writerbfredl2024-02-25
| | | | | | | | | | | | writer is only ever used with FileDescriptor. We already have separate code paths for serializing shada data into memory, see shada_encode_regs() and friends
| * refactor(fileio): remove API shell layer encouraging unnecessary allocationsbfredl2024-02-25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Functions like file_open_new() and file_open_fd_new() which just is a wrapper around the real functions but with an extra xmalloc/xfree around is an anti-pattern. If the caller really needs to allocate a FileDescriptor as a heap object, it can do that directly. FileDescriptor by itself is pretty much a pointer, or rather two: the OS fd index and a pointer to a buffer. So most of the time an extra pointer layer is just wasteful. In the case of scriptin[curscript] in getchar.c, curscript used to mean in practice: N+1 open scripts when curscript>0 zero or one open scripts when curscript==0 Which means scriptin[0] had to be compared to NULL to disambiguate the curscript=0 case. Instead, use curscript==-1 to mean that are no script, then all pointer comparisons dissappear and we can just use an array of structs without extra pointers.
* | fix(mbyte): fix bugs in utf_cp_*_off() functionsVanaIgr2024-02-26
| | | | | | | | | | | | Problems: - Illegal bytes after valid UTF-8 char cause utf_cp_*_off() to fail. - When stream isn't NUL-terminated, utf_cp_*_off() may go over the end. Solution: Don't go over end of the char of end of the string.
* | fix(process): start pty process eof timer on main thread (#27625)zeertzjq2024-02-26
|/
* docs: fix several misleading and superfluous wordings (#27609)Evgeni Chasnovski2024-02-25
|
* vim-patch:9.1.0131: buffer-completion may not always find all matches (#27610)zeertzjq2024-02-24
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Problem: buffer-completion code too complicated and does not always find all matches (irisjae) Solution: do not try to anchor pattern to beginning of line or directory-separator, always return all matches Note: we are considering the non-fuzzy buffer-matching here. Currently, the buffer-completion code makes 2 attempts to match a pattern against the list of available patterns. First try is to match the pattern and anchor it to either the beginning of the file name or at a directory-separator (// or \\). When a match is found, Vim returns the matching buffers and does not try to find a match anywhere within a buffer name. So if you have opened two buffers like /tmp/Foobar.c and /tmp/MyFoobar.c using `:b Foo` will only complete to the first filename, but not the second (the same happens with `getcompletion('Foo', 'buffer')`). It may make sense, that completion priorities buffer names at directory boundaries, but it inconsistent, may cause confusion why a certain buffer name is not completed when typing `:b Foo<C-D>` which returns only a single file name and then pressing Enter (to switch to that buffer), Vim will error with 'E93: More than one match for Foo'). Similar things may happen when wiping the /tmp/Foobar.c pattern and afterwards the completion starts completing other buffers. So let's simplify the code and always match the pattern anywhere in the buffer name, do not try to favor matches at directory boundaries. This is also simplifies the code a bit, we do not need to run over the list of buffers several times, but only twice. fixes vim/vim#13894 closes: vim/vim#14082 https://github.com/vim/vim/commit/0dc0bff000fd804c6b0778ccc4554a4e4c82c8c9 Cherry-pick test_cmdline.vim from patch 9.1.0019 as it already passes. Co-authored-by: Christian Brabandt <cb@256bit.org>
* vim-patch:9.1.0132: "C" doesn't include composing chars with 'virtualedit' ↵zeertzjq2024-02-24
| | | | | | | | | | | | | (#27605) Problem: using "C" and 've=all' set, doesn't include composing chars when changing a line, keeps the composing chars for whatever is typed afterwards. Solution: Use mb_head_off() and mb_ptr2len() instead of mb_tail_off(). (zeertzjq) closes: vim/vim#14083 https://github.com/vim/vim/commit/048761bcd40ec630fd3e039f0066cf4e484ceabd
* vim-patch:9.1.0129: Fix truncation of text_wrap 'wrap' virt text after EOL ↵zeertzjq2024-02-24
| | | | | | | | | | | | | | | | | | | | | | list char (#27600) Problem: Virtual text with text_wrap 'wrap' was effectively being truncated by a break conditional on the EOL list character being added to the screen line. (BigPeet) Solution: Remove the condition that was leading to the early break and instead fix a similar but incorrectly written outer condition that checks if there is more to add at the end of the screen line. (Dylan Thacker-Smith) Also, related: - update comment in win_line() - remove no longer necessary at_end_str variable in win_line() fixes: vim/vim#12725 closes: vim/vim#14079 https://github.com/vim/vim/commit/f548ae7b6357c7934411df243bc987800c9b76d1 Co-authored-by: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
* vim-patch:a35235e824bb (#27598)zeertzjq2024-02-24
| | | | | | | | | runtime(doc) Update help text for matchbufline() and matchstrlist() closes: vim/vim#14080 https://github.com/vim/vim/commit/a35235e824bb77df0cebdb2bd290e13f1201b292 Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
* perf(os/env): os_getenv() allocation when there is no env var setbfredl2024-02-24
| | | | | | | | | | os_getenv("FOO") caches the result when $FOO is set to something non-empty. However, when $FOO was not set, every new call to os_getenv("FOO") would allocate a temporary scratch buffer to immediately throw away. This has an huge impact e.g. on logging which depends on potentially non-set env vars.
* fix(terminal): block input when there is pending TermRequest (#27589)zeertzjq2024-02-24
|
* Merge pull request #27590 from bfredl/signcolfixbfredl2024-02-23
|\ | | | | fix(marktree): do not count certain marks twice when checking for overlap
| * fix(marktree): some marks counted twice when checking for overlapbfredl2024-02-23
| | | | | | | | fixes #27046
* | vim-patch:9.1.0127: Naming a non-pointer variable "oap" is strangezeertzjq2024-02-23
| | | | | | | | | | | | | | | | | | | | Problem: Naming a non-pointer variable "oap" is strange. Solution: Rename it to "oa". Also prevent using freed memory in case of memory allocation failure. (zeertzjq) closes: vim/vim#14075 https://github.com/vim/vim/commit/5e3674b42da10b7e7c72d1f20f9a15379af1b60a
* | vim-patch:9.1.0126: Internal error when using upper-case mark in getregion()zeertzjq2024-02-23
| | | | | | | | | | | | | | | | | | | | | | | | Problem: Internal error when passing mark in another buffer to getregion(). Solution: Don't allow marks in another buffer (zeertzjq) closes: vim/vim#14076 Internal error when passing mark in another buffer to getregion() https://github.com/vim/vim/commit/421b597470c118871c7081de00dd065e0e000b7e
* | vim-patch:9.1.0120: hard to get visual region using Vim scriptzeertzjq2024-02-23
|/ | | | | | | | | | | | | | | | Problem: hard to get visual region using Vim script Solution: Add getregion() Vim script function (Shougo Matsushita, Jakub Łuczyński) closes: vim/vim#13998 closes: vim/vim#11579 https://github.com/vim/vim/commit/3f905ab3c4f66562f4a224bf00f49d98a0b0da91 Cherry-pick changes from patch 9.1.0122, with :echom instead of :echow. Co-authored-by: Shougo Matsushita <Shougo.Matsu@gmail.com> Co-authored-by: Jakub Łuczyński <doubleloop@o2.pl>
* refactor(terminal): rename confusing variable name "rv" (#27573)zeertzjq2024-02-22
| | | | Now that terminal_open() no longer returns a value, the variable name "rv" is confusing, and "term" makes more sense anyway.
* fix(api): don't leak memory with nvim_win_get_ns (#27570)zeertzjq2024-02-22
|
* fix(extmarks): redraw properly with scoped inline virt_text (#27569)zeertzjq2024-02-22
|
* feat(extmark): window scoped extmarkaltermo2024-02-21
| | | | Co-authored-by: zeertzjq <zeertzjq@outlook.com>
* docs: remove mention of foreground/background/special keys in nvim_set_hl ↵rktjmp2024-02-21
| | | | | | | | | | (#27558) To align the output of `nvim_get_hl` with its documentation -- which points to `nvim_set_hl`, remove mentions of the keys `foreground`, `background` and `special`. The long keys are are still supported (via fallback checks inside `dict2hlattrs`), but the `fg`, `bg` and `sp` keys are preferenced.
* build: fix uncrustifydundargoc2024-02-21
|
* refactor(api): make freeing of return-value opt-in instead of opt outbfredl2024-02-21
| | | | | | | | | As only a few API functions make use of explicit freeing of the return value, make it opt-in instead. The arena is always present under the hood, so `Arena *arena` arg now doesn't mean anything other than getting access to this arena. Also it is in principle possible to return an allocated value while still using the arena as scratch space for other stuff (unlikely, but there no reason to not allow it).
* Merge pull request #27541 from bfredl/exprarenabfredl2024-02-20
|\ | | | | refactor(api): use an arena for nvim_parse_expression
| * refactor(api): use an arena for nvim_parse_expressionbfredl2024-02-20
| |
* | fix(extmarks): priority order of inline and non-inline virt_text (#27532)zeertzjq2024-02-20
|/
* refactor(api): reduce temporary allocations when replacing linesbfredl2024-02-20
| | | | | | | | | | | | | | | The way ml_replace_buf is implemented makes it unfriendly for being used in a loop: every call allocates a scratch buffer for putting the line into the "dirty" state. This then immediately needs to be freed as the next ml_replace_buf and/or ml_append_buf call will flush that buffer. It's better to later pay the price of allocating the scratch buffer only if the line is being immediately edited (likely when using the API to only change one line) with an extra memcpy, than allocating that buffer multiple times every time the API is called. Of course, a separate xmalloc/xfree cycle for each time the dirty line changes is unwanted to begin with. But fixing that is a later refactor.
* Merge pull request #27534 from bfredl/userarenabfredl2024-02-19
|\ | | | | refactor(api): next PR to make use of the arena
| * refactor(api): use arena for nvim_put and nvim_pastebfredl2024-02-19
| |
| * refactor(api): use arena when listing objectsbfredl2024-02-19
| |
| * refactor(api): use arena for runtime and client infobfredl2024-02-19
| |
| * refactor(api): use an arena for user commandsbfredl2024-02-19
| |
* | build: disable conversion warnings for GCCdundargoc2024-02-19
|/ | | | | GCC seems chronically incapable of producing correct and relevant conversion warnings, and will therefore need to be silenced.
* docs: improve 'tabline' click label docs (#27529)zeertzjq2024-02-19
|
* feat(tabline): middle mouse button now closes tab (#27522)Nacho Nieva2024-02-19
|
* vim-patch:9.1.0115: Using freed memory with full tag stack and user data ↵zeertzjq2024-02-19
| | | | | | | | | | | | | | | | | (#27525) Problem: Using freed memory with full tag stack and user data (Konstantin Khlebnikov) Solution: Clear the user data pointer of the newest entry. (zeertzjq, Konstantin Khlebnikov) fixes: neovim/neovim#27498 closes: vim/vim#14053 https://github.com/vim/vim/commit/c86bff1771ed9c340f8f4433ae5530fd6de97980 Cherry-pick Test_tag_stack() changes from patch 9.0.0767. Co-authored-by: Konstantin Khlebnikov <koct9i@gmail.com>
* refactor(api): use arena for metadata; msgpack_rpc_to_object delenda estbfredl2024-02-18
| | | | | | Note: kSDItemHeader is something is _written_ by nvim in the shada file to identify it for debugging purposes outside of nvim. But this data wasn't ever used by neovim after reading the file back, So I removed the parsing of it for now.
* Merge pull request #27511 from bfredl/maparenabfredl2024-02-18
|\ | | | | refactor(api): use arena for mappings, autocmd, channel info
| * refactor(api): use arena for autocmdsbfredl2024-02-18
| |