2022 年 Neovim 的更新內容

2022 年 12 月

Neovim 是全球最受喜愛的編輯器。這可是有科學根據的

以下是 Neovim 2022 (Nvim 0.8) 開發的一些重點。

UI

先從養眼的開始!

  • ‘winhighlight’ 已被徹底重新實作為視窗本地的高亮命名空間。這在向後相容的同時,也啟用了許多新的用例,例如視窗本地的語法高亮。
  • 全域 'statusline' 為所有視窗指定一個狀態列。試試看
    :set laststatus=3
    
  • 'winbar' 就像每個視窗頂部的額外狀態列。它是 laststatus=3 的補充
    set winbar=%f
    set laststatus=3
    
  • 'winbar''statusline' 增加了對滑鼠點擊區域的支援 (就像 'tabline' 自 2016 年以來就有的功能)
  • 實驗性零高度命令列
    :set cmdheight=0
    
  • 'mousescroll' 選項控制垂直/水平滑鼠滾動行為。
    :set mousescroll=ver:5,hor:2
    
  • 新的'statuscolumn'選項可以完全控制「裝訂線」,並具有與 'statusline' 相同的熟悉格式。它甚至支援點擊事件,就像 'statusline'、'tabline' 和 'winbar' 一樣。
    • 功能作者 @luukvbaal 還提供了一個包含各種預先封裝的 'statuscolumn' 設定的外掛程式
    • 試試看!
      :set rnu nu 
      :let &stc='%#NonText#%{&nu?v:lnum:""}%=%{&rnu&&(v:lnum%2)?"\ ".v:relnum:""}%#LineNr#%{&rnu&&!(v:lnum%2)?"\ ".v:relnum:""}'
      
  • 標記可以儲存和還原視窗資訊
    :set jumpoptions=view
    
    • 當您跳轉或使用 ctrl-^ 切換緩衝區時,視窗將會還原,而不是垂直重置/重新置中。
  • vim.ui_attach (實驗性) 使進程內的 Lua 外掛程式能夠掛鉤到所有 Nvim UI 公開的相同事件。 pic.twitter.com/w9U87jGfIL
    • noice.nvim 是早期採用者(只花了幾天時間!)。

LSP

  • Nvim 內建 LSP 支援的歷史和狀態總結
  • Nvim LSP 客戶端現在支援通過 TCP 連線到語言伺服器。
    vim.lsp.start({ name = 'godot', cmd = vim.lsp.rpc.connect('127.0.0.1', 6008) })
    
  • 新的LSP 核心事件LspAttachLspDetach。範例
    vim.api.nvim_create_autocmd('LspAttach', {
      group = yourGroupID,
      callback = function(args)
        local client = vim.lsp.get_client_by_id(args.data.client_id)
        your_callbac_func(client, args.buf)
      end
    }
    
  • vim.lsp.get_active_clients() 學習了過濾(這將是 Lua stdlib 中的標準模式)
    get_active_clients({id=42})
    get_active_clients({bufnr=99})
    get_active_clients({name='tsserver'})
    

編輯器

  • Nvim 現在包含 C、Lua 和 Vimscript 的 treesitter 解析器。這是朝向常見語言「預設使用 treesitter」的一步,而不是基於 regex 的 vim 語法定義。
  • tree-sitter 拼字檢查限制在 extmark 區域。
  • 差異模式的 「linematch」功能改進了同一行差異變更的呈現
    :set diffopt+=linematch:60
    
  • Nvim 支援editorconfig,並預設啟用它。Nvim 會偵測專案中的「.editorconfig」檔案並套用設定。
    • 若要選擇停用此功能,請將此加入您的設定
      vim.g.editorconfig_enable = false
      
  • 外掛程式可以提供使用者定義命令的即時預覽
    • 這擴充了內建的 'inccommand' 功能(自 2017 年起),它會在您輸入時顯示 :substitute (:s/foo/bar) 的效果。
    • 範例:live-command.nvim 外掛程式為 :normal 和巨集增加了預覽功能
  • 現在可以為任何使用者定義的命令實作‘inccommand’預覽。這為:normal:global 等的即時預覽奠定了基礎。
    vim.api.nvim_create_user_command(
      'MyCmd',
      my_cmd,
      { …, preview = my_cmd_preview })
    
  • :write 命令增加了 ++p 旗標,因此如果父目錄/dir/不存在,則會建立它
    :edit parent/dir/file.txt
    :write ++p
    
  • Nvim 現在將「工作階段資料」(shada、持久復原等)儲存在 $XDG_STATE_HOME (~/.local/state) 中,而不是 $XDG_CACHE_HOME (~/.cache)。此變更僅影響 macOS/unix,Windows 位置不變。
  • 外掛程式也可以使用 stdpath('log') 來取得建議的記錄檔位置。
  • manpage 檢視器中的 gO (:help :Man) 會在位置列表中顯示大綱(目錄)。現在大綱也列出旗標

效能

  • 檔案類型偵測使用 Lua(而不是 Vimscript)+「隨選」策略 => 比舊的 filetype.vim 快 7 倍,在啟動時節省 5 毫秒以上
    before:
      9.0ms: sourcing …/runtime/filetype.vim
    after:
      1.3ms: sourcing …/runtime/filetype.lua
    
  • nvim --startuptime 現在會報告 Lua require() 的時間。
    000.010  000.010: --- NVIM STARTING ---
    000.198  000.188: event init
    ...
    026.333  001.109  001.101: require('vim.lsp.protocol')
    028.144  000.423  000.423: require('vim.lsp._snippet')
    ...
    
  • Nvim 'packpath' 改善的簡短總結
  • 由外掛程式提供的快速、流暢的折疊

預設值

  • 預設設定 'mouse' 選項 (再次)。自 2017 年以來一直停用,直到「更好的方法」。現在我們有了
    mouse=nvi
    Type ":" (cmdline-mode) to temporarily disable mouse. Right-click shows a popup menu.
    Try it!
    

API

  • nvim_parse_cmd()nvim_cmd([list]) 和「使用者命令預覽」奠定了基礎!而且對於定義自訂命令列 (:) 行為非常有用。
    :echo nvim_parse_cmd('.,$g/foo/bar', {})
    {
     'cmd': 'global',
     'args': ['/foo/bar'],
     'mods': {…},
     'magic': {'file': v:false, 'bar': v:false}
    }
    
  • 使用 nvim_cmd() 以結構化的方式呼叫任何 Vim 舊式命令,例如 system([...])
    • 不需要 fnameescape():特殊字元由 magic 參數控制。
      nvim_cmd({cmd='vimgrep', args={'/%s/j', '**'}}, {})
      
  • nvim-oxi:「針對 Neovim 公開的豐富 API 的一流 Rust 綁定(FFI 到 Nvim C)。」

Lua

  • 請查看用於檔案系統操作的 vim.fs 模組。
    • vim.fs.find() 現在是尋找「根檔案」的正規方法,這對於 LSP 設定很常見。
  • vim.cmd 是 Lua nvim_cmd 包裝器。它支援將 Ex 命令作為函數而不是字串呼叫
    vim.cmd.colorscheme('nightfox')
    
  • Lua 外掛程式持續成熟

    「Lua 外掛程式基本上與 vim 外掛程式相同,只是檔案副檔名是 .lua 而不是 .vim,且檔案包含 Lua 程式碼而不是 Vimscript。」

    • 這個優雅的介面需要大量的仔細工作,這主要歸功於 @bfredl

維護

  • @dundargoc 的工作關閉了兩個分別於 2014 年和 2017 年開始的重構史詩:#567 #7401
  • 核心維護人員 @teej_dv 的 vim9script => Nvim-Lua 轉譯器進展,將使我們能夠繼續從 Vim 中提取測試覆蓋率,加上語法、ftplugins,甚至是 cfilter 之類的外掛程式。
  • 每夜版 + 穩定版 現在提供適用於 macOS 11+ 的通用二進位檔 (ARM/M1、Intel)。

文件

線上 Nvim 文件的自動產生已透過使用 Lua + tree-sitter 取代舊的 AWK 指令碼進行重寫。我們可以擁有美好的事物。

  • 改進的樣式
  • 巢狀清單
  • 選定頁面上的軟換行「流動」佈局(範例
  • 改進了 vim :help 權杖的剖析

比較舊的佈局(左)和新的佈局(右)

作業控制

Nvim 現在在 jobstart():terminal 作業中設定 $NVIM 環境變數,以便子程序明確地提示它們是 Nvim 的子程序。具有衝突「雙重目的」的舊 $NVIM_LISTEN_ADDRESS 不再傳遞給子程序。

RPC

Nvim UI 只是(反向)外掛程式。現在 nvim 本身也是一個自託管 UI:當您在終端機中執行 nvim 時,它會啟動 TUI 作為 nvim --embed 子程序。

就像 Nvim GUI 一樣,您可以將 nvim TUI 連線到任何 Nvim 伺服器以查看其 UI!您現在可以試試看

  1. 在位址 ./foo 啟動伺服器(在目前目錄中建立 foo 檔案)
    nvim --listen ./foo
    
  2. 從不同的終端機(與 ./foo 相同的目錄中),將 nvim 連線到伺服器
    nvim --remote-ui --server ./foo
    

棄用

  • 移除 'insertmode' 選項,Vim 中使用此選項來實作「簡易 vim」。
    • 我們正在努力使相同的行為可以作為外掛程式實現。請參閱 :help 'insertmode'
  • 移除 cscope 支援,因為它與 LSP 客戶端 (:help lsp) 大多數情況下是多餘的。
    • 注意:ctags 支援永遠不會被移除,它更常見且通常更有用。

新聞

新聞存檔中尋找更多更新。還有一個RSS 訂閱

什麼是 Neovim?

Neovim 是一個基於 Vim 的文字編輯器,專為可擴充性可用性而設計,以鼓勵新的應用程式和貢獻

討論

請訪問 #neovim:matrix.org 或 irc.libera.chat 上的 #neovim 與團隊聊天。