Dev_vimpatch

Nvim :help 页面,生成源代码 使用 tree-sitter-vimdoc 解析器。


合并来自 Vim 的补丁
Nvim 是从 Vim 7.4.160 分支出来的;它会持续更新相关的 Vim 补丁,以避免重复工作。运行 vim-patch.sh https://github.com/neovim/neovim/blob/master/scripts/vim-patch.sh 查看 Vim 补丁的状态。
./scripts/vim-patch.sh -l
欢迎大家对相关的 Vim 补丁提出 dev-vimpatch-pull-requests,但某些类型的补丁是 dev-vimpatch-not-applicable。请查看 dev-vimpatch-quickstart 立即开始。
1. 拉取 Nvim 源码
git clone https://github.com/neovim/neovim.git
2. 运行 ./scripts/vim-patch.sh -l 查看缺少的 Vim 补丁列表。
3. 从列表中选择一个补丁(通常是最旧的),例如 8.0.0123
4. 运行 ./scripts/vim-patch.sh -p 8.0.0123
5. 按照脚本给出的说明操作。
注意
强烈建议先处理最旧的缺失补丁,因为后面的补丁可能依赖于这些更改。
使用 git log --grepgit log -G 搜索 Nvim/Vim 源代码历史(即使是已删除的代码)。例如,要查找 reset_option_was_set
git log -p -G reset_option_was_set
git log 选项(如 --grep-G)传递给 ./scripts/vim-patch.sh -L 以筛选未合并的 Vim 补丁。例如,要查找 +quickfix 补丁
./scripts/vim-patch.sh -L --grep quickfix -- src
注意:vim-patch.sh 会自动执行这些步骤。请使用它!
如果您想使用 vim-patch.sh 自动创建 PR,请安装 gh (https://cli.githubdocs.cn/)
拉取请求标题应包含 vim-patch:8.x.xxxx(无空格)
指示 Vim 补丁号的标记,格式如下:vim-patch:8.0.0123(无空格)
原始的 Vim 提交消息,包括作者
审阅者:审查 runtime/ 补丁的提示 https://github.com/neovim/neovim/pull/1744#issuecomment-68202876

不适用(不适用)补丁 dev-vimpatch-not-applicable

许多 Vim 补丁不适用于 Nvim。如果您发现不适用的补丁,请访问一个开放的“version.c: update”拉取请求 https://github.com/neovim/neovim/pulls?q=is%3Apr+author%3Aapp%2Fgithub-actions+version.c+is%3Aopen,并在评论中提及不适用的补丁(请编辑/更新一个评论,而不是为每个补丁添加新的评论)。
如果没有开放的 version.c: update 拉取请求,请在提交消息中以以下格式包含不适用的补丁
vim-patch:<version-or-commit>
vim-patch:<version-or-commit>
...
其中 <version-or-commit> 是有效的 Vim 版本(如 8.0.0123)或提交 ID(SHA)。每个补丁都占一行。
最好通过将不适用的补丁压缩到适用的 Vim 补丁中来包含它们,特别是如果 Vim 补丁相关。提交消息的第一行应来自适用的 Vim 补丁。
./scripts/vim-patch -p <na-patch>
./scripts/vim-patch -p <na-patch>
...
./scripts/vim-patch -P <patch>
git rebase -i master
"不适用" VIM 补丁的类型
Vim9script 功能,以及与 :scriptversion 相关的任何内容。(Nvim 仅支持 Vimscript 版本 1。)请注意,标记为 Vim9: 的补丁可能仍然包含对代码库其他部分的适用修复,因此需要单独检查这些补丁。
testdir/Makefile 的更新通常不适用,因为 Makefile 会隐式地查找 https://github.com/neovim/neovim/commit/8a677f8a4bff6005fa39f090c14e970c3dfdbe6e#diff-b3c6ad6680a25a1b42095879e3a87104R52 所有 test_*.vim 文件。
编译器警告修复:Nvim 努力做到完全没有警告,并且拥有与 Vim 不同的构建系统。
注意:Vim 中的 Coverity 修复与 Nvim 相关。
*.proto 更改:Nvim 会自动生成函数原型
#ifdef 调整:例如,Vim 决定为所有平台启用 FEAT_VISUAL - 但 Nvim 已经这样做了。添加新的 FEAT_ 保护也不适用于 Nvim。
旧系统支持:修复 Amiga、OS/2 Xenix、Mac OS 9、Windows XP SP2 之前的 Windows 等旧系统不需要,因为 Nvim 不支持它们。
不适用文件:src/Make_*src/testdir/Make__*
if_*.c 更改:if_python.c 等已被删除。
term.c 更改:Nvim TUI 使用 libtermkey 读取终端序列;Vim 的 term.c 已被删除。
job 补丁:不兼容的 API 和实现
不适用文件:src/channel_*src/job_*src/testdir/test_channel_*src/testdir/test_job_*
修改不适用文件的 :terminal 补丁:不兼容的 API 和实现
不适用文件:src/terminal_*src/testdir/test_terminal_*
defaults.vim 补丁
大多数与 GUI 相关的更改:Nvim GUI 在核心 C 代码库之外实现。
不适用文件:src/gui_*src/gvim_*src/GvimExt/*src/testdir/test_gui*
balloon 更改:Nvim 不支持气球功能
不适用文件:src/beval_*src/testdir/test_balloon_*
来自 test_popupwin.vimtest_popupwin_textprop.vim 的屏幕截图测试:https://github.com/neovim/neovim/pull/12741#issuecomment-704677141
json 更改:不兼容的 API https://github.com/neovim/neovim/pull/4131
不适用文件:src/json*src/testdir/test_json.vim
test_restricted.vim 中的受限模式已在 https://github.com/neovim/neovim/pull/11996 中删除
test_prompt_buffer.vim 中的许多测试都需要不兼容的 Vim 功能,例如 channel;它们应该仍然被包含,但应该被跳过
非运行时文档:已移至 https://neovim.fullstack.org.cn/doc/,
不适用文件:FilelistREADMEINSTALL
其他任何内容都可能相关;谨慎行事,如果您不确定,请发布一个问题。
src/nvim/version.c 中的 Vim 补丁列表会自动更新 https://github.com/neovim/neovim/pull/7780,基于 Nvim git 日志中 vim-patch:xxx 标记的存在。
不要自己更新 src/nvim/version.c
scripts/vim-patch.sh -p 故意省略 version.c,以避免合并冲突并节省移植补丁的时间。
自动化脚本(scripts/vimpatch.lua)仅识别 vim-patch:8.0.1206 这样的标记,而不是 vim-patch:<hash>
以下函数已删除或弃用,以支持更新的替代方法。有关更多信息,请参阅 memory.c https://github.com/neovim/neovim/blob/master/src/nvim/memory.c
-----------------------------------------------------------------------
Deprecated or removed                                 Replacement
-----------------------------------------------------------------------
vim_free                                                 xfree
VIM_CLEAR(&foo)                                    XFREE_CLEAR(foo)
malloc alloc lalloc lalloc_id ALLOC_ONE                 xmalloc
calloc lalloc_clear                                     xcalloc
realloc vim_realloc                                    xrealloc
mch_memmove                                             memmove
vim_memset copy_chars copy_spaces                       memset
vim_strbyte                                             strchr
vim_strncpy strncpy                               xstrlcpy/xmemcpyz
vim_strcat strncat                                     xstrlcat
VIM_ISWHITE                                          ascii_iswhite
IS_WHITE_OR_NUL                                  ascii_iswhite_or_nul
vim_isalpha                                           mb_isalpha
vim_isNormalIDc                                      ascii_isident
vim_islower vim_isupper                          mb_islower mb_isupper
vim_tolower vim_toupper                          mb_tolower mb_toupper
mb_ptr2len                                           utfc_ptr2len
mb_ptr2len_len                                     utfc_ptr2len_len
mb_char2len                                          utf_char2len
mb_char2bytes                                       utf_char2bytes
mb_ptr2cells                                         utf_ptr2cells
mb_ptr2cells_len                                   utf_ptr2cells_len
mb_char2cells                                       utf_char2cells
mb_off2cells                                         utf_off2cells
mb_ptr2char                                          utf_ptr2char
mb_head_off                                          utf_head_off
mb_tail_off                                          utf_cp_bounds
mb_strnicmp2                                         utf_strnicmp
MB_STRNICMP2                                         utf_strnicmp
mb_lefthalve                                        grid_lefthalve
mb_fix_col                                           grid_fix_col
utf_off2cells                                       grid_off2cells
ml_get_curline                                    get_cursor_line_ptr
ml_get_cursor                                     get_cursor_pos_ptr
ml_get_curline_len                                get_cursor_line_len
ml_get_cursor_len                                 get_cursor_pos_len
screen_char                                             ui_line
screen_line                                        grid_put_linebuf
screen_* (most functions)                               grid_*
update_prepare, update_finish #9484                  removed; use update_screen only
ARRAY_LENGTH                                          ARRAY_SIZE
vim_strsave_escape_csi                           vim_strsave_escape_ks
vim_unescape_csi                                    vim_unescape_ks
gettail                                                path_tail
mch_isFullName                                     path_is_absolute
script_do_profile                                    profile_init
-----------------------------------------------------------------------
在替换 mb_ 函数时,请务必注意 utf_utfc_ 之间的区别。此外,间接调用语法 (*mb_ptr2len)(...) 应替换为普通的函数调用 utfc_ptr2len(...)
-----------------------------------------------------------------------
Data type    Format (Vim source)     Portable format (Nvim source)
------------ ----------------------- ----------------------------------
long long    "%lld"                  "%" PRId64
size_t       "%ld"                   "%zu"
linenr_T     "%ld"                   "%" PRIdLINENR
-----------------------------------------------------------------------
Vim 的 ga_init2 已重命名为 ga_init,而原始的 ga_init 已经消失了。
"旧式" Vim 测试(src/testdir/*.in)应该转换为 Lua 测试(请参阅 #1286 https://github.com/neovim/neovim/issues/1286 和 #1328 https://github.com/neovim/neovim/pull/1328)。请参阅迁移遗留测试的清单 https://github.com/neovim/neovim/blob/master/test/README.md#checklist-for-migrating-legacy-tests
但是,请不要将 "新式" Vim 测试(src/testdir/*.vim)转换为 Lua。"新式" Vim 测试比旧测试速度更快,将它们转换为 Lua 需要花费时间和精力,这些时间和精力最好花在其他地方。只需将它们复制到 test/old/testdir/*.vim 即可。
检查 enc_utf8has_mbyte 的条件已经过时(只有 "true" 案例适用)。
enc_utf8has_mbyte 宏已在 https://github.com/neovim/neovim/pull/13293 中删除
在 Vim 中,只有在 FEAT_GUI 启用时,才需要检查预读缓冲区中的 CSI。在 Nvim 中,预读缓冲区中的 CSI 没有特殊含义。(另请参阅 https://github.com/neovim/neovim/pull/16936
列表(来自 vim 的 list_Tlistitem_T 类型)的管理已在 https://github.com/neovim/neovim/pull/7708/ 中更改。有一个针对 "旧" 用法的 lint,但以下是最重要的更改。
表的声明
list_T list:一个列表
listitem_T lilist 中的一个项
int vallv_copyID 的值
--------------------------------------------------------------------------------------
Old                             New                                  Comment
------------------------------- ------------------------------------------------------
list->lv_first                  tv_list_first(list)
list->lv_last                   tv_list_last(list)
li->li_next                     TV_LIST_ITEM_NEXT(list, li)          To be avoided if possible, must use list which li belongs to.
li->li_prev                     TV_LIST_ITEM_PREV(list, li)          To be avoided if possible, must use list which li belongs to.
                                Suggestion by @ZyX-l:                Use TV_LIST_ITER or indexing instead of the previous two calls.
list->lv_len                    tv_list_len(list)
list->lv_lock                   tv_list_locked(list)
&li->li_tv                      TV_LIST_ITEM_TV(li)
list->lv_refcount++             tv_list_ref(list)
val = list->lv_copyID           val = tv_list_copyid(list)
list->lv_copyID = val           tv_list_set_copyid(list, val)
for (li = list->lv_first;       TV_LIST_ITER_CONST(list, li,         Use TV_LIST_ITER(...) if you need to
li != NULL && another_cond;     { if (another_cond) {break;} code})  modify list items (note: assigning copyID is also modification and this happens
li = li->li_next) code                                               always when recursively traversing a list).
--------------------------------------------------------------------------------------
有关更多详细信息以及一些更高级的用法,请参阅 typval.htypval.c
以下内容应该从所有导入的文档中删除,并且不应该在新的文档中使用
{Only when compiled with ...}:绝大多数功能已成为非可选的(请参阅 https://github.com/neovim/neovim/wiki/Introduction

文件类型检测 dev-vimpatch-filetype

Nvim 的文件类型检测行为与 Vim 相匹配,但作为 vim.filetype 的一部分实现(请参阅 $VIMRUNTIME/lua/vim/filetype.lua)。逻辑编码在三个表中,按优先级顺序排列(返回第一个匹配项):1. filename 用于字面完整路径或基本名称查找;2. pattern 用于将文件名或路径与 lua-patterns 匹配,经过优化以实现快速查找;3. extension 用于字面扩展名查找。
需要检查文件内容或缓冲区变量的逻辑在 $VIMRUNTIME/lua/vim/filetype/detect.lua 中实现。
从 Vim 移植文件类型补丁时,请记住以下几点
优先使用显式文件名或扩展名,而不是模式,尤其是在不区分大小写的匹配情况下(请参阅 https://github.com/neovim/neovim/pull/29800
"*[mM]akefile" regex -> "makefile", "Makefile" filenames
"*.js\c"       regex -> "js", "jS", "Js", "jS" extensions
模式匹配有一些区别
它使用明确的 Lua 模式进行,没有隐式锚定,而不是 Vim 正则表达式
"*/debian/changelog" -> "/debian/changelog$"
"*/bind/db.*"        -> "/bind/db%."
为了提高匹配性能,文件类型模式根据其父模式进行分组:如果父模式不匹配,则跳过测试所有子模式。请注意,与叶模式不同,父模式在包含 / 时没有特殊的匹配行为。
在添加具有模式匹配的新文件类型时,请考虑以下几点
如果已经存在具有适当父模式的组,请使用它。
如果可以有一个快速且足够具体的模式来对至少 3 个文件类型模式进行分组,请将其添加为一个单独的分组条目。
新的父模式应该
快速:经验法则是它应该是一个简短的显式字符串(即没有量词或字符集);
具体:经验法则是,按顺序
完整目录名(例如,"/etc/""/log/");
足够罕见的目录名的部分(例如,"/conf""git/");
在实际完整路径中很少使用的字符串(例如,"nginx")。
示例
文件类型模式:".*/etc/a2ps/.*%.cfg"
合适的父模式:"/etc/""%.cfg$"
不合适的父模式:"%."(快速但不具体)或 "/a2ps/.*%."(具体但缓慢)
修改现有正则表达式模式时,请确保它仍然适合其组。
主要
命令索引
快速参考