从零开始配置vim(22)——lsp简介与treesitter 配置
截止到上一篇文章,我們配置了neovim的很多內容了。具備了一些編輯器的常用功能了,而且可以勝任日常的文檔編輯工作了。但是想作為一個可靠的代碼編輯器還缺少重要的一環,即代碼語法部分的支持。
在過去的vim配置中,我們基于 you-complete-me這個插件配置。但是對于不懂c語言甚至vim的小白來說簡直是災難。各種兼容問題、報錯頻出,而且效果也遠不如 visual studio code等編輯器。也有可能是我那個時候比較菜,當初針對 python配置的補全效果很一般只能補全內置函數,自己定義的類和方法無法補全,而且跳轉時好時壞。后來我拋棄了vim很長一段時間。好在微軟提供了lsp這個大殺器,讓vim、emacs這類編輯器的代碼編輯體驗提升了很大一截。而且配置還相對簡單。
lsp 簡介
過去的編輯器包攬了諸如代碼高亮、語法分析、跳轉等功能,這樣就導致了所有編輯器都有自己專有的一套顯示、跳轉等方案。而第三方編輯器想要達到完全相同的效果幾乎是不可能的。但是微軟提出的 lsp(language server protocol) 確改變了這一格局。
lsp最重要的就是將語法分析、跳轉、自動補全功能這些語言的核心功能和最終呈現效果分開。即server端主要提供了語法分析、補全、跳轉的核心功能,而在客戶端要做的就是調用服務端提供的這些功能來展示以及通過快捷鍵或者其他用戶接口以便用戶使用。而且語言服務器是以進程的方式單獨運行,并不會影響客戶端的運行。它們之間通過本地網絡的形式進行信息交換
- 用戶在工具中打開一個的文件, 該工具通知語言服務器文檔打開 (‘textDocument/didOpen’) 。 從現在起,有關文檔內容不再位于文件系統上,而是保存在編輯器開辟的一塊內容中
- 用戶進行編輯:該工具通知服務器文檔更改 (‘textDocument/didChange’) ,程序語義信息由語言服務器更新。 發生這種情況時,語言服務器會分析此信息,并通知工具 (‘textDocument/publishDiagnostics’) 檢測到的錯誤和警告,并且還可能返回一些可能的用于補全的內容
- 用戶對編輯器中的符號執行“轉到定義”:該工具發送具有兩個參數的“textDocument/definition”請求: (1) 文檔 URI, (2) 從服務器啟動 Go to Definition 請求的文本位置。 服務器使用文檔 URI 和符號定義在文檔中的位置進行響應。客戶端接到返回后,根據服務器標記的位置進行跳轉
- 用戶關閉文檔 (文件) :工具發送“textDocument/didClose”通知,通知語言服務器文檔現在不再處于內存中,并且將當前內容保存到文件系統中。
treesitter 配置
我們簡單介紹過 neovim-treesitter 這個插件,它可以用來做代碼高亮。它采用 lsp 協議實現,比起單純使用正則表達式來說,它具有更好的渲染效果。那么我們體驗 lsp 效果的第一步就來配置它吧。
treesitter 想要工作,需要根據語言下載配套語言對應的語法解析模塊,我們可以使用 :TSInstallInfo 來查看當前我們安裝了哪些解析模塊。
我們發現并沒有安裝任何的模塊,基于當前配置文件的工程,我們先來體驗一下 lua 的效果。
我們使用 :TSInstall <language>的命令可以下載指定語言的模塊。這里我們使用 :TSInstall lua 來下載lua模塊。后續我們可以使用 :TSUpdate lua 來更新該模塊。跟 packer 類似的 :TSUpdate 即可以用來下載也可以用來更新。也就是一條命令就搞定了
安裝完成之后我們可以使用 :TSBufToggle highlight 來使用 treesitter 進行高亮
如果我們每次都需要手工調用命令來進行高亮的話,就太不智能了。我們可以在配置文件中配置它自動加載語法高亮。
我們來一條條的解釋這些配置
ensure_installed 表示需要支持哪些語言,如果里面設置了某些語言,那么在啟動之后它會自動調用 :TSUpdate 來下載和更新對應語言的 server 部分。
等它下載完了對應的語言模塊之后,我們發現它已經很好的完成了代碼著色的功能。
增量選擇可以一次選擇一塊的代碼,依次擴大或者縮小所選擇的語言塊,我們使用回車來開始和擴大增量選擇,使用退格鍵來減少增量選擇代碼塊。各位小伙伴可以根據自己的習慣來定義快捷鍵
另外我們可以使用 = 來格式化代碼。為了方便我們定義自動命令,每當執行 :w 寫入前前自動格式化代碼
這里因為提前使用了 gg改變了光標位置,在格式化之后使用 `` 來回到上次跳轉之前的位置。
最后我們可以使用 zc 和 zo 來折疊和展開代碼。不過我自己很少用,需要查看文件中的符號例如函數、變量等我可以使用其他插件來解決,如果要成塊的跳轉代碼我比較喜歡使用 %。
好了,到此為止我們先體驗了一下基于 lsp 實現的 treesitter 的功能,后面將展開講述 lsp 對一些語言的支持,敬請期待
總結
以上是生活随笔為你收集整理的从零开始配置vim(22)——lsp简介与treesitter 配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 找不到可插入的ISAM
- 下一篇: 人口普查也是一个超大的“用户画像”。