電子報 #6 - 發布啦!

2015 年 12 月

歡迎來到 Neovim 第六期電子報,這個專案旨在透過新增新功能來改進 Vim,並將其包裝在一個漂亮、現代的介面中。

簡介

嗨,我是 @tarruda,我將在這期電子報中直接向 Neovim 社群發言。除此之外,我會盡量保持像 @jdavis 之前那樣的結構。讓我們開始吧!

一般新聞

0.1 版本發布

Neovim 現在有了第一個公開版本!

幾個月前,@justinmk 建立了 0.1 里程碑,這大大幫助我們專注於更緊迫的任務,最終促成了第一個版本的發布。我們計劃了很多 0.1 版本中還沒有的功能,但決定將它們推遲到未來的里程碑,這些里程碑在這次電子報之後會更加頻繁。

這說明了 Neovim 從現在開始將採取的路徑:我們將專注於更小、更頻繁和更穩定的版本,而不是準備需要很長時間才能發生的大型版本。

0.1 版本基本上只是一個標籤,適用於希望編譯具有最低穩定性版本的 Neovim 的使用者,但未來的版本也可能包含預編譯的二進制檔案,甚至安裝程式(當 Windows 獲得官方支援時)。

Neovim 0.1.0 和 0.1.1 版本已經在發布頁面上提供,適用於Homebrew/LinuxbrewArch Linux。請查看Neovim Wiki 上的安裝頁面,以了解更多安裝 Neovim 的可能性(儘管在撰寫本文時,這些大多數將安裝 Neovim 的最新開發版本,而不是 0.1.x 版本)。

對於那些喜歡(或需要)從 git 手動編譯的人,建置說明仍然照常工作。

Bountysource salt 活動

對於那些還不知道的人,Bountysource 推出了一個新平台,允許開源專案獲得可持續的群眾募資。這個平台很方便地被稱為 「salt」,而 Neovim 是最早使用它的專案之一。

第一個活動非常成功,籌集了約 35,000 美元,這讓我可以在 Neovim 上全職工作約 6 個月。由於對該專案充滿熱情,並且無法在這幾個月內實現所有目標,我繼續將非常大量的時間投入到 Neovim 中,以至於開始損害我的個人和職業生活。這種情況一直持續到二月,當時我發現我根本無法繼續以舊有的速度前進。大約在那時,@rappo 邀請我測試 salt 平台的測試版,我認為這是繼續我在 Neovim 上工作的一種方式。

就像它的前身一樣,salt 活動非常成功,讓我能夠在過去 8 個月內(以健康的方式)繼續為 Neovim 做出貢獻,謝謝你們!

從原始碼建置 Neovim

我們是否曾提到從原始碼建置和安裝 Neovim 有多容易?雖然它有許多依賴項,但建置系統會自動下載並建置所有內容,而不會讓您的系統雜亂無章。請查看 Neovim Wiki 上的安裝頁面以了解確切的步驟。

開發新聞

XDG 支援

Neovim 現在遵循 XDG 目錄規範。這是 @ZyX-I 在專案開始時提議的,但直到幾個月前,我們才收到 @YamakakyPR,該 PR 被 @jck 在後來的 PR 中取代,並再次被 @ZyX-I 在最近合併的 最終 PR 中取代。

由於遵循 XDG 目錄規範,Neovim 現在會在 ~/.config 目錄中尋找使用者設定檔,例如 .nvimrc~/.nvim 下的檔案,這可以被 $XDG_CONFIG_HOME 環境變數覆寫。該規範還規定快取檔案應儲存在單獨的目錄 (~/.local/share) 中,viminfo(現在是 ShaDa)或備份/交換等檔案可以選擇儲存在此處。

此變更使使用者可以更輕鬆地備份和管理其設定,因為它將與其他也遵循該規範的程式一起儲存,更不用說它使主目錄更整潔。

有關如何遷移現有設定的逐步說明,請參閱 :h nvim-from-vim

ShaDa(共享資料)

@ZyX-I主要 ShaDa PR 已合併。它完全取代了 viminfo 檔案,用於儲存使用者資料,例如暫存器內容、命令歷史記錄、變數、跳轉列表等等。

viminfo 的一個已知問題是,兩個並行執行的 Vim 實例會覆蓋彼此的資料。ShaDa 是由 @ZyX-I 建立的新儲存格式,它不僅解決了這個問題,還為 Neovim 帶來了許多增強功能。

  • 檔案格式
    • 支援向前相容性(較新 Neovim 的 ShaDa 檔案可以由較舊版本使用)和向後相容性(較舊版本的 ShaDa 檔案可以由較新版本使用而沒有問題),這使得 ShaDa 檔案在很大程度上具有未來相容性。
    • 支援階層式資料結構,為 Neovim 提供高度的彈性,以序列化任何種類的資訊。
    • 基於 msgpack,並在文件中明確標準化,這允許建立執行任意操作的插件/工具。
    • 假設檔案中資料片段之間沒有儲存任何狀態,這使得此類工具更簡單,並允許執行諸如「將來自不同 Neovim 實例的兩個 ShaDa 檔案連接起來,只需使用 cat 1.shada 2.shada > joined.shada,Neovim 在讀取時會正確處理」等操作。
    • 使用擴展路徑(/home 而不是 ~/)。
  • 嵌入式時間戳記允許多個 Neovim 實例在寫入或讀取 ShaDa 檔案時正確合併其資料。
  • 向前相容性包括 Neovim 核心程式碼,如果較新 Neovim 版本提供的 ShaDa 檔案中發現任何額外資訊,則會保留這些資訊。

雖然 PR 非常大,但 @ZyX-I 已注意新增良好的測試覆蓋率。做得好,@ZyX-I

包裝事件迴圈層

眾所周知,libuv 是 Neovim 使用的事件迴圈函式庫,它使我們能夠輕鬆實現需要與編輯器進行非同步通訊(不是由使用者啟動)的功能。不幸的是,由於目前 Neovim 程式碼的組織方式,整合 libuv 並不是一件簡單的事情。

基本概念是,Neovim 在輪詢使用者輸入時會收到任意事件,但這些事件不能立即處理,因為 Neovim 可能處於無法處理任意操作的狀態。因此,如果 Neovim 在檢查使用者輸入時收到事件,它會將該事件放入佇列中以供稍後處理。

以下情境說明了一個範例:Neovim 檢查使用者是否在執行 regexp 引擎時輸入了 ctrl+c,但它無法在收到事件時處理該事件,因為它可能想要執行再次呼叫 regexp 引擎的 vimscript,而且該引擎不是可重入的,因為它嚴重依賴全域變數。因此,它必須延後事件,直到安全時再處理,而確定何時處理事件才是安全的,這本身就是另一個問題。

與 libuv 整合的另一個複雜之處在於,有時 Neovim 必須僅處理來自特定來源的事件。例如,當 Neovim 發送 msgpack-rpc 呼叫時,它應該僅處理來自

  • 使用者的事件(例如:ctrl+c 中斷呼叫)
  • 接收 msgpack-rpc 呼叫的檔案描述符(可以是來自子程序 stdio 的通訊端)

為了允許這種選擇性事件處理,Neovim 必須維護多個相互整合的佇列,而執行此操作的邏輯非常重複。在我的其中一個最新 PR 中,一些 libuv 「類別」被包裝成一種使管理這些佇列更容易的方式。

jemalloc

jemalloc,一種高效能通用記憶體配置器,現在預設使用。由於 Neovim 在其內部迴圈中大量使用動態佇列(請參閱上文),malloc(3) 的呼叫次數比 Vim 多得多,因此使用在各個平台上具有一致效能的快速實作非常重要。

在最近的 PR 中,@fmoralesc 修改了我們的建置系統使用的 jemalloc 版本,以鎖定 jemalloc 4.0,該版本帶來了更多的效能增強,並新增了對更多平台的支持。

更快的 travis 建置

我們現在使用 Travis 基於容器的基礎架構來執行 Neovim 建置,這使得 CI 建置能夠立即啟動。這是由 @fwalch 實作的,他也對我們的建置基礎架構進行了許多其他改進,讓開發人員在提交 PR 時能夠更快地收到回饋。

快速建置

@jszakmeister 正在他自己的基礎架構中執行 quickbuild 伺服器。這為我們提供了一個備份 CI,它會再次檢查 Neovim PR,也在 FreeBSD 中執行測試,而 FreeBSD 不在 travis 的涵蓋範圍內。感謝您提高了 Neovim 的穩健性,@jszakmeister

第三方開發

Neomake

您知道除了 syntastic 之外,還有其他利用 Neovim 非同步功能的替代方案嗎?Neomake 是 Neovim 上用於語法檢查的最佳插件:它像 syntastic 一樣具有擴展性,而且它使用 job-control 的事實讓它可以在背景執行檢查,而不會阻礙使用者介面。這對於檢查速度較慢的編譯語言(typescript、java、.NET)來說非常有用。

syntastic 遷移也非常簡單,@benekastah 做得太棒了!

FZF

fzf 是一個命令列模糊搜尋器,感謝它的作者(@junegunn,也是 vim-plug 背後的開發者),它透過一個使用我們 內建終端模擬器 的插件,對 Neovim 提供了很好的支援。

FZF 是像 ctrlp 這類插件的絕佳替代方案:它速度非常快,而且具有在另一個進程中運行的優勢,這樣可以利用多核心系統,並且不會阻礙 Neovim 的使用者介面。要看看它有多快、反應有多靈敏,只要試著執行 :FZF,在 Linux 原始碼樹中搜尋檔案就知道了!

除了 fzf,也鼓勵使用者安裝 fzf.vim,這個插件公開了一些基於 fzf 實作的非常實用的命令。

Deoplete

@Shougo 創建了 deoplete.nvim,一個以 remote-plugin 形式撰寫的非同步補全引擎,它利用 Neovim 的非同步功能來允許在不阻礙使用者介面的情況下計算補全。他決定從頭開始編寫一個新的插件,因為 Neovim 不支援 neocomplete 所需的 Lua 介面。@Shougo 是 Vim 插件的西斯大帝,以下列出他過去的一些作品

社群可以期待 deoplete.nvim 的優異表現!

(最近,@Shougo 發佈了一份 投影片,說明 deoplete 背後的概念。)

Neoterm

Neoterm 是一個可以在 終端視窗 中輕鬆執行測試的插件。它由 @kassio 撰寫,並且支援以下測試庫

  • rspec
  • cucumber
  • minitest
  • go-lang test
  • nose

非常實用,@kassio

新聞

新聞存檔 中找到更多更新。還有一個 RSS feed

什麼是 Neovim?

Neovim 是一個基於 Vim 的文字編輯器,旨在提高 可擴展性可用性,以鼓勵新的應用程式和 貢獻

討論

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