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-quickstart

1. Nvimのソースコードをプルします。
git clone https://github.com/neovim/neovim.git
2. ./scripts/vim-patch.sh -l を実行して、不足しているVimパッチのリストを表示します。
3. リストからパッチを選択します(通常は最も古いもの)、例: 8.0.0123
オープンされているvim-patchのPRを確認してください https://github.com/neovim/neovim/pulls?q=is%3Apr+is%3Aopen+label%3Avim-patch
4. ./scripts/vim-patch.sh -p 8.0.0123 を実行します。
5. スクリプトの指示に従います。
注意事項
後続のパッチが変更に依存する可能性があるため、最も古い不足しているパッチから作業することを強くお勧めします。
git log --grep または git log -G を使用して、Nvim/Vimのソース履歴(削除されたコードも含む)を検索します。例: reset_option_was_set を検索するには
git log -p -G reset_option_was_set
マージされていないVimパッチをフィルタリングするために、--grep-G のような git log オプションを ./scripts/vim-patch.sh -L に渡します。例: +quickfix パッチを見つけるには
./scripts/vim-patch.sh -L --grep quickfix -- src

プルリクエスト dev-vimpatch-pull-requests

注意: vim-patch.shはこれらの手順を自動化します。 ぜひご利用ください!
vim-patch.sh を使用してPRを自動的に作成する場合は、gh (https://cli.github.com/) をインストールしてください。
プルリクエストのタイトルには vim-patch:8.x.xxxx を含める必要があります(空白なし)。
コミットメッセージ https://github.com/neovim/neovim/commit/4ccf1125ff569eccfc34abc4ad794044c5ab7455 には以下を含める必要があります。
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 にアクセスし、コメントに適用不可のパッチを記載してください(パッチごとに新しいコメントを追加するのではなく、1つのコメントを編集/更新してください)。
オープンされている 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、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 からの screendump テスト: 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 の多くのテストでは、channel などの互換性のないVim機能が必要です。これらは引き続き含める必要がありますが、スキップする必要があります。
非ランタイムドキュメント: https://neovim.dokyumento.jp/doc/, に移動しました。
適用不可のファイル: FilelistREADMEINSTALL
その他は関連している可能性があります。 慎重を期して、不明な場合は issue を投稿してください。
src/nvim/version.c のVimパッチのリストは、Nvim gitログに vim-patch:xxx トークンが存在するに基づいて自動的に更新されます https://github.com/neovim/neovim/pull/7780
src/nvim/version.c を自分で更新しないでください。
scripts/vim-patch.sh -p は、マージの競合を回避し、パッチの移植時に時間を節約するために、意図的に version.c を省略します。
自動化スクリプト (scripts/vimpatch.lua) は、vim-patch:<hash> ではなく、vim-patch:8.0.1206 のようなトークンのみを認識します。

コードの差異 dev-vimpatch-code-differences

以下の関数は、新しい代替手段のために削除または非推奨になりました。 詳細については、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_init2ga_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_utf8 または has_mbyte をチェックする条件は廃止されました(「true」の場合のみ適用されます)。
enc_utf8 および has_mbyte マクロは https://github.com/neovim/neovim/pull/13293 で削除されました。
先行入力バッファで CSI をチェックする必要があるのは、FEAT_GUI を使用したVimのみです。 CSI はNvimの先行入力バッファでは特別な意味を持ちません。( https://github.com/neovim/neovim/pull/16936 も参照)
リスト(vimの型 list_T および listitem_T)の管理は https://github.com/neovim/neovim/pull/7708/ で変更されました。 「古い」使用方法に対する lint がありますが、ここに最も重要な変更点を示します。
テーブルの宣言
list_T list:リスト
listitem_T lilist のアイテム
int val lv_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.h および typval.c を参照してください。

ドキュメントの差異 dev-vimpatch-documentation

以下は、インポートされたすべてのドキュメントから削除する必要があり、新しいドキュメントでは使用しないでください。
{Only when compiled with ...}: ほとんどの機能はオプションではなくなりました(https://github.com/neovim/neovim/wiki/Introduction を参照)。

ファイルタイプ検出 dev-vimpatch-filetype

Nvimのファイルタイプ検出動作はVimと一致しますが、vim.filetype の一部として実装されています($VIMRUNTIME/lua/vim/filetype.lua を参照)。 ロジックは3つのテーブルにエンコードされており、優先順位の高い順にリストされています(最初に一致したものが返されます)。 1. リテラルのフルパスまたはベース名ルックアップ用の filename。 2. 高速ルックアップ用に最適化された lua-patterns に対するファイル名またはパスのマッチング用の pattern。 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
パターンマッチングにはいくつかの違いがあります。
Vimの正規表現ではなく、暗黙的なアンカーのない明示的なLuaパターンを使用して実行されます。
"*/debian/changelog" -> "/debian/changelog$"
"*/bind/db.*"        -> "/bind/db%."
ファイルタイプのパターンは、親パターンによってグループ化され、マッチングのパフォーマンスを向上させます。親パターンが一致しない場合、すべての子パターンのテストはスキップされます。リーフパターンとは異なり、親パターンには` / `が含まれていても特別なマッチング動作はありません。
パターンマッチングを使用して新しいファイルタイプを追加する場合は、次の点を考慮してください。
適切な親パターンを持つグループが既に存在する場合は、それを使用してください。
少なくとも3つのファイルタイプパターンをグループ化するための、高速で十分に具体的なパターンを作成できる場合は、それを別のグループ化されたエントリとして追加してください。
新しい親パターンは、次の条件を満たす必要があります。
高速であること:経験則として、短い明示的な文字列(つまり、量指定子や文字セットを含まない)である必要があります。
具体的であること:経験則として、以下の順に優先順位付けされます。
完全なディレクトリ名(例:`"/etc/"`、`"/log/"`);
まれなディレクトリ名の一部(例:`"/conf"`、`"git/"`);
実際のフルパスではめったに使用されない文字列(例:`"nginx"`)。
ファイルタイプパターン:`".*/etc/a2ps/.*%.cfg"`
適切な親:`"/etc/"` または ` "%.cfg$"`
不適切な親:`"%."` (高速だが具体的ではない)または `"/a2ps/.*%."` (具体的だが低速)
既存の正規表現パターンを変更する場合は、それが依然としてグループに適合することを確認してください。
メイン
コマンドインデックス
クイックリファレンス