<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          LWN: Neovim 0.5 中的新功能!

          共 4798字,需瀏覽 10分鐘

           ·

          2021-08-27 18:55

          關(guān)注了就能看到更多這么棒的文章哦~

          New features in Neovim 0.5

          August 3, 2021
          This article was contributed by Ayooluwa Isaiah
          DeepL assisted translation
          https://lwn.net/Articles/864712/

          Neovim 0.5 是 Neovim 編輯器的第五個(gè) major release 版本。Neovim 是由歷史悠久的 vi 編輯器的 Vim 這一支演變而來(lái),于今年 7 月 2 日正式發(fā)布了這個(gè)新版本。這是近兩年工作的結(jié)晶,帶有一些重要功能,旨在讓編輯體驗(yàn)可以大幅現(xiàn)代化。其亮點(diǎn)包括原生支持了語(yǔ)言服務(wù)器協(xié)議(LSP),這樣一來(lái)針對(duì)各種語(yǔ)言的高級(jí)編輯功能都可以用起來(lái)了;改進(jìn)了用于配置和插件開(kāi)發(fā)的 Lua API ;以及使用了 Tree-sitter 來(lái)更好地進(jìn)行語(yǔ)法高亮。總的來(lái)說(shuō),0.5 版本是這個(gè)編輯器的一個(gè)重要升級(jí)版,這些改進(jìn)應(yīng)該會(huì)讓現(xiàn)有的粉絲們滿意,并有可能會(huì)吸引到新的用戶和貢獻(xiàn)者加入這個(gè)項(xiàng)目。

          Neovim 項(xiàng)目是由 Thiago Padilha 在 2014 年啟動(dòng)的,當(dāng)時(shí)他為 Vim 開(kāi)發(fā)的多線程功能的 patch 在沒(méi)有太多反饋的情況下就被拒絕了。導(dǎo)致 Padilha 創(chuàng)建這個(gè) fork 分支的主要原因就是這一點(diǎn),他的明確的目標(biāo)是改善 Vim 的可用性、可維護(hù)性和可擴(kuò)展性,同時(shí)促進(jìn)一個(gè)更加開(kāi)放和歡迎新人的社區(qū)。

          A built-in LSP client

          語(yǔ)言服務(wù)器協(xié)議(LSP,Language Server Protocol)是一個(gè)開(kāi)源規(guī)范,目的是讓各種不同的源代碼編輯器和集成開(kāi)發(fā)環(huán)境(IDE)中的編程語(yǔ)言相關(guān)的功能能更加標(biāo)準(zhǔn)化。它促進(jìn)了代碼編輯工具(客戶端)和本地運(yùn)行的語(yǔ)言服務(wù)器(language server)之間的通信,從而針對(duì)特定語(yǔ)言提供各種智能輔助功能,如自動(dòng)補(bǔ)全、查找替換、跳轉(zhuǎn)到定義位置、診斷分析和幫助重構(gòu)的功能。

          在開(kāi)發(fā) LSP 之前,每個(gè) IDE 或者文本編輯器都需要針對(duì)目標(biāo)的編程語(yǔ)言來(lái)實(shí)現(xiàn)支持,要么直接寫在代碼中,要么通過(guò)它的擴(kuò)展功能,這就導(dǎo)致了不同語(yǔ)言和編輯器的組合所支持的功能變的差異很大。LSP 標(biāo)準(zhǔn)使得語(yǔ)言服務(wù)器與編輯器可以脫鉤,成為了一個(gè)獨(dú)立的部分,這樣一來(lái)負(fù)責(zé)語(yǔ)言定義的社區(qū)就可以集中精力建立一個(gè)對(duì)某種語(yǔ)言有深刻理解的單一服務(wù)端版本。然后其他工具只需要能跟這個(gè)現(xiàn)有的語(yǔ)言服務(wù)端程序集成起來(lái),就可以針對(duì)這個(gè)編程語(yǔ)言提供高級(jí)功能了。

          雖然在第三方插件的幫助下已經(jīng)可以在 Neovim 中使用 LSP,但 0.5 版本是第一次為 Neovim 的 LSP 增加了原生支持。在 Neovim 中引入 LSP 后,編輯器就可以作為一個(gè)客戶端,將用戶的操作(如執(zhí)行 "go-to-definition" 命令)通知到語(yǔ)言服務(wù)器,服務(wù)器端會(huì)用回復(fù)相關(guān)信息,也許是光標(biāo)位置的符號(hào)相關(guān)定義位置。這樣一來(lái)編輯器就能夠跳轉(zhuǎn)到文件或項(xiàng)目中的指定位置了。

          Neovim LSP 客戶端提供的接口是一個(gè)通用接口,所以它不支持第三方 LSP 插件中的全部功能(如自動(dòng)補(bǔ)全功能)。不過(guò),它是為了更好的可擴(kuò)展性而建立的,所以它包括了一個(gè) Lua framework,這樣一來(lái)插件就可以增加當(dāng)前 Neovim core 尚未支持的功能了。為編輯器設(shè)置獨(dú)立的語(yǔ)言服務(wù)器,只要調(diào)用 nvim-lspconfig 插件就可以,它會(huì)幫助啟動(dòng)和初始化當(dāng)前安裝在系統(tǒng)上的 language server 程序。注意,語(yǔ)言服務(wù)器不是由 Neovim 或 nvim-lspconfig 提供的,它們必須先單獨(dú)安裝好。nvim-lspconfig 插件支持的 LSP 服務(wù)器有很多,列表請(qǐng)查官方網(wǎng)站。

          Lua integration

          Neovim 最初支持 Lua 編程語(yǔ)言的版本是 2017 年的 0.2.1 版本。此后,在編輯器中 Lua 支持功能得到了持續(xù)的演進(jìn)和更深入的整合集成。最值得一提的是,在 2019 年的 0.4 版本中增加了 Neovim 的 Lua 標(biāo)準(zhǔn)庫(kù)。Neovim 開(kāi)發(fā)者期望 Lua 成為編輯器中腳本語(yǔ)言的頭等公民,從而變成 VimL 腳本語(yǔ)言(繼承自 Vim 的腳本語(yǔ)言)的替代方案。Neovim 0.5 改進(jìn)了 Lua API,增加了 init.lua 替代了 init.vim 用來(lái)配置編輯器,向?qū)崿F(xiàn)這一目標(biāo)邁出了一大步。

          至于為什么決定在 Neovim 中深度集成 Lua,可以聽(tīng)一下項(xiàng)目首席維護(hù)者 Justin M. Keyes 的演講視頻。總之,Lua 是一種比 VimL 更容易上手的語(yǔ)言,主要得益于它很簡(jiǎn)單、且易于集成。它的運(yùn)行速度也比 VimL 快一個(gè)數(shù)量級(jí)。Neovim 支持 2006 年發(fā)布的 Lua 5.1,而不是最新的 Lua 版本(如 5.3 或 5.4,分別發(fā)布于 2015 年和 2020 年),這主要是因?yàn)?LuaJIT 只支持 Lua 5.1。之所以要保持兼容 LuaJIT,主要是因?yàn)樗鄬?duì)于標(biāo)準(zhǔn) Lua 編譯器具有顯著的性能優(yōu)勢(shì)。

          在 Neovim 中加入 Lua 使得人們可以更加容易地?cái)U(kuò)展編輯器功能,以及對(duì)核心代碼進(jìn)行貢獻(xiàn),特別是那些被 VimL 擋住的用戶受益更多,因?yàn)?VimL 在 Vim 之外完全沒(méi)有什么地方使用。由于 Lua 也被大量用于編寫 video game 腳本,以及用來(lái)擴(kuò)展各種其他語(yǔ)言(C、C++、Java 等)編寫的程序,因此有大量的資源可供學(xué)習(xí)這種語(yǔ)言之用,同時(shí)還有一些例子詳細(xì)介紹了如何使用它與其他語(yǔ)言的 API 交互。這些關(guān)于 Lua 的豐富信息,使得新的插件作者和有志于投入 Neovim 開(kāi)發(fā)的貢獻(xiàn)者們可以迅速掌握這種語(yǔ)言。

          Neovim 中對(duì) Lua 的支持,使得它成為了 Neovim 后續(xù)新功能開(kāi)發(fā)以及提供對(duì)外接口的首選語(yǔ)言,如 LSP 客戶端,要想使用這些 API 就只能用 Lua 來(lái)完成,因?yàn)?VimL 無(wú)法與之交互。然而,Neovim 中的 VimL 支持并沒(méi)有消失,Neovim 開(kāi)發(fā)者也沒(méi)有計(jì)劃要廢除它,所以目前將現(xiàn)有的 init.vim 配置遷移到 init.lua 的工作以及將移植 VimL 插件移植到 Lua 的工作,在目前來(lái)說(shuō)都僅僅是個(gè)可選項(xiàng)而已,并不是必須要做這些事。唯一需要注意的是,在 init.vim 配置或 VimL 插件中使用這些 Neovim API(如 LSP 或 Tree-sitter)就只能通過(guò)在現(xiàn)有的 VimL 代碼中嵌入一些 Lua 小代碼來(lái)實(shí)現(xiàn)了。

          盡管 Lua 更深入的集成是被看作是 0.5 版本的主要成就之一,但并非所有人都贊同在編輯器核心中推動(dòng) Lua 來(lái)取代 VimL。有一些人擔(dān)心,對(duì) Lua APIs 和 Lua 插件的強(qiáng)調(diào)會(huì)導(dǎo)致插件社區(qū)的分裂,越來(lái)越多的插件將只支持 Neovim(也就是無(wú)法同時(shí)支持 Vim 和 Neovim 了)。另外,Vim 創(chuàng)建者 Bram Moolenaar 和其他 Vim 貢獻(xiàn)者正在積極開(kāi)發(fā)一個(gè)改進(jìn)版的、不能完全實(shí)現(xiàn)向后兼容的 VimL 版本(目前被稱為 Vim9)。目前還不完全清楚 Neovim 的維護(hù)者是否計(jì)劃支持 Vim9,因?yàn)樗麄儗?duì) Lua 這方面的投入更多一些。在寫這篇文章的時(shí)候,已經(jīng)有幾個(gè) Lua 插件只能在 Neovim 中使用了,還有一些 Vim9 插件則只能在 Vim 中使用。因此很容易預(yù)測(cè)到,這兩個(gè)項(xiàng)目的生態(tài)系統(tǒng)在不久之后將可能會(huì)出現(xiàn)大量的差異化,畢竟目前還沒(méi)有計(jì)劃將類似的 Lua 功能加入 Vim 中。

          Tree-sitter

          Tree-sitter 是一個(gè)新實(shí)現(xiàn)的解析系統(tǒng)(parsing system),旨在取代當(dāng)前的開(kāi)發(fā)工具中普遍使用的、功能有限的、基于正則表達(dá)式的代碼分析功能。Tree-sitter 是一個(gè)高性能的解析器生成器(parser generator),可以生成 parser,針對(duì)源文件生成一個(gè)相應(yīng)的增量語(yǔ)法樹(shù)(incremental syntax tree),并且可以在文件被編輯的時(shí)候高效實(shí)時(shí)更新這個(gè)語(yǔ)法樹(shù)。在 Neovim 0.5 中,對(duì) Tree-sitter 的支持已被添加到編輯器的核心中,盡管由于一些已知的錯(cuò)誤和大文件的性能問(wèn)題,它目前被歸類為實(shí)驗(yàn)性。預(yù)計(jì)它將在下一個(gè)主要版本(0.6)中變得穩(wěn)定,從過(guò)去的版本來(lái)看,應(yīng)該是在一兩年內(nèi)。

          在 Neovim 中使用 Tree-sitter 就使得編輯器更好地理解源文件中的代碼,將其按照這個(gè)編程語(yǔ)言中的 structure(如變量、函數(shù)、類型、關(guān)鍵字等)生成語(yǔ)法樹(shù),并使用這些信息來(lái)對(duì)這些結(jié)構(gòu)統(tǒng)一進(jìn)行處理,保持一致性。如果針對(duì)當(dāng)前語(yǔ)言,安裝好了一個(gè) Tree-sitter 分析器并啟用,那么編輯器的語(yǔ)法高亮功能就會(huì)完全基于它所提供的語(yǔ)法樹(shù)來(lái)實(shí)現(xiàn)了。這樣一來(lái)就可以改進(jìn)各種文字標(biāo)記和顏色,從而能更清楚地勾勒出代碼結(jié)構(gòu)。特別是 object field, function name, keyword, type, variable 等在整個(gè)文件中的高亮顯示方式將更加一致。

          Tree-sitter 還能夠進(jìn)行增量解析,在編輯代碼的過(guò)程中實(shí)時(shí)保持更新語(yǔ)法樹(shù)。這樣一來(lái)就不再需要為了在修改后能更新語(yǔ)法高亮而重新 parse 整個(gè)文件的做法了,目前基于正則表達(dá)式的代碼高亮功能就是這么實(shí)現(xiàn)的。因此解析速度就可以顯著提高了。

          因?yàn)?Tree-sitter 改進(jìn)了語(yǔ)法高亮功能,所以得到很多贊譽(yù),比起編輯器中默認(rèn)提供的功能來(lái)說(shuō),它能更好地定義出語(yǔ)言感知文本對(duì)象(language-aware text objects),從而更加適合代碼開(kāi)發(fā)工作。nvim-treesitter-textobjects module 可以為類、函數(shù)、參數(shù)、條件等創(chuàng)建 text object,對(duì)這些 object 的操作就像編輯單詞或句子一樣容易了。基于 Tree-sitter 的高亮顯示的若干例子可以在 nvim-treesitter 倉(cāng)庫(kù)的 gallery 中看到。

          Wrapping up

          上述功能就是這個(gè)版本的主要更新了,當(dāng)然 Neovim 0.5 還包括了對(duì)用戶界面的不少改進(jìn)以及 bug fix,以及一些更加小的功能,比如支持了在 Unix 平臺(tái)上用 Perl 5.22+ 編寫的 remote plugin。值得一提的是,在這個(gè)版本中還合并了大約 1000 個(gè) Vim patch,對(duì)此編輯器的各個(gè)環(huán)節(jié)都有改動(dòng)。完整的改動(dòng)、fix 和改進(jìn)的列表可以從 release note 里面看到。

          Neovim 項(xiàng)目使用 GitHub issue 來(lái)跟蹤所有的功能和 bug,因此要想進(jìn)一步了解進(jìn)入這個(gè)版本的改動(dòng)的話,可以查看 github 上 0.5 milestone 中已關(guān)閉問(wèn)題列表。后續(xù)版本的計(jì)劃詳見(jiàn) project 的 roadmap 頁(yè)面,而優(yōu)先級(jí)則可以通過(guò)查看 GitHub 的 milestonen 頁(yè)面來(lái)了解。當(dāng)然,非常歡迎來(lái)自社區(qū)的貢獻(xiàn),可以通過(guò) Gitter、Matrix 或 irc.libera.chat 上的 #neovim 聊天室聯(lián)系到項(xiàng)目的維護(hù)者。

          全文完
          LWN 文章遵循 CC BY-SA 4.0 許可協(xié)議。

          歡迎分享、轉(zhuǎn)載及基于現(xiàn)有協(xié)議再創(chuàng)作~

          長(zhǎng)按下面二維碼關(guān)注,關(guān)注 LWN 深度文章以及開(kāi)源社區(qū)的各種新近言論~



          瀏覽 104
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日日干夜夜操天天肏 | 琪琪婷婷五月色综合 | 青娱乐免费视频观看 | 日韩欧美黄色 | 免费v在线观看 |