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

從9月份到國慶這段時間蹂随,因為得了女兒,于是回老家?guī)兔α侠砑沂乱约芭惆槔掀藕团畠骸R粫r之間無暇顧及該系列教程的更新腋逆。等我回來的時候發(fā)現(xiàn)很多小伙伴私信我催更。在這里向支持本人這一拙劣教程的各位小伙伴表示真誠的感謝侈贷。言歸正傳惩歉,讓我們開始吧

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

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

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

首先通過命令安裝 :LspInstall ccls

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

require("lsp/cpp")

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

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

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

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

1.gif

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

修改之前的配置

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

這個時候我們想到的辦法就是將之前定義的快捷鍵封裝成函數(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)到實現(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})
    -- 以浮窗形式顯示錯誤
    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)用這個函數(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 。還有一個方法可以安裝 lsp 服務(wù)吉捶。我們可以在命令模式中輸入 :LspInstallInfo 查看當(dāng)前已安裝的 lsp 服務(wù)夺鲜。下面會列出一堆的未安裝的 lsp 服務(wù)皆尔。這個時候我們可以將光標(biāo)移動到某個服務(wù)上,按下 i 來安裝該服務(wù)币励。

3.gif

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

安裝完成之后我們還是按照慣例砌们,在 ftplugin 目錄下建立一個 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 這里的配置,想要在對應(yīng)緩沖中啟動相應(yīng)的 lsp 服務(wù)昔头,需要buffer處在對應(yīng)語言的項目中饼问,root_dir 規(guī)定在 buffer 所在目錄中存在這些文件或者目錄時將該目錄作為對應(yīng)項目文件

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

4.gif

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

5.gif

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淆两,一起剝皮案震驚了整個濱河市断箫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秋冰,老刑警劉巖仲义,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剑勾,居然都是意外死亡埃撵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門甥材,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盯另,“玉大人,你說我怎么就攤上這事洲赵≡Ч撸” “怎么了商蕴?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芝发。 經(jīng)常有香客問我绪商,道長,這世上最難降的妖魔是什么辅鲸? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任格郁,我火速辦了婚禮,結(jié)果婚禮上独悴,老公的妹妹穿的比我還像新娘例书。我一直安慰自己,他們只是感情好刻炒,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布决采。 她就那樣靜靜地躺著,像睡著了一般坟奥。 火紅的嫁衣襯著肌膚如雪树瞭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天爱谁,我揣著相機(jī)與錄音晒喷,去河邊找鬼。 笑死访敌,一個胖子當(dāng)著我的面吹牛凉敲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捐顷,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼荡陷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了迅涮?” 一聲冷哼從身側(cè)響起废赞,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叮姑,沒想到半個月后唉地,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡传透,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年耘沼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朱盐。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡群嗤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兵琳,到底是詐尸還是另有隱情狂秘,我是刑警寧澤骇径,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站者春,受9級特大地震影響破衔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钱烟,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一晰筛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拴袭,春花似錦读第、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羊瘩。三九已至泰佳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尘吗,已是汗流浹背逝她。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留睬捶,地道東北人黔宛。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像擒贸,于是被迫代替她去往敵國和親臀晃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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