Mercurial > vim
view src/create_nvcmdidxs.vim @ 34094:0b25a862bf0c v9.1.0014
patch 9.1.0014: incorrect use of W_WINROW in edit.c
Commit: https://github.com/vim/vim/commit/b1ed7ec9f7d1a0142d4f1c8c83bab9172bc92c7c
Author: zeertzjq <zeertzjq@outlook.com>
Date: Fri Jan 5 18:11:43 2024 +0100
patch 9.1.0014: incorrect use of W_WINROW in edit.c
Problem: incorrect use of W_WINROW in edit.c
Solution: compare against curwin->w_height instead
Remove incorrect use of W_WINROW
In structs.h it is mentioned that w_wrow is relative to w_winrow, so
using W_WINROW doesn't make sense when comparing with window height.
This change won't lead to any observable behavior change:
The condition intends to check if there are 'scrolloff' lines between
the current cursor when the bottom of the window. When W_WINROW(curwin)
is added to curwin->w_height - 1 - get_scrolloff_value(), the condition
is instead satisfied when the cursor is on some screen line below that
position. However,
- If 'scrolloff' is smaller than half the window height, this condition
can only be satisfied when W_WINROW(curwin) == 0. And if it is not
satisfied, update_topline() does the actual scrolling.
- If 'scrolloff' is larger than half the window height, update_topline()
will put the cursor at the center of the window soon afterwards
anyway, because set_topline() now unsets VALID_TOPLINE flag starting
from https://github.com/vim/vim-history/commit/7db7bb45b0f919ff0615d463ebd4fde881c69d1f.
To put it in another way, https://github.com/vim/vim-history/commit/7db7bb45b0f919ff0615d463ebd4fde881c69d1f
makes the update_topline() just below correct the mistakes made in this
block, so this incorrect use of W_WINROW() no longer affects observable
behavior.
closes: #12331
Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Fri, 05 Jan 2024 18:30:03 +0100 |
parents | ee1019e59bef |
children |
line wrap: on
line source
" This script generates the table nv_cmd_idx[] which contains the index in " nv_cmds[] table (normal.c) for each of the command character supported in " normal/visual mode. " This is used to speed up the command lookup in nv_cmds[]. " " Script should be run using "make nvcmdidxs", every time the nv_cmds[] table " in src/nv_cmds.h changes. " " This is written in legacy Vim script so that it can be run by a slightly " older Vim version. " Generate the table of normal/visual mode command characters and their " corresponding index. let cmd = 'create_nvcmdidxs' if has('unix') let cmd = './' .. cmd endif let nv_cmdtbl = systemlist(cmd)->map({i, ch -> {'idx': i, 'cmdchar': ch}}) " sort the table by the command character call sort(nv_cmdtbl, {a, b -> a.cmdchar - b.cmdchar}) " Compute the highest index upto which the command character can be directly " used as an index. let nv_max_linear = 0 for i in range(nv_cmdtbl->len()) if i != nv_cmdtbl[i].cmdchar let nv_max_linear = i - 1 break endif endfor " Generate a header file with the table let output =<< trim END /* * Automatically generated code by the create_nvcmdidxs.vim script. * * Table giving the index in nv_cmds[] to lookup based on * the command character. */ // nv_cmd_idx[<normal mode command character>] => nv_cmds[] index static const unsigned short nv_cmd_idx[] = { END " Add each command character in comment and the corresponding index let output += nv_cmdtbl->map({_, v -> \ printf(' /* %5d */ %3d,', v.cmdchar, v.idx)}) let output += ['};', '', \ '// The highest index for which', \ '// nv_cmds[idx].cmd_char == nv_cmd_idx[nv_cmds[idx].cmd_char]'] let output += ['static const int nv_max_linear = ' .. nv_max_linear .. ';'] call writefile(output, "nv_cmdidxs.h") quit " vim: shiftwidth=2 sts=2 expandtab