新聞-0.10

Nvim :help 頁面,由 產生,來源為 原始碼,使用 tree-sitter-vimdoc 解析器。


自 Nvim 0.9 以來的主要變更
先前版本的變更,請參閱 news-0.9

重大變更

這些變更可能需要調整您的配置或外掛程式。
API
noautocmd 設定時,nvim_open_win() 現在會阻擋所有自動指令,而不僅僅是設定視窗中要顯示的 buffer 時的自動指令。
預設值
預設配色方案已更新為「Nvim 品牌」且易於存取。使用 :colorscheme vim 可恢復為舊的傳統配色方案。
這些 Nvim 特有的高亮群組現在以有意義的不同方式定義,可能需要更新
hl-NormalFloat 不連結到 hl-Pmenu
hl-WinBar 具有不同的背景。
hl-WinBarNChl-WinBar 相似,但不粗體。
hl-WinSeparator 連結到 hl-Normal 而不是 hl-VertSplit
這也可能導致某些配色方案看起來不同,因為它們依賴於關於預設如何定義高亮群組的隱式假設。為了處理這個問題,請明確定義高亮群組的所有屬性。或者,使用 :colorscheme vim:source $VIMRUNTIME/colors/vim.lua 來恢復先前的定義。
當 Nvim 能夠確定主機終端模擬器支援 24 位元色彩時,預設會啟用 'termguicolors'
編輯器
當切換視窗時,CursorMoved 自動指令會在 Nvim 回到主迴圈時觸發,而不是立即觸發。這與 Vim 更相容。
在映射的左側 (lhs) 開頭,"#" 後面接數字不再代表功能鍵。
shm-q 現在會完全隱藏巨集錄製訊息,而不僅僅是縮短它。
透過舊版 sign-commands 放置的標記現在會以 extmarks 的形式在內部儲存和顯示。連同以下變更
在同一個群組中,使用相同識別符號放置兩次的標記將會被移動。
舊版標記總是會與它所在的行一起被刪除。
舊版標記和 extmark 標記都會出現在 :sign-place-listnvim_buf_get_extmarks() 中。
舊版標記和 extmark 標記會以相同的優先順序顯示和列出:行號 -> 優先順序 -> 標記 ID -> 最近放置的
:behave 已被移除。
如果您使用了 :behave xterm,以下是等效的
set mousemodel=extend
如果您使用了 :behave mswin,以下是等效的
set selection=exclusive
set selectmode=mouse,key
set mousemodel=popup
set keymodel=startsel,stopsel
事件
從傳遞給 nvim_create_autocmd() 的回呼函式傳回任何真值(而不僅僅是 true)將會刪除自動指令。
LSP
LanguageTree:parse() 預設不再解析注入,現在需要傳遞明確的範圍引數。如果需要注入,請透過 parser:parse({ start_row, end_row }) 提供明確的範圍。
vim.lsp.util.parse_snippet() 現在會嚴格遵循 LSP 定義的程式碼片段語法,因此先前解析的程式碼片段現在可能被視為無效的輸入。
vim.lsp.codelens.refresh() 現在需要一個 opts 引數。透過此變更,預設行為(僅重新整理目前的緩衝區)已被重新整理所有緩衝區取代。
vim.lsp.util.extract_completion_items() 將不再傳回可靠的結果,因為當其輸入為 CompletionList 時,它不會應用 itemDefaults。此外,由於新增了對 LSP completionList.itemDefaults 的支援,如果語言伺服器支援該功能但外掛程式不支援,某些第三方外掛程式可能會受到負面影響。如有必要,可以在呼叫 vim.lsp.protocol.make_client_capabilities() 時移除相應的功能。
LspRequest 和 LspProgressUpdate(已重新命名為 LspProgress)自動指令已從 User 自動指令提升為一級公民。
Lua
-l 確保如果指令碼列印訊息且不會導致 Nvim 退出,則輸出會以換行符號結尾。
vim.json 模組中移除的函式
不必要、未記錄且會導致全域副作用的函式。
vim.json.nullvim.NIL 是多餘的。
vim.json.array_mt(以及相關的)與 vim.empty_dict() 是多餘的。
vim.islist() 現在會檢查表格是否實際上類似列表(即,具有從 1 開始且沒有間隙的整數索引鍵)。對於先前的行為(僅檢查整數索引鍵,允許間隙或不從 1 開始),請使用 vim.isarray()
vim.treesitter.playground 重新命名為 vim.treesitter.dev
選項
移除一些 Vim 5.0<= 選項相容性
'backspace' 不再支援數值。取而代之
對於 backspace=0 設定 backspace= (空白)
對於 backspace=1 設定 backspace=indent,eol
對於 backspace=2 設定 backspace=indent,eol,start (Nvim 中的預設行為)
對於 backspace=3 設定 backspace=indent,eol,nostop
'backupdir''directory' 不再移除選項開頭的 >
OptionSet 自動指令引數 v:option_newv:option_oldv:option_oldlocalv:option_oldglobal 現在具有選項的類型,而不是總是字串。v:option_old 現在是所有全域-本地選項的舊全域值,而不僅僅是字串全域-本地選項。
當選項設定(例如,使用 :setnvim_set_option_value())時,沒有範圍的全域-本地數字/布林選項的本地值現在會取消設定,這表示它們現在的行為與字串選項相同。
外掛程式
:TOhtml 已使用 Lua 重寫以支援 Nvim 特有的裝飾,並且已移除許多選項。
Treesitter
Treesitter 高亮群組已重新命名,以便更符合上游 tree-sitter 和 Helix,使查詢更容易共享。完整列表記錄在 treesitter-highlight-groups 中。
TUI
在某些情況下,Nvim TUI 中的游標即使沒有依照 游標閃爍 中所述配置 'guicursor' 也會閃爍。這是一個現已修正的錯誤。如果您的游標已停止閃爍,請將以下內容(或類似內容,根據使用者喜好調整)新增至您的 設定 檔案
set guicursor+=n-v-c:blinkon500-blinkoff500

新功能

新增了以下新功能。
API
將 0 傳遞給 nvim_get_chan_info() 會取得關於目前通道的資訊。
nvim_buf_set_extmark() 支援內嵌虛擬文字。
nvim_win_text_height() 計算指定視窗中一段文字佔用的螢幕行數。
nvim_set_client_info() 新增了 RPC 用戶端類型 msgpack-rpc,以支援完全符合 MessagePack-RPC 的用戶端。
現在可以透過在 nvim_open_win()nvim_win_set_config() 中設定 hide 來隱藏浮動視窗。
nvim_input_mouse() 支援滑鼠按鈕 "x1" 和 "x2"。
nvim_open_term() 中新增了 "force_crlf" 選項欄位。
新增了 nvim_tabpage_set_win() 以設定索引標籤頁的目前視窗。
當模式短名稱具有後綴 "a" 時,映射 API 現在支援縮寫。
浮動視窗現在可以使用新的 footerfooter_pos 配置欄位顯示頁尾。預設使用 hl-FloatFooter
extmarks 可以設定 "url" 高亮屬性,因此文字區域可以變成可點擊的超連結(假設 UI 支援)。TUI 使用 OSC 8 控制序列轉譯 URL,在支援的終端機中啟用可點擊的文字。
nvim_open_win()nvim_win_set_config() 現在支援開啟一般(分割)視窗、將浮動視窗移入分割視窗,以及在非目前的索引標籤頁中開啟視窗。
新增至 nvim_buf_set_extmark() 的旗標
"undo_restore": 選擇退出 extmark 的精確復原追蹤。
"invalidate": 自動隱藏或刪除 extmark。
"virt_text_repeat_linebreak": 在換行的行上重複虛擬文字。
Extmark 現在完全支援多行範圍,並且可以使用單一 extmark 來高亮顯示任意長度的範圍。nvim_buf_set_extmark() API 函式已經允許您定義這類範圍,但是對於涵蓋多個換行的範圍,高亮區域的轉譯並不一致。此問題現已修正。定義為多行 extmark 一部分的標記也適用於範圍中的每一行,而不僅僅是第一行。此外,nvim_buf_get_extmarks() 已獲得 "overlap" 選項,即使範圍在指定位置之前開始,也可以傳回這類範圍。
預設值
現在預設在 Mac 和 Windows 上啟用 workspace/didChangeWatchedFiles LSP 用戶端功能。在 Linux 上停用,因為目前沒有可行的後端用於監看可良好調整大型目錄的檔案。
在 Windows 上,'isfname' 不包含 ":"。磁碟機代號會正確處理而不需要它。(使用 gF 處理以 ":line:col" 為後綴的檔案路徑)。
'comments' 包含 "fb:•"。
'shortmess' 包含 "C" 旗標。
'grepprg' 預設使用 grep 的 -H 和 -I 旗標,並且預設在可用時使用 ripgrep。
一般模式中的 "]d" 和 "[d" 分別映射到 vim.diagnostic.goto_next()vim.diagnostic.goto_prev()]d-預設 [d-預設
<C-W>d (和 <C-W><C-D>) 映射到 vim.diagnostic.open_float() CTRL-W_d-預設
vim.lsp.start() 設定以下預設按鍵映射(假設伺服器支援)
一般模式中的 K 映射到 vim.lsp.buf.hover(),除非在呼叫 vim.lsp.start() 之前自訂了 'keywordprg'
自動檢查 treesitter 查詢檔案的語法 (請參閱 ft-query-plugin)。可以透過以下方式停用
vim.g.query_lint_on = {}
已為以下項目啟用 treesitter 高亮顯示
Treesitter 查詢檔案
Vim 說明檔案
Lua 檔案
編輯器
改進字串選項值的命令列完成功能。complete-set-option
嘗試使用 :set listchars=<Tab>
預設情況下,如果交換檔屬於正在執行的 Nvim 程序,則會跳過交換檔 "ATTENTION" E325 對話方塊,而不是提示。如果您總是需要交換檔對話方塊,請刪除預設的 SwapExists 處理常式:autocmd! nvim_swapfile預設自動指令
當刪除緩衝區時,使用 CTRL+O、CTRL+I 導覽 jumplist 的行為更加直觀,並且避免了「無效的緩衝區」案例。#25461
:fclose 指令。
v_Q-預設v_@-預設 會針對行式視覺選取中的每一行重複一個暫存器。
在標籤列中使用滑鼠中鍵點擊標籤頁會關閉該標籤頁。
可以使用像是 :vertical:horizontal:botright 等修飾符,在分割視窗中開啟 :checkhealth 緩衝區。
事件
vim.on_key() 回呼函數會接收第二個參數,用於在映射應用之前輸入的按鍵。
LSP
LSP 方法名稱可在 vim.lsp.protocol.Methods 中取得。
vim.lsp.status() 會將最後的進度訊息作為字串使用。
LSP 客戶端現在在應用文字編輯時,總是會儲存並還原已命名的緩衝區標記。
LSP 客戶端現在支援 positionEncoding 伺服器功能。如果伺服器在其初始化回應中回覆 positionEncoding 功能,Nvim 會自動設定客戶端的 offset_encoding 欄位。
LSP 功能的動態註冊。此變更的含義是,檢查客戶端的 server_capabilities 不再足以判斷伺服器是否支援某項功能。請改用 client.supports_method(<method>)。它會同時考慮動態功能和靜態的 server_capabilities
lsp-handlers 的 anchor_bias 選項有助於浮動視窗的定位。
vim.lsp.util.locations_to_items() 會將每個項目的 user_data 設定為原始的 LSP LocationLocationLink
新增支援透過具名管道(Windows)或 Unix 域套接字(Unix)使用 vim.lsp.rpc.connect() 連線到伺服器。
新增對 completionList.itemDefaults 的支援,減少計算屬性經常共享相同值(例如 commitCharacters)的完成項目時的開銷。請注意,這可能會影響不支援此功能的插件和語言伺服器,在這種情況下可以取消設定相應的功能。
vim.lsp.start() 接受「silent」選項,以在 LSP 伺服器啟動失敗時抑制訊息。
Lua
帶有 [range]:lua 會在任何緩衝區中將該範圍作為 Lua 程式碼執行。
不帶引數的 :source 會將 'filetype' 為 "lua" 的緩衝區視為 Lua 程式碼,而不管其副檔名為何。
Vimscript 函數 exists() 支援檢查 v:lua 函數。
vim.iter() 是所有 可迭代 物件(表格、迭代器)的通用介面。
vim.snippet 提供展開和導覽程式碼片段的模式。
vim.ringbuf() 是一個通用的環形緩衝區(資料結構)。
vim.deepcopy() 獲得了 noref 引數以避免雜湊表格值。
vim.keycode() 會翻譯字串中的鍵碼。
vim.system() 會執行命令 / 啟動程序。
vim.lpegvim.re 公開了捆綁的 Lpeg 表達式文法剖析器及其正規表達式介面。
vim.base64.encode()vim.base64.decode() 使用 Base64 編碼對字串進行編碼和解碼。
vim.text.hexencode()vim.text.hexdecode() 會將字串轉換為位元組表示形式,反之亦然。
vim.ui.open() 使用系統預設處理常式(macOS 的 open、Windows 的 explorer、Linux 的 xdg-open 等)開啟 URI。
vim.wo 現在可以進行雙重索引以取得 :setlocal 行為。目前僅支援緩衝區索引的 0
改進了 vim.api.* 呼叫(包含 opts 參數)中型別錯誤的訊息。
Lua 型別註釋適用於
vim.*
vim.fn.*
vim.api.*
vim.v.*
接受嚴重性作為可選參數的函數(例如 vim.diagnostic.get())現在也接受嚴重性列表 vim.diagnostic.severity
vim.diagnostic.count() 會依嚴重性傳回給定緩衝區和/或命名空間的診斷數量。當只需要診斷數量,而不需要診斷本身時,這是 vim.diagnostic.get() 的更快替代方案。
vim.fs.root() 會從「根標記」列表尋找專案根目錄。
vim.tbl_contains() 現在適用於一般表格,並允許指定針對每個值檢查的述詞函數。(使用 vim.list_contains() 檢查類似列表的表格(沒有間隙的整數鍵)中的文字值。)
vim.region() 可以使用 getpos() 接受的字串作為位置。
選項
'winfixbuf' 會將視窗焦點保持在特定的緩衝區上
'smoothscroll' 選項會在設定 'wrap' 時,按螢幕行而不是文字行捲動。
'foldtext' 現在支援虛擬文字格式。fold-foldtext
可將 'foldtext' 設定為空字串,以停用並以正常方式呈現該行:使用常規醒目提示且沒有換行。
'complete' 選項支援「f」旗標,用於完成緩衝區名稱。
'completeopt' 選項支援「popup」旗標,以在浮動視窗中顯示額外資訊。
'errorfile'-q)接受 - 作為 stdin 的別名。
效能
'diffopt'「linematch」評分演算法現在傾向於較大且較少的群組 https://github.com/neovim/neovim/pull/23611
Treesitter 醒目提示現在只在螢幕重繪期間,針對正在呈現的行範圍,以增量方式剖析注入。這顯著提高了具有許多注入的大型檔案的效能。
針對換行的 'breakindent' 效能已顯著提升。
使用 [count] 的游標移動、插入和 screenpos() 現在更快了。
外掛程式
Nvim 現在包含 註解 支援。
:Man 支援 :hide 修飾符以在目前視窗中開啟頁面。
:Man 會遵守 'wrapmargin'
啟動
$NVIM_APPNAME 可以設定為相對路徑,而不只是名稱。
--startuptime 會將兩個進程(TUI + 伺服器)的啟動時間報告為單獨的區段。
終端機
:terminal 接受一些 :command-modifiers(特別是 :horizontal 和那些會影響分割視窗的修飾符)。
當子程序發出 OSC 或 DCS 控制序列時,終端機緩衝區會發出 TermRequest 自動命令事件。
終端機緩衝區會回應 OSC 背景和前景要求。default-autocmds
Treesitter
用於 Markdown(用於 LSP 懸停)的捆綁剖析器和查詢(醒目提示、折疊)。
:InspectTree 會顯示根節點。
:InspectTree 現在支援折疊
:InspectTree 會以 0 為基礎而非以 1 為基礎的索引顯示節點範圍。
vim.treesitter.foldexpr() 現在會識別使用量化查詢模式捕獲的折疊。
vim.treesitter.query.omnifunc() 在 treesitter 查詢檔案中提供完成功能(預設設定)。
vim.treesitter.query.edit() 提供 treesitter 查詢的即時編輯。
Query:iter_matches() 現在可以設定比對的最大起始深度。
@injection.language 現在具有更聰明的解析,並且將會回退到透過 vim.treesitter.language.register() 註冊的語言別名(例如,檔案類型或自訂縮寫),以及/或者嘗試文字的小寫變體。
@injection.filename 將嘗試透過 vim.filetype.match() 比對節點文字,並以與 @injection.language 相同的方式將結果視為語言名稱。
#set! 指令支援 injection.selfinjection.parent,以分別注入目前節點的語言或父 LanguageTree 的語言。
#set! 指令可以設定節點的「url」屬性,讓節點發出超連結。超連結與 UI 相關:在 TUI 中,會使用 OSC 8 控制序列。
改進了查詢剖析的錯誤訊息。
TUI
內建 TUI 現在可以識別終端機模擬器中支援 tui-csiu 的「super」(<D-)和「meta」(<T-)修飾符。
TermResponse 事件可以與 v:termresponse 一起使用,從主機終端機讀取跳脫序列回應。
預設情況下現在捆綁一個使用 OSC 52 將選取範圍複製到系統剪貼簿的剪貼簿提供者,並且在特定條件下將自動啟用。clipboard-osc52
'termsync' 選項會要求主機終端機緩衝螢幕更新,直到重繪週期完成。需要主機終端機的支援。
UI
增強了使用組合字元呈現多位元組字元的支援:最大限制從 1+6 個程式碼點增加到 31 個位元組,這保證適合之前的所有字元,而且通常更多。
注意: 正規表達式引擎仍然有硬式編碼的限制,僅考慮 6 個組合字元。

已變更的功能

這些現有功能變更了其行為。
API
nvim_buf_call()nvim_win_call() 現在會保留任何傳回值(注意:不是多個傳回值)
編輯器
gx 現在使用 vim.ui.open() 而非 netrw。若要自訂,您可以重新定義 vim.ui.open 或重新對應 gx。若要繼續使用 netrw(已棄用)
:call netrw#BrowseX(expand(exists("g:netrw_gx") ? g:netrw_gx : '<cfile>'), netrw#CheckIfRemote())<CR>
LSP
LSP 懸停和簽名幫助現在使用 Treesitter 來醒目提示 Markdown 內容。請注意,程式碼範例的醒目提示需要相符的剖析器,並且可能會受到自訂查詢的影響。
LspRequest 自動命令回呼包含更多關於 LSP 請求狀態更新的資訊。
Lua
無法在 api-fast 中呼叫 vim.wait()
vim.diagnostic.config() 現在接受與 nvim_buf_set_extmark() 相關的虛擬文字選項(例如,「virt_text_pos」和「hl_mode」)在其「virtual_text」表格中,這讓使用者可以更精確地控制診斷虛擬文字的顯示方式。
vim.diagnostic.get()vim.diagnostic.count() 接受多個命名空間,而不僅僅是一個命名空間。
vim.diagnostic.enable() 獲得了新的參數,舊的簽名已棄用。
vim.diagnostic.config() 現在接受虛擬文字的 prefix 選項的函數,這允許呈現例如不同診斷嚴重性。
選項
嘗試設定無效的鍵碼選項(例如 set t_foo=123)不再產生錯誤。
終端機
以無參數啟動的終端緩衝區(並使用 'shell')如果作業在沒有錯誤的情況下退出,則會自動關閉,從而消除(通常不希望看到的)「[Process exited 0]」訊息。default-autocmds
Treesitter
Query:iter_matches()vim.treesitter.query.add_predicate()vim.treesitter.query.add_directive() 接受一個新的 all 選項,該選項確保所有匹配的節點都以表格形式返回。預設選項 all=false 只返回單個節點,這會破壞帶有量詞的捕獲,例如 (comment)+ @comment;它僅為了向後相容性而提供,並將在 Nvim 0.10 之後移除。
vim.treesitter.query.add_predicate()vim.treesitter.query.add_directive() 現在接受一個選項表格,而不是布林值「force」參數。要強制一個謂詞或指令覆蓋現有的謂詞或指令,請使用 { force = true }

已移除的功能

這些已棄用的功能已被移除。
Vimball 支援,包括 :Vimuntar 命令
對舊版 treesitter 注入查詢的支援
'shortmess' 標誌
shm-f。一律使用「(3 of 5)」,絕不使用「(file 3 of 5)」。
shm-i。一律使用「[noeol]」。
shm-x。一律使用「[dos]」、「[unix]」和「[mac]」。
shm-n。一律使用「[New]」。

已棄用

請參閱 deprecated-0.10
主要
命令索引
快速參考