電子報 #7 - 道路之夏

2016年11月

Neovim 電子報來了!如果您只關心新功能,請跳到樂趣功能章節。您也應該了解專案管理的變更。

什麼是 Neovim?

每分鐘都有一個新的文字編輯器誕生(來源:Hacker News)。有數不清的文字編輯器在解決「常見情況」。

Neovim 使用者想要的不是另一個類 Vim 的文字編輯器,而是一個更好的 Vim。Vim 核心中存在數千個小的決策,這些決策是數十年來累積的;其中大多數決策仍然相關,解決了新專案尚未遇到、消化和決定的細微問題。

Neovim 是 Vim 的重構版本,使其在未來 30 年的黑客生涯中仍然可行。請參閱 :help vim-differences 以參考變更和改進。

我應該切換嗎?

Neovim 非常有意地建立在 Vim 社群的長期知識和使用者習慣之上。這表示從 Vim「切換」到 Neovim 只是「升級」,就像安裝新版本的 Vim 一樣。如果您登入只有 Vim 的伺服器或工作站,您不會迷路。如果您找到一篇關於 Vim 的文章,它也可能適用於 Neovim,除非它是關於 :smile

所以,如果您喜歡 Vim,請嘗試 Neovim。如果您熱愛 Vim,請嘗試 這個 ;)

黑客…或純粹的工程

從一開始,Neovim 的明確目標之一就是

簡化維護並鼓勵貢獻

我們想要一個可駭客的 Vim:一個程式碼庫和社群,能夠進行實驗並以低成本試用新功能。

而且有證據顯示朝著這個目標取得了真正的進展。我們已成功執行了重要的「路線圖外」修補程式:對其作者來說很重要,但並非專案最高優先級的功能。

這些修補程式被收錄是因為它們

  1. 符合現有的慣例/設計
  2. 包含健全的測試涵蓋率(由進階的測試框架和 CI 啟用)
  3. 收到其他貢獻者的深思熟慮的審查

它們在 :help nvim-features 中被隨意提及 :)

沒有 :smile 的樂趣?

新的用戶端和創新的應用程式出現的頻率比以往任何時候都更高。

  • NyaoVim 是一個經過深思熟慮設計的模組化 Electron GUI
    • 它的 <neovim-editor> web 元件可以用在您自己的專案中,包括 VS Code、Atom 和其他 Electron 或 nw.js 專案!
  • ONI 是一個基於 Electron 的 Neovim IDE,展示了許多令人興奮的可能性。它也有一個像 NyaoVim 一樣酷的標誌 :)
  • 使用者喜歡 deoplete,第一個用於 vim 的非阻塞自動完成外掛程式。
  • @qvacua 將目光轉向 nvim,他正在快速開發新的基於 nvim 的後端,用於他知名的 VimR 專案,這是一個精緻的 macOS GUI。在 發佈頁面中有為 macOS 10.11 預先建立的 .app 套件。
  • 跨平台的 neovim-qt GUI 持續改進:它和 gVim 一樣快,閃爍更少,而且它不依賴 GTK/KDE。
  • neovim.app 是一個 macOS Neovim GUI,可透過 homebrew 用於 macOS 10.9+。
  • nvim-hs 是一個主機,可啟用使用 Haskell 編寫 Neovim 外掛程式
  • 請查看 cl-neovim 以製作 Neovim lisp 外掛程式。包含 :Lispdo
  • nvr 現在支援 Vim 的「client server」選項 --servername--remote 等。nvr 非常適合從 :terminal 緩衝區與父 nvim 實例進行通訊
  • Intero 使用者對 intero.nvimintero-neovim 感到高興

有適用於 go、julia、perl、Java、R、Elixir、Clojure 等的用戶端。請瀏覽 相關專案 wiki 頁面以探索新出現的專案!

專案管理

清晰和一致性會帶來貢獻。 — @robertmeta

限時的仁慈獨裁者

7 月,Thiago (@tarruda) 因為個人原因減少了在專案中的活躍度。他希望未來能夠恢復活躍貢獻。

有些人要求任命一位「BDFL」。@justinmk 扮演這個角色,除非您想要這個角色:我們已採取措施來記錄維護者的角色,以便未來任何受大多數貢獻者信任的人都可以挺身而出。

最終目標是盡可能橫向地分散任務,並繼續將「提交權」授予我們信任的人。目前有 14 位核心貢獻者;我們希望將其擴展到 50 位。我們不希望專案依賴於英雄般的努力,而是希望讓感興趣的各方在 Vim 社群的慣例和禮儀中工作。

資金

(正在進行的) 成功的 資助活動 產生了 libmpack:terminal,以及主要的重構和改進(例如,將 UI 邏輯與 TUI 解耦)。由於 Thiago 在專案中的活躍度降低,因此資金可以提供給其他開發人員。

Neovim 的多產提交者 (貢獻了 21 kLOC) 和 Vim (13 kLOC,包括 if_python) @ZyX-I 同意擔任「首席開發人員」的角色,即接收資金的開發人員。他在 Neovim 上的工作包括

  • 一流的 XDG 支援、shada、建置時間產生器、自動變更感知 linter、Lua 到 VimL 翻譯器
  • 重要的內部功能,例如 msgpackparse()os/fileio.c (緩衝 I/O)
  • Vim JSON 支援的完整重寫,包括詳細的錯誤訊息
  • 上述所有功能的全面測試涵蓋率

資金並不總是提供給一個人。它可供任何想要花一個月或更長時間專注於 Neovim 的 核心貢獻者使用。

捐款

由於資金是按月提供的,因此(希望)這是一個低摩擦的決策

  • 要捐款 10 美元,您可以每月承諾捐款 1 美元。
  • 如果這個專案讓您感到憤怒,請取消您的承諾。
  • 如果這個專案讓您感到快樂(儘管不知何故沒有 :smile),請讓承諾繼續下去!

API

Neovim API 是該專案的定義性技術和「軟體」功能之一。在 PR #5535 中,我們制定了一項策略,用於在不破壞用戶端的情況下擴展 API

  • 我們建立了API 層級的概念,以啟用簡單的比較,並強調 API 版本與 Neovim 版本是分開的。
  • 我們將版本和棄用欄位新增至 API 中繼資料。
  • 我們永遠不會破壞在標記版本中發佈的 API 函數簽章。
  • 我們不會移除已棄用的 API 函數,直到 Neovim 版本 2.0(如果有的話)。

API 應該只會成長,而不是破壞。每個 API 函數都標記了它首次可用的 API 層級。這使得眾多 Neovim API 用戶端可以實際支援任何發佈版本的 Neovim。

PR #4934 以來,您可以直接從 VimL 呼叫目前 nvim 處理程序的 API

:echo nvim_buf_get_lines(42, 1, 3, v:false)

請在命令列嘗試 :call nvim_<Tab> 以查看可用的 API 函數,或安裝 nvim-api-viewer 外掛程式以查看可用 API 函數的精美概述。

我們非常重視 API 的可靠性,並且我們已嘗試仔細思考設計。感謝來自外掛程式和用戶端作者的回饋!

發佈策略

版本控制

一年前,我們宣布了第一個發佈版本 0.1。我們已簡化發佈流程(版本控制、標記、變更記錄、公告)。

有些使用者想知道 0.1 是否表示 Neovim 不穩定。

  • 0.1 以來的每個版本都被認為在所有系統(Windows 除外)上穩定可用
    • Windows 將從 0.2 開始成為一流的目標。
  • 1.0 之前,某些非 API 功能可能會破壞向後相容性。這種情況並不常見,並且這些情況始終有記錄
  • 0.1.6 中,我們引入了 API 版本控制。用戶端可以動態決定要使用哪些函數。

我們遵循 semver;那裡的建議說明了 0.x 系列的意圖。

作業系統套件

越來越多的作業系統套件正在出現。Neovim 是 Debian 的下一個版本的一部分!特別感謝 @jamessan (Debian 維護者和 Neovim 貢獻者)、@fwalch 和其他為他們喜歡的系統建立套件,並與我們合作解決不可避免的編譯器/平台怪癖的人。

進度

自 2014 年以來,Neovim 的貢獻者完成了哪些事?

根據保守估計,至少撰寫了 20,000 行新的 C 程式碼。除了通過 Vim 自己的測試套件之外,我們還撰寫了 2200 個新的測試。共有 273 位不同的貢獻者參與了核心專案。在 3 年內,核心專案的提交次數比 Vim 在 12 年內的提交次數還多。

除了主要的重構和功能開發外,我們還投入了大量的時間在 Neovim 的持續整合 (CI) 系統上。在一個穩定但脆弱的 C 程式碼庫中,維護者傾向於忽略「小型」功能,因為它們可能風險太高。CI 降低了脆弱性,因此我們可以歡迎大型和小型的功能開發,而不是害怕改變。

新的功能可以透過螢幕測試進行嚴格的測試。例如,這裡有一個測試可以驗證 'wildmode' UI 行為

describe("'wildmenu'", function()
  it(':sign <tab> shows wildmenu completions', function()
    execute('set wildmode=full')
    execute('set wildmenu')
    feed(':sign <tab>')
    screen:expect([[
                               |
      ~                        |
      ~                        |
      define  jump  list  >    |
      :sign define^             |
    ]])
  end)
end)

在 2014 年我們從 Vim 分叉出來後,有一段不穩定的時期;這個差距變得越來越小,並將在 2017 年消失。每個回歸錯誤修復都由整合測試涵蓋。每個拉取請求都會針對 12 種不同的環境進行建置。特別感謝 @jszakmeister@fwalch@ZyX-I 在建置系統上的工作,以及 @oni-link 修復了一些非常困難的錯誤。

小細節也很重要

社群媒體上得到的最強烈的印象之一是,人們在使用 Neovim 時,真的非常欣賞較少的摩擦預設值很重要。Tim Pope 在策劃我們選擇的許多預設值方面功不可沒。

@fmoralesc 和其他人仔細思考如何實作這些預設值,而不會造成回歸錯誤(encoding=utf8 和 syntax/filetype 很棘手)。這項工作很繁瑣,但值得:這是一次性的成本,可以幫助新使用者、新系統上的舊使用者(這些系統現在隨處可見:虛擬機、容器、伺服器…),並透過傳播 Vim 的「最佳實踐」來幫助所有使用者。

功能

以下是自上次電子報以來的一些新開發項目。

  • Ruby 支援在 0.1.5 版本中加入。這表示您可以使用 Ruby 編寫 Neovim 外掛程式,並且支援舊版 Vim 的 :ruby* 命令(因此現有的 Vim+Ruby 外掛程式可以在 Neovim 中運作,例如 Command-t 和 vim-github-dashboard)。
    • 若要啟用 Ruby 支援,只需 gem install neovim。您無需擔心針對特定版本進行編譯。
  • 使用 Neovim API Go 客戶端 使用 Go 編寫外掛程式!(感謝 @garyburd!)
  • :CheckHealth 會偵測常見問題(例如 Homebrew 的 doctor)。每當您安裝或升級 Neovim 時,請執行它。
  • 緩衝區區域高亮顯示:help api-highlights)類似於 matchaddpos(),但有一些關鍵差異:它與緩衝區相關聯,並且會適應行插入和刪除。適用於監控緩衝區變更並在背景計算高亮顯示的 linter 或語意高亮顯示外掛程式。

外部化 UI 小工具

PR #4432 中,@bfredl 邁出了第一步,讓 UI 對「小工具」的顯示有更多控制權@romgrk 很快就製作了一個概念驗證

很快就有一個雄心勃勃的修補程式cmdline、tab、wildmenu 和預覽視窗小工具 外部化。示範影片顯示了令人興奮的潛力

這項工作之所以能實現,是因為 @tarruda 清晰地將終端機 UI (TUI) 與內部螢幕分開,因此即使是內建的 TUI 也是由 UI 事件驅動,就像任何其他外部化的 UI 一樣。

遞增式(「即時」):substitute

在 2016 年 5 月,一群由 Eric Burel 指導的學生聯繫我們,表示要為 Neovim 做出貢獻。從我們提供的一系列想法中,他們決定為 :substitute 實作「即時預覽」。我們在 PR #5561 中合併了它,並在 0.1.7 中發佈。設定 inccommand 選項來嘗試它

:set inccommand=split

此功能之所以能實現,歸功於我們的開發模型:儘管「沒有時間」進行副專案,我們仍概述了基本概念,學生們在帶外做出決策,並且我們在需要時提供澄清。

  • 學生張貼了一個 PR 以允許持續的回饋。PR 分支會定期更新,因此審查人員可以提取、建置和測試。
  • 使用螢幕測試撰寫測試,協助 Coverity/ASan 等工具測試該功能,並讓審查人員視覺化該行為
  • 自動化建置系統會持續在 12 個不同的系統上執行變更。

Eric 寫了一篇關於此經驗的文章。感謝 Eric、ENSIMAG 的學生、@KillTheMule@bfredl 將此功能推向我們引以為傲的結論。

即將推出

在 2017 年的 Neovim 0.3 中尋找以下開發項目。

  • 我們將在 2017 年發佈 Lua 作為預設的指令碼替代方案。下一個降低風險、快速增強的「轉折點」是使核心能夠透過 Lua 擴充。為此,PR #4411 是一個重要的步驟。
  • 透過 ZyX 的 eval.c 重構,單體的 eval.c 將被分成模組,這標誌著 Neovim 的 VimL 實作與 Vim 的實作分道揚鑣。這將是世界上第二個替代的 VimL 實作(ZyX 的 VimL 到 Lua 的 PR 是第一個)。
  • 延伸標記將為外掛程式作者提供更強大且更有彈性的標記。
  • 我們將仔細研究Microsoft 語言伺服器實作,以決定如何將其和類似的中介軟體優雅地與 Neovim 整合。

結束

這就是 Neovim 的 2016 年。2017 年會是 Neovim 桌面的元年嗎?

Neovim 的想法正在融入其他專案中,例如 Xi 編輯器 和 Vim 本身,今年的活躍程度比其歷史上的任何一年都高

在 Gitter 和 IRC 頻道中有一大群人在活動(這些頻道透過 matrix 橋接,感謝 @leonerd!)。造訪我們以討論該專案。

別忘了,如果您想查看專案的發展方向,可以到 neovim.io 查看路線圖

感謝您的閱讀。

—Justin M. Keyes (@justinmk)


註 1
$ git log --grep='\([zZ]y[xX]\)\|\([nN]ikolai [pP]av\)\|\([nN]ikolay [pP]av\)' --numstat --pretty=tformat: --numstat|gawk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s removed lines: %s total lines: %s\n", add, subs, loc }'
added lines: 22590 removed lines: 8620 total lines: 13970

$ git log --grep='[cC]hristian [bB]rab' --numstat --pretty=tformat: --numstat|gawk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s removed lines: %s total lines: %s\n", add, subs, loc }'
added lines: 10000 removed lines: 3033 total lines: 6967
註 2
$ ohcount msgpack_rpc/ api/ os/ event/ tui/ shada.c rbuffer.c terminal.c memory.c
c                    79      14576       2863      16.4%       2154      19593

新聞

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

什麼是 Neovim?

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

討論

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