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

PR (PULL REQUEST) dev-vimpatch-pull-requests

注意: vim-patch.sh 會自動為您執行這些步驟。請使用它!
如果您想使用 vim-patch.sh 自動建立 PR,請安裝 gh (https://cli.github.com/)
PR 標題應包含 vim-patch:8.x.xxxx(無空格)
一個表示 Vim 修補程式編號的 token,格式如下:vim-patch:8.0.0123(無空格)
原始的 Vim 提交訊息,包括作者
審閱者:有關審閱 runtime/ 修補程式的提示 https://github.com/neovim/neovim/pull/1744#issuecomment-68202876

NA(不適用)的修補程式 dev-vimpatch-not-applicable

許多 Vim 修補程式不適用於 Nvim。如果您發現 NA 修補程式,請訪問一個開啟的「version.c: update」PR https://github.com/neovim/neovim/pulls?q=is%3Apr+author%3Aapp%2Fgithub-actions+version.c+is%3Aopen,並在註解中提及 NA 修補程式(請編輯/更新一個註解,而不是為每個修補程式新增一個新的註解)。
如果沒有開啟的 version.c: update PR,請以以下格式在提交訊息中包含 NA 修補程式
vim-patch:<version-or-commit>
vim-patch:<version-or-commit>
...
其中 <version-or-commit> 是一個有效的 Vim 版本(如 8.0.0123)或提交 ID(SHA)。每個修補程式都應位於單獨的行中。
最好將 NA 修補程式壓縮到適用的 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 的更新通常為 NA,因為 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、XP SP2 之前的 Windows 等舊版系統的修復不是必需的,因為 Nvim 不支援它們。
NA 檔案:src/Make_*src/testdir/Make__*
if_*.c 變更:if_python.c 等已移除。
term.c 變更:Nvim TUI 使用 libtermkey 來讀取終端序列;Vim 的 term.c 已被移除。
job 修補程式:API 和實作不相容
NA 檔案:src/channel_*src/job_*src/testdir/test_channel_*src/testdir/test_job_*
修改 NA 檔案的 :terminal 修補程式:API 和實作不相容
NA 檔案:src/terminal_*src/testdir/test_terminal_*
defaults.vim 修補程式
大多數與 GUI 相關的變更:Nvim GUI 在核心 C 程式碼庫外部實作。
NA 檔案:src/gui_*src/gvim_*src/GvimExt/*src/testdir/test_gui*
balloon 變更:Nvim 不支援 balloon 功能
NA 檔案: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
NA 檔案:src/json*src/testdir/test_json.vim
test_restricted.vim 受限模式在 https://github.com/neovim/neovim/pull/11996 中被移除
test_prompt_buffer.vim 中的許多測試需要不相容的 Vim 功能,例如 channel;它們仍應包含,但應跳過
非 runtime 文件:已移動到 https://neovim.dev.org.tw/doc/,
NA 檔案:FilelistREADMEINSTALL
任何其他內容都可能相關;請謹慎行事,如果您不確定,請張貼一個 issue。
src/nvim/version.c 中的 Vim 修補程式列表會根據 Nvim git 記錄中是否存在 vim-patch:xxx token 自動更新 https://github.com/neovim/neovim/pull/7780
請不要自行更新 src/nvim/version.c
scripts/vim-patch.sh -p 會故意省略 version.c,以避免合併衝突並在移植修補程式時節省時間。
自動化腳本 (scripts/vimpatch.lua) 僅能識別 vim-patch:8.0.1206 等 token,而無法識別 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 測試比舊式測試快,而且轉換它們會花費時間和精力,不如將這些時間花在其他地方。只需將它們複製到 test/old/testdir/*.vim
檢查 enc_utf8has_mbyte 的條件已過時(僅適用「true」的情況)。
enc_utf8has_mbyte 巨集已在 https://github.com/neovim/neovim/pull/13293 中移除
在類型超前緩衝區中檢查 CSI 僅在具有 FEAT_GUI 的 Vim 中是必要的。CSI 在 Nvim 中的類型超前緩衝區中沒有特殊含義。(另請參閱 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
以下內容應從所有匯入的文件中移除,並且不應在新文件中使用
{僅在編譯時使用...}:絕大多數功能都已設為非可選(請參閱 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/.*%." (精確但速度慢)
當修改現有的正規模式時,請確保它仍然適合其群組。
主要
命令索引
快速參考