從零開始配置vim(25)——關(guān)于 c++ python 的配置

從9月份到國慶這段時(shí)間,因?yàn)榈昧伺畠海谑腔乩霞規(guī)兔α侠砑沂乱约芭惆槔掀藕团畠骸R粫r(shí)之間無暇顧及該系列教程的更新。等我回來的時(shí)候發(fā)現(xiàn)很多小伙伴私信我催更。在這里向支持本人這一拙劣教程的各位小伙伴表示真誠的感謝。言歸正傳,讓我們開始吧

之前我們根據(jù)lua語言配置了基于lsp的代碼高亮、自動(dòng)跳轉(zhuǎn)、自動(dòng)補(bǔ)全等等功能,那個(gè)時(shí)候我們安裝了很多插件,像 nvim-lspconfig、nvim-lsp-installernvim-cmp等等,每個(gè)插件都在干嘛,雖然我們配置好了 lua相關(guān)的內(nèi)容,但是可能仍然有小伙伴有疑問,碰到其他語言該如何配置,是不是要重新下載對(duì)應(yīng)的插件呢?為了解答這些問題,這篇文章我們將要來根據(jù) c++和 python的日常習(xí)慣來進(jìn)行配置,給大家演示一下在上述內(nèi)容都配置完成之后面對(duì)其他語言我們該如何進(jìn)行處理

安裝配置 c++ 相關(guān)的lsp服務(wù)

關(guān)于c++ 的服務(wù),我們根據(jù) nvim-lsp-installer 官方給出的表格中顯示它可以使用 cclsclang,這里我們以 ccls 作為示例進(jìn)行講解。

首先通過命令安裝 :LspInstall ccls

接著我們新建一個(gè) ftplugin/c.luaftplugin/cpp.lua 來配置 c/c++ 。不過他們兩個(gè)采用相同的配置,我們暫時(shí)將一份配置復(fù)制兩遍

require("lsp/cpp")

他們的作用只有一個(gè),那就是加載 lsp/cpp 這個(gè)文件,我們將他們的配置放到一個(gè)文件中

然后我們再在 lua/lsp/cpp.lua 文件中加入以下內(nèi)容用于啟動(dòng) lsp服務(wù)端

local lspconfig = require('lspconfig')
lspconfig.ccls.setup {
  init_options = {
    cache = {
      directory = ".ccls-cache";
    };
  }
}

我們進(jìn)入一個(gè) .c/.cpp 文件發(fā)現(xiàn)已經(jīng)加載了 ccls 了。如果沒有加載可以使用 :LspStart 命令手工加載或者使用 LspInfo 查看是否有問題

1.gif

現(xiàn)在我們已經(jīng)可以看到lsp服務(wù)給出的提示了

修改之前的配置

我們在第22篇文章中給出了基于 lsplua 的配置,主要是使用 lsp 服務(wù)端的配置和對(duì)應(yīng)的跳轉(zhuǎn)之類的快捷鍵配置,我們將它放到了 lsp/lua.lua 目錄下了。但是一想想我們使用 c++Python 或者其他什么語言的時(shí)候,這些快捷鍵應(yīng)該是不會(huì)修改的,這個(gè)時(shí)候自然就想到了要重用快捷鍵了。所以來配置之前的第一件事就是想辦法重用這些快捷鍵。

這個(gè)時(shí)候我們想到的辦法就是將之前定義的快捷鍵封裝成函數(shù),然后在 on_attach 的回調(diào)函數(shù)中調(diào)用該函數(shù)。我們將那些快捷鍵定義放到 lua/keybindings.lua

local lsp_keybinds = {}
lsp_keybinds.set_keymap = function (bufnr)
    -- 跳轉(zhuǎn)到聲明
    vim.api.nvim_buf_set_keymap(bufnr, "n", "gd", "<cmd>lua vim.lsp.buf.declaration()<CR>", {silent = true, noremap = true})
    -- 跳轉(zhuǎn)到定義
    vim.api.nvim_buf_set_keymap(bufnr, "n", "gD", "<cmd>lua vim.lsp.buf.definition()<CR>", {silent = true, noremap = true})
    -- 顯示注釋文檔
    vim.api.nvim_buf_set_keymap(bufnr, "n", "gh", "<cmd>lua vim.lsp.buf.hover()<CR>", {silent = true, noremap = true})
    -- 跳轉(zhuǎn)到實(shí)現(xiàn)
    vim.api.nvim_buf_set_keymap(bufnr, "n", "gi", "<cmd>lua vim.lsp.buf.implementation()<CR>", {silent = true, noremap = true})
    -- 跳轉(zhuǎn)到引用位置
    vim.api.nvim_buf_set_keymap(bufnr, "n", "gr", "<cmd>lua vim.lsp.buf.references()<CR>", {silent = true, noremap = true})
    -- 以浮窗形式顯示錯(cuò)誤
    vim.api.nvim_buf_set_keymap(bufnr, "n", "go", "<cmd>lua vim.diagnostic.open_float()<CR>", {silent = true, noremap = true})
    vim.api.nvim_buf_set_keymap(bufnr, "n", "gp", "<cmd>lua vim.diagnostic.goto_prev()<CR>", {silent = true, noremap = true})
    vim.api.nvim_buf_set_keymap(bufnr, "n", "gn", "<cmd>lua vim.diagnostic.goto_next()<CR>", {silent = true, noremap = true})
end
return lsp_keybinds

我們將它打包到lsp_keybinds 模塊中作為 keybinds.lua 文件的導(dǎo)出模塊。然后在 lsp/lua.lua文件的 on_attach 函數(shù)中調(diào)用這個(gè)函數(shù)完成快捷鍵的配置工作

local lsp_set_keymap = require("keybindings")                     
local on_attach = function(_, bufnr)
    lsp_set_keymap.set_keymap(bufnr)
end

現(xiàn)在我們就完成了 c/c++ 相關(guān)的配置

2.gif

嘗試一下綁定的那些快捷鍵,發(fā)現(xiàn)它可以正常進(jìn)行跳轉(zhuǎn)

是不是很簡單了,我們沒有安裝任何的插件,只是安裝了 c++ lsp 的服務(wù)端。剩下的配置依然延續(xù)之前的就好了

python 相關(guān)配置

我們再來以 python 的配置作為例子來講lsp的配置。python 的服務(wù)端我們采用 pyright 。還有一個(gè)方法可以安裝 lsp 服務(wù)。我們可以在命令模式中輸入 :LspInstallInfo 查看當(dāng)前已安裝的 lsp 服務(wù)。下面會(huì)列出一堆的未安裝的 lsp 服務(wù)。這個(gè)時(shí)候我們可以將光標(biāo)移動(dòng)到某個(gè)服務(wù)上,按下 i 來安裝該服務(wù)。

3.gif

這里我提前已經(jīng)安裝好了,所以它顯示在 Installed Server 中,沒有安裝它應(yīng)該顯示在下方的Available Server 列表中。

安裝完成之后我們還是按照慣例,在 ftplugin 目錄下建立一個(gè) python.lua 文件并且在該文件中加載 lua/lsp/python.lua 文件

我們在 lua/lsp/python.lua 文件中加入下面的代碼

local lsp_set_keymap = require("keybindings")
local util = require 'lspconfig/util'

require('lspconfig').pyright.setup{
    on_attach = function(_, bufnr)
        lsp_set_keymap.set_keymap(bufnr)
    end,
    cmd = { "pyright-langserver", "--stdio" },
    filetypes = { "python" },
    settings = {
        python = {
            analysis = {
                autoSearchPaths = true,
                diagnosticMode = "workspace",
                useLibraryCodeForTypes = true,
                typeCheckingMode = "off"
            },
        },
    },
    root_dir = function(fname)
        local root_files = {
            'pyproject.toml',
            'setup.py',
            'setup.cfg',
            'requirements.txt',
            'Pipfile',
            'pyrightconfig.json',
        }
        return util.root_pattern(unpack(root_files))(fname) or util.find_git_ancestor(fname) or util.path.dirname(fname)
    end,
}

前面的配置與 c++ 的配置類似。主要設(shè)置快捷鍵,這里需要注意的是 root_dir 這里的配置,想要在對(duì)應(yīng)緩沖中啟動(dòng)相應(yīng)的 lsp 服務(wù),需要buffer處在對(duì)應(yīng)語言的項(xiàng)目中,root_dir 規(guī)定在 buffer 所在目錄中存在這些文件或者目錄時(shí)將該目錄作為對(duì)應(yīng)項(xiàng)目文件

如果我們不加該配置,可能會(huì)導(dǎo)致lsp 服務(wù)啟動(dòng)失敗。如果失敗的話我們使用 :LspInfo 來查看失敗原因

4.gif

這個(gè)根目錄設(shè)置是可以作用于它下面所有子目錄的。這里我根據(jù) python 中常用文件給出了一個(gè)列表,各位小伙伴可以根據(jù)自己的需求自行添加
另外需要注意的一個(gè)問題時(shí),pyright 依賴于 nodework_threads 模塊,該模塊從12版本以后才被支持,如果小伙伴的 node 版本低于該版本需要考慮升級(jí) node

5.gif

根據(jù)這兩個(gè)例子,相信各位已經(jīng)熟悉了該如何配置不同語言的 lsp 服務(wù)了。這里面沒有什么深?yuàn)W的代碼,也沒有什么個(gè)性化到只有自己才會(huì)用的配置,希望能起到拋磚引玉的作用,后面再碰到什么其他語言小伙伴們應(yīng)該可以很容易的添加它的lsp服務(wù)了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,444評(píng)論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,948評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,185評(píng)論 0 287
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,794評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評(píng)論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,414評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,750評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容