nvim 打造成可用的IDE(1)

文章讲述了作者在Ubuntu虚拟机中安装中文输入法(ibus),解决VSCode中文输入问题,配置NVIM及LSP插件的过程,包括遇到的错误和解决步骤。
摘要由CSDN通过智能技术生成

可以参考的第三方使用者的 源码信息。

1 GitHub - ravenxrz/dotfiles: My dotfiles       敲代码的脱发水kacm

GitHub - eggtoopain/Neovim-Configuration-Tutorial  技术蛋老师

3 GitHub - theniceboy/nvim: The Ultimate NeoVim Config for Colemak Users       theCW

kana

4  https://github.com/yongtenglei/Neovim-QWERT      if_fish

https://github.com/FledgeXu/NeovimZero2Hero   从平凡到非凡

GitHub - youngxhui/nvim

6     https://github.com/jinzhongjia/neovim-config    云翼之影

最近有发现 几个使用 neovim 比较厉害的人。

1 首先是配置好虚拟机,开了一个新的虚拟机。

接下里安装中文输入法:

重启

再重启。

最终发现,没有中文输入法, 不挣扎了。不用fcitx框架了。

直接再界面傻瓜式安装ibus .

我又重新,建立了一个虚拟机,这回,直接安装 ibus 不用 fctx 了。

先 安装这个。

这样就对了。就是这两步

可以了。

设置访问 外网,nvim 安装插件可能会用到。

测试一下:

安装ssh.为了使用mobaxterm

对配置文件进行修改。

测试一下。

添加一个 Ubuntu 虚拟机中安装 vscode

问题: 我在虚拟机中安装了中文输入法,但是在vscode 中无法使用。

1 去官网 下载一个 deb 包。

2 到下载安装包的目录 使用 dpkg 命令进行安装。

但是出现如下错误。

这应该是 ubuntu 的版本与 我下载的vscode 的版本不一致导致的。

我决定重新安装一下 ubuntu 虚拟机。

2 安装nvim

使用apt 命令来安装。

文件下添加:

-- Hint: use `:h <option>` to figure out the meaning if needed
vim.opt.clipboard = 'unnamedplus' -- use system clipboard
vim.opt.completeopt = { 'menu', 'menuone', 'noselect' }
vim.opt.mouse = 'a' -- allow the mouse to be used in Nvim

-- Tab
vim.opt.tabstop = 4 -- number of visual spaces per TAB
vim.opt.softtabstop = 4 -- number of spacesin tab when editing
vim.opt.shiftwidth = 4 -- insert 4 spaces on a tab
vim.opt.expandtab = true -- tabs are spaces, mainly because of python

-- UI config
vim.opt.number = true -- show absolute number
vim.opt.relativenumber = true -- add numbers to each line on the left side
vim.opt.cursorline = true -- highlight cursor line underneath the cursor horizontally
vim.opt.splitbelow = true -- open new vertical split bottom
vim.opt.splitright = true -- open new horizontal splits right
-- vim.opt.termguicolors = true        -- enabl 24-bit RGB color in the TUI
vim.opt.showmode = false -- we are experienced, wo don't need the "-- INSERT --" mode hint

-- Searching
vim.opt.incsearch = true -- search as characters are entered
vim.opt.hlsearch = false -- do not highlight matches
vim.opt.ignorecase = true -- ignore case in searches by default
vim.opt.smartcase = true -- but make it case sensitive if an uppercase is entered

添加:

require('options')       

3

接下里是直接使用 网上的nvim 的配置的尝试。,目前,我这里是 0.4.3.

首先要更新 nvim , 删除 之前安装nvim

官网上下载 压缩包。

zai 

解压压缩包。解压在了这个目录下

创建一个软连接。

测试:

疑问: 不知道 配置的目录是不是 ~/.config/nvim 目录下。

更新流程完毕。

直接拷贝别人的配置进行测试。

首先 移除之前安装的 nvim 链接。

GitHub - ravenxrz/dotfiles: My dotfiles

在家目录.config 下  下载别人的配置

执行 ./install 进行安装

有报错

它的前提是必须要有 nvim .

所以提前  再次建立 nvim 的软连接。

事实证明无法使用,跟他的教程也不一样。

所以老老实实的从零去配置nvim ,不跟着它的教程走了。

在.config 目录下的结构。

    

keymaps.lua 是改建的信息。

options.lua 是基本的一些配置。

事实证明,我是用压缩包解压的方式,也是可以使用 ~/.config 来对nvim 进行配置的。

options.lua

local opt = vim .opt

--行号
opt.relativenumber = true
opt.number = true


--缩进
opt.tabstop = 4
opt.shiftwidth = 4
opt.expandtab = true
opt.autoindent = true
local opt = vim .opt

--行号
opt.relativenumber = true
opt.number = true


--缩进
opt.tabstop = 4
opt.shiftwidth = 4
opt.expandtab = true
opt.autoindent = true


--防止包裹
opt.wrap = false

--光标行
opt.cursorline = true


--鼠标
opt.mouse:append("a")


--系统剪切板
opt.clipboard:append("unnamedplus")


--默认新的分割窗口
--
opt.splitright = true
opt.splitbelow = true

--不区分大小写
--
opt.ignorecase = true
opt.smartcase = true

--外观

opt.termguicolors = true
opt.signcolumn = "yes"



--防止包裹
opt.wrap = false

--光标行
opt.cursorline = true


--鼠标
--opt.mouse:append("a")


--系统剪切板
opt.clipboard:append("unnamedplus")


--默认新的分割窗口
--
opt.splitright = true
opt.splitbelow = true

--不区分大小写
--
opt.ignorecase = true
opt.smartcase = true

--外观

opt.termguicolors = true
opt.signcolumn = "yes"

keymaps 的设置

--设置主键
vim.g.mapleader = " "
local keymap = vim.keymap 
--设置分割窗口的快捷建  模式-要改成的键-之前的按键 
keymap.set("n","<leader>sv","<C-w>v")
keymap.set("n","<leader>sh","<C-w>h")


此时我无法使用 ubuntu 系统剪切板到nvim , 但是vim 可以 ,所以使用vim 来粘贴PC中的东西。

在这里加上 关于neovim 的一些基本的是用方法。

首先是关于撤销的问题, u 是撤销, crtl+r 是在 撤销 撤销。这个其实我是可以改成U的。大写的U代表着对这一行所有的操作的撤销,所以不能这么改建。

对于跳转,如果是 大写的 W,B的话,会讲空格作为判断,如果是小写的 w,b 的话,会将标点符号作为判断标准。

nvim----> check health  可以检查 nvim 的 worning 

绝对的跳转    , nG,向后跳, ngg , 向前跳

相对的跳转,    ngj, 向下跳, ngk ,向前跳

在 config 中   vim.cmd("nohlseach") ,  这句命令代表着,每次打开neovim 都会执行,这样,如果上次 使用了搜索高亮,那么下次再打开的时候,就不会有高亮了。

        

接下来设置 packer.

packer 的github 官网

GitHub - wbthomason/packer.nvim: A use-package inspired plugin manager for Neovim. Uses native packages, supports Luarocks dependencies, written in Lua, allows for expressive config

我的操作

引用这个文件

再次进入 plugins-setup.lua 文件

可以看到这个画面

安装一个主题插件

https://github.com/folke/tokyonight.nvim

packer.sync

接着 去option.lua 设置基本的配置。

可以看到 颜色已经改变了。

开始安装状态栏

GitHub - nvim-lualine/lualine.nvim: A blazing fast and easy to configure neovim statusline plugin written in pure lua.

使用方法

开始进行配置

在init.lua 文件中引用

这是配置文件。

这里状态栏安装完之后,会出现乱码

这里的原因是字体不对,

解决方法:

1 首先安装字体。

网上的方法:

下载字体

wget https://github.com/ryanoasis/nerd-fonts/releases/download/v2.1.0/DroidSansMono.zip

解压到一个随便的目录

unzip DroidSansMono.zip -d ~/.fonts

将解压的字体,放到/usr/share/fonts 目录下

sudo cp ~/Downloads/*.ttf /usr/share/fonts
fc-cache -fv

查看支持的字体。

fc-list | grep "<name-of-font>"

疑问: 我下载的字体,有的可以支持,但是有的在支持列表里就没有

2 其次设置为指定的字体。

问题解决了。

开始安装nvim tree

GitHub - nvim-tree/nvim-tree.lua: A file explorer tree for neovim written in lua

安装成功

进行配置

我自己的配置。

配置 init.lua

改建

关于 nvim-tree 的所有的 使用方法 ,都在 官方的文档中。

-------------------------------------------------------------------------------------------------------------------------------

接下来设置 窗口管理器

GitHub - christoomey/vim-tmux-navigator: Seamless navigation between tmux panes and vim splits

测试一下。

接下来是语法高亮 ,treesiter

GitHub - nvim-treesitter/nvim-treesitter: Nvim Treesitter configurations and abstraction layer

官方配置。

我自己的配置。

配置init.lua

报错。

安装 gcc.

再次打开,下面再安装。

去掉help

再次打开,下面不报错了。

接下俩安装 括号不同颜色的插件, nvim-ts-ranbow

GitHub - p00f/nvim-ts-rainbow: Rainbow parentheses for neovim using tree-sitter. Use https://sr.ht/~p00f/nvim-ts-rainbow instead

我的安装

进行配置

官方的配置。

我的配置。

结果:

接下来 安装 lsp 插件

mason.nvim

https://github.com/williamboman/mason.nvim

mason.lspconfig

https://github.com/williamboman/mason-lspconfig.nvim

nvim-lspcofig

https://github.com/neovim/nvim-lspconfig

需要安装这三个插件。

接下里配置 mason 插件

配置自动不全的插件。

nvim-cmp  , 一般的lua 不全插件

https://github.com/hrsh7th/nvim-cmp

cmp-nvim-lsp  , 没看明白啥意思

GitHub - hrsh7th/cmp-nvim-lsp: nvim-cmp source for neovim builtin LSP client

LuaSnip  , 可以补全注释的。

https://github.com/L3MON4D3/LuaSnip

cmp_luasnip   , 没看明白啥意思。

https://github.com/saadparwaiz1/cmp_luasnip

cmp_path , 补全路径的。

https://github.com/hrsh7th/cmp-path/

frendly-snippets   , 这应该是不同语言的集合。

https://github.com/rafamadriz/friendly-snippets

安装一下。

有报错。

先注释一下配置。

不报错了。

再去安装一下。

改一下路径。

再安装一下,可以了。

接下来再去使能一下 配置文件。

现在 再使能 发现不会报错了。

接下来配置自动补全的配置。

上面所添加的所有的补全的插件应该都要 配置一遍

在 阿里云 debian 系统上升级 nvim 遇到的问题。

上传了 nvim 的压缩包之后, 显示

为了解决这个问题,下载 glibc2.9 版本,并且编译。

解决这个报错: 

apt install gawk

apt install bison

cd build

../cofigure --prefix=/root/install

我重新复制一下

做测试

这里最好加上tmux

接下来就是从新设置nvim ,最好是打造成 开箱即用的那种。

首先是 基本的设置。

然后是改建的设置。
然后是 安装packer

对于packer 的安装,就是直接 复制 官网的配置就行。

6
   45 local ensure_packer = function()
   44   local fn = vim.fn
   43   local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim'
   42   if fn.empty(fn.glob(install_path)) > 0 then
   41     fn.system({'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path})
   40     vim.cmd [[packadd packer.nvim]]
   39     return true
   38   end
   37   return false
   36 end
   35
   34 local packer_bootstrap = ensure_packer()
   33
   32
   31
   30 -- 从这里开始安装插件
   29 return require('packer').startup(function(use)
   28 --nvim tree
   27 use {
   26   'nvim-tree/nvim-tree.lua',
   25   requires = {
   24     'nvim-tree/nvim-web-devicons', -- optional
   23   },
   22 }
   21
   20 -- telescope
   19 use {
   18   'nvim-telescope/telescope.nvim', tag = '0.1.6',
   17 -- or                            , branch = '0.1.x',
   16   requires = { {'nvim-lua/plenary.nvim'} }
   15 }
   14
   13
   12
   11
   10   use 'wbthomason/packer.nvim'
    9   -- My plugins here
    8   -- use 'foo1/bar1.nvim'
    7   -- use 'foo2/bar2.nvim'
    6
    5   -- Automatically set up your configuration after cloning packer.nvim
    4   -- Put this at the end after all plugins
    3   if packer_bootstrap then
    2     require('packer').sync()
    1   end
  49  end)

---------------------------------------------------------------------------------------------------------------------------------如何在 nvim 中 ,实现 visula 的高亮。

-- 这样是不行的。
    6 --vim.api.nvim_set_hl(0, 'Visual',{fg = '#ffffff',style = 'none',gui='bold' })


    5 --必须这样设置
    4 vim.api.nvim_set_hl(0, 'Visual', { fg = nil, bg = '#ff0000' })

效果:

还是参数设置的问题。

--------------------------------------------------------------------------------------------------------------------------

关于插件配置的模板

就以 bufferline 为例子。

c

返回的 是 一些环境变量+依赖+设置函数。

return {
    1
    2
    3   -- 这是一些依赖的说明
    4   "akinsho/bufferline.nvim",
    5   event = { "BufReadPre", "BufNewFile" },
    6   dependencies = { "nvim-tree/nvim-web-devicons" },
    7
    8
    9
   10 -- 一个函数
   11   config = function()
   12     local status, _ = pcall(require, "bufferline")
   13     if not status then
   14       return
   15     end
   16
   17 -- 这是环境变量
   18     vim.api.nvim_set_keymap("n", "gb", "<Cmd>BufferLinePick<CR>", { noremap = true, silent = true })
   19     vim.opt.termguicolors = true
   20
   21
   22
   23 --对插件的配置
   24     require("bufferline").setup({
   25       options = {
   26         number = "none",
   27         --number_style = "superscript" | "subscript" | "" | { "none", "subscript" }, -- buffer_id at index 1, ordinal at index 2
   28         --number_style =  "subscript",
   29         modified_icon = "✥",
   30         buffer_close_icon = "󰅖",
   31         close_icon = "
",
   32         left_trunc_marker = "�",
   33         right_trunc_marker = "�",
   34         max_name_length = 14,
   35         max_prefix_length = 13,
   36         tab_size = 20,
   37         show_buffer_close_icons = true,
   38         show_buffer_icons = true,
   39         show_tab_indicators = true,
   40         --diagnostics = "coc",
   41         diagnostics = "nvim_lsp",
   42         always_show_bufferline = true,
   43         separator_style = "thin",
   44         offsets = {
   45           {
   46             filetype = "NvimTree",
   47             text = "File Explorer",
   48             text_align = "center",
   49             padding = 1,
   50           },
   51         },
   52       },
   53     })
   6
    5   end,
    4
    3 }
    2

--------------------------------------------------------------------------------------------------------------------------

关于bufferline 的配置

参考官网。

开始配置。

这是 bufferline.lua

return {
    1
    2
    3   -- 这是一些依赖的说明
    4   "akinsho/bufferline.nvim",
    5   event = { "BufReadPre", "BufNewFile" },
    6   dependencies = { "nvim-tree/nvim-web-devicons" },
    7
    8
    9
   10 -- 一个函数
   11   config = function()
   12     local status, _ = pcall(require, "bufferline")
   13     if not status then
   14       return
   15     end
   16
   17 -- 这是环境变量
   18     vim.api.nvim_set_keymap("n", "gb", "<Cmd>BufferLinePick<CR>", { noremap = true, silent = true })
   19     vim.opt.termguicolors = true
   20
   21
   22
   23 --对插件的配置
   24     require("bufferline").setup({
   25       options = {
   26         number = "none",
   27         --number_style = "superscript" | "subscript" | "" | { "none", "subscript" }, -- buffer_id at index 1, ordinal at index 2
   28         --number_style =  "subscript",
   29         modified_icon = "✥",
   30         buffer_close_icon = "󰅖",
   31         close_icon = "
",
   32         left_trunc_marker = "�",
   33         right_trunc_marker = "�",
   34         max_name_length = 14,
   35         max_prefix_length = 13,
   36         tab_size = 20,
   37         show_buffer_close_icons = true,
   38         show_buffer_icons = true,
   39         show_tab_indicators = true,
   40         --diagnostics = "coc",
   41         diagnostics = "nvim_lsp",
   42         always_show_bufferline = true,
   43         separator_style = "thin",
   44         offsets = {
   45           {
   46             filetype = "NvimTree",
   47             text = "File Explorer",
   48             text_align = "center",
   49             padding = 1,
   50           },
   51         },
   52       },
   53     })
   6
    5   end,
    4
    3 }
    2

然后在 init.lua 中进行设置。

require("core.options")
    1 require("core.keymaps")
    2 require("plugins.plugins-setup")
    3 require("plugins.nvim-tree")
    4 require("plugins.telescope")
    5 require("plugins.bufferline").config()

注意: 在 tmux 的其他的窗口中打开的 nvim 是没有 buffer 的。

只有在 一个窗口中,通过 nvim 打开的串口 才会有 buffer 。

问题:  这里 我在 某一个 buffer 里面的时候, 没有高亮的显示。

还有一个问题: 就是 当前的buffer 不会显示 标号,是一个乱码

--------------------------------------------------------------------------------------------------------------------------

关于自动注释的插件的配置。

这个插件不用配置。

空格+cc 注释,  空格+cu 反注释。

---------------------------------------------------------------------------------------------------------------------------------

关于lastplace 的安装。

安装

配置


   20 return {
   19
   18
   17
   16
   15
   14 -- 一个函数
   13   config = function()
   12     local status, _ = pcall(require, "lastplace2")
   11     if not status then
   10       return
    9     end
    8
    7 -- 这是环境变量
    6
    5
    4
    3 --对插件的配置
    2
    1 require'lastplace2'.setup {
  22      lastplace_ignore_buftype = {"quickfix", "nofile", "help"},
    1     lastplace_ignore_filetype = {"gitcommit", "gitrebase", "svn", "hgcommit"},
    2     lastplace_open_folds = true
    3 }
    4
    5
    6 -- 这是之前的
    7
    8   end,
    9
   10 }

引用

require("core.options")
    1 require("core.keymaps")
    2 require("plugins.plugins-setup")
    3 require("plugins.nvim-tree")
    4 require("plugins.telescope")
    5 require("plugins.bufferline").config()
    6 require("plugins.lastplace2").config()
~

问题 : 我这边测试, 除了 lua 文件,其他的文件都是可以的。

-------------------------------------------------------------------------------------------------------------------------------

关于自动 格式化插件的安装

主要是 treesitter 插件。

安装:

配置:



return {

-- 一个函数
  config = function()
    local status, _ = pcall(require, "nvim-treesitter")
    if not status then
      return
    end

-- 这是环境变量

  --关于代码折叠
  vim.wo.foldmethod = 'expr'
  vim.wo.foldexpr = 'v:lua.vim.treesitter.foldexpr()'




--对treesitter插件的配置
--
require'nvim-treesitter.configs'.setup {
  -- A list of parser names, or "all" (the listed parsers MUST always be installed)
  ensure_installed = { "c", "lua", "vim", "vimdoc", "query", "markdown", "markdown_inline" },

  -- Install parsers synchronously (only applied to `ensure_installed`)
  sync_install = false,

  -- Automatically install missing parsers when entering buffer
  -- Recommendation: set to false if you don't have `tree-sitter` CLI installed locally
  auto_install = true,

  -- List of parsers to ignore installing (or "all")
  ignore_install = { "" },

  ---- If you need to change the installation directory of the parsers (see -> Advanced Setup)
  -- parser_install_dir = "/some/path/to/store/parsers", -- Remember to run vim.opt.runtimepath:append("/some/path/to/store/parsers")!

  highlight = {
    enable = true,

    -- NOTE: these are the names of the parsers and not the filetype. (for example if you want to
    -- disable highlighting for the `tex` filetype, you need to include `latex` in this list as this is
    -- the name of the parser)
    -- list of language that will be disabled
    disable = {},
    -- Or use a function for more flexibility, e.g. to disable slow treesitter highlight for large files
    disable = function(lang, buf)
        local max_filesize = 100 * 1024 -- 100 KB
        local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf))
        if ok and stats and stats.size > max_filesize then
            return true
        end
    end,

    -- Setting this to true will run `:h syntax` and tree-sitter at the same time.
    -- Set this to `true` if you depend on 'syntax' being enabled (like for indentation).
    -- Using this option may slow down your editor, and you may see some duplicate highlights.
    -- Instead of true it can also be a list of languages
    additional_vim_regex_highlighting = false,
  },



  -- 关于自动缩进
    indent = {
    enable = true
  },


  --关于增量选择
    incremental_selection = {
    enable = true,
    keymaps = {
      init_selection = "gnn", -- set to `false` to disable one of the mappings
      --node_incremental = "grn",
      node_incremental = "<CR>",
      scope_incremental = "grc",
      --node_decremental = "grm",
      node_decremental = "<BS>",
    },
  },

}



-- 这是之前的

  end,

}



引用:

需要注意的点: 

1 我的 高亮是没有效果的,高亮的不够。

2 代码的折叠式可以使用的。

事实证明是这样的,

这是我的改建。

关于代码 格式化也是 可以使用的,

首先选中 代码, 然后使用 = 号 就可以格式化。

--------------------------------------------------------------------------------------------------------------------------------

然后是关于主题的安装。

kanagawa

关于安装

关于配置。


return {

-- 一个函数
  config = function()
    local status, _ = pcall(require, "nvim-lastplace")
    if not status then
      return
    end

-- 这是环境变量



--对插件的配置

require'nvim-lastplace'.setup {
    lastplace_ignore_buftype = {"quickfix", "nofile", "help"},
    lastplace_ignore_filetype = {"gitcommit", "gitrebase", "svn", "hgcommit"},
    lastplace_open_folds = true
}


-- 这是之前的

  end,

}



关于引用

发现: 安装上主题之后,我发现 treesitter 的语法高亮可以了。

------------------------------------------------------------------------------------------------------------------

目前遇到一个问题:

1 搜索的时候,有高亮,回车之后高亮消失。

2 visual 选中不正常,但是这个能够解决:

加上一句这个,所以kanagawa , 哪里的配置 导致了, visual 选中没有颜色。

------------------------------------------------------------------------------------------------------------------------

遇到一个问题: 在使用 vim 的时候 粘贴的时候 ,格式是乱的。

解决方法: :set paste 之后 在粘贴就可以了。

粘贴完之后, 在  :set nopaste 设置回去。

但是我并没有在 nvim 中这样设置, 我也不清楚,nvim 时候也会出现这样的情况,出现了再说。

具体原因不清楚。

在网上搜了一下大致的解释。

--------------------------------------------------------------------------------------------------------------------------

ndent-blankline.nvim, 可以在格式上加上竖线。

安装:

配置。

引用:

结果:

---------------------------------------------------------------------------------------------------------------------------------

关于格式化的插件。

其实格式化不需要插件的,在lsp 中就有格式化的。

安装好 lsp 之后, 打开一个文件,全选, 按 = 号, 就会自动格式化。

----------------------------------------------------------------------------------------------------------------------------

对于 illuminaete 的安装, 这个插件,可以 高亮 光标所在的 单词,相当于 搜索了。

安装:

配置:

由于官方的配置的原因,这里 没有配置文件,但是其实也是可以有的。

引用:

一些设置:

为了, 在光标下有颜色,我做了一些设置。

结果:

------------------------------------------------------------------------------------------------------------------------------

关于nerd fond 的配置。

下载

 wget https://github.com/ryanoasis/nerd-fonts/releases/download/v3.2.1/FiraCode.zip

拷贝到固定的位置。

然后刷新

 fc-cache -fv

重启

------------------------------------------------------------------------------------------------------------------------------

这里遇到一个报错: glibc_2.29

解决方法: 

编译生成  libm-2.29  然后创建一个链接

网上的资料

结果: 

---------------------------------------------------------------------------------------------------------

问题: nvim  在shell中 与在tmux 中颜色显示不一致,,主要表现是,在tmux 中,nvim 搜索没有高亮,并且没有主题。

解决方法:

在 .tmux.config 中加入:

set -g default-terminal "screen-256color"
 

并且在启动的时候  

alias tmux="TERM=screen-256color-bce tmux"
 

结果: 

-------------------------------------------------------------------------------------------------------------

关于语言服务器的概述。

mason 是用于 安装 各种 语言服务器的,比如 python ,就是 pyright , 代替的是手动的一个一个的安装。这里需要注意,即便是安装了语言服务器,也是需要你去安装环境的,比如,我已经安装了pyright, 那我我自己需要去安装 nodejs ,应为pyrihht 是用 javascript 写的,还需要一个 python.

mason.lspconfig . 用于自动的启动各个语言服务器,并且启动过程中,会对各个语言服务器的快捷键进行配置。代替的是 手动的 启动一个一个的语言服务器,并且对每个语言服务器进行手动的快捷键的配置。

nvim-lspconfig ,  是用于 安装各种 语言服务器的配置的,它有各种语言服务器的通用配置。代替的是手动 一个一个对 语言服务器进行配置。

我自己的猜测: 这样是不能够对内核的源码进行追踪的。

这样的追踪要么就是文件内部的追踪,要么就是 追踪语言的内置的函数,比如printf 之类的函数。

--------------------------------------------------------------------------------------------

nvim-lspconfig

安装: 

配置: 

引用: 

-----------------------------------------------------------------------------------------------------------------------------

mason.nvim

主要是用来帮助安装 lsp 服务器。

安装:

配置:

引用:

接下来是使用的测试。

疑问:在安装完 语言服务器之后,还需要服务器需要的环境,这句话我不是很理解。

-------------------------------------------------------------------------------------------------------------------------------

mason lspconfig

安装:

这次是一次安装的。

配置;

也打算做一个 综合的配置。

  1   return {
    1 ▎   config = function()
    2 ▎   ▎   local servers = {
    3 ▎   ▎   ▎   lua_ls = {
    4 ▎   ▎   ▎   ▎   settings = {
    5 ▎   ▎   ▎   ▎   ▎   Lua = {
    6 ▎   ▎   ▎   ▎   ▎   ▎   workspace = { checkThirdParty = false },
    7 ▎   ▎   ▎   ▎   ▎   ▎   telemetry = { enable = false },
    8 ▎   ▎   ▎   ▎   ▎   },
    9 ▎   ▎   ▎   ▎   },
   10 ▎   ▎   ▎   },
   11 ▎   ▎   ▎   pyright = {},
   12 ▎   ▎   ▎   marksman = {},
   13 ▎   ▎   ▎   clangd = {},
   14 ▎   ▎   }
   15 ▎   ▎   local on_attach = function(_, bufnr)
   16 ▎   ▎   ▎   -- Enable completion triggered by <c-x><c-o>
   17 ▎   ▎   ▎   local nmap = function(keys, func, desc)
   18 ▎   ▎   ▎   ▎   if desc then
   19 ▎   ▎   ▎   ▎   ▎   desc = 'LSP: ' .. desc
   20 ▎   ▎   ▎   ▎   end
   21 ▎   ▎   ▎   ▎
   22 ▎   ▎   ▎   ▎   vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc })
   23 ▎   ▎   ▎   end
   24 ▎   ▎   ▎
   25 ▎   ▎   ▎   nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
   26 ▎   ▎   ▎   nmap('gd', require "telescope.builtin".lsp_definitions, '[G]oto [D]efinition')
   27 ▎   ▎   ▎   nmap('K', "<cmd>Lspsaga hover_doc<CR>", 'Hover Documentation')
   28 ▎   ▎   ▎   nmap('gi', require "telescope.builtin".lsp_implementations, '[G]oto [I]mplementation')
   29 ▎   ▎   ▎   nmap('<C-k>', vim.lsp.buf.signature_help, 'Signature Documentation')
   30 ▎   ▎   ▎   nmap('<leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder')
   31 ▎   ▎   ▎   nmap('<leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder')
   32 ▎   ▎   ▎   nmap('<leader>wl', function()
   33 ▎   ▎   ▎   ▎   print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
   34 ▎   ▎   ▎   end, '[W]orkspace [L]ist Folders')
   35 ▎   ▎   ▎   nmap('<leader>D', vim.lsp.buf.type_definition, 'Type [D]efinition')
   36 ▎   ▎   ▎   nmap('<leader>rn', "<cmd>Lspsaga rename ++project<cr>", '[R]e[n]ame')
   37 ▎   ▎   ▎   nmap('<leader>ca', "<cmd>Lspsaga code_action<CR>", '[C]ode [A]ction')
   38 ▎   ▎   ▎   nmap('<leader>da', require "telescope.builtin".diagnostics, '[D]i[A]gnostics')
   39 ▎   ▎   ▎   nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences')
   40 ▎   ▎   ▎   -- nmap('gr', vim.lsp.buf.references, '[G]oto [R]eferences')
   41 ▎   ▎   ▎   nmap("<space>f", function()
   42 ▎   ▎   ▎   ▎   vim.lsp.buf.format { async = true }
   43 ▎   ▎   ▎   end, "[F]ormat code")
   44 ▎   ▎   end
   45 ▎   ▎   require("mason").setup()
   46 ▎   ▎   require("mason-lspconfig").setup({
   47 ▎   ▎   ▎   ensure_installed = vim.tbl_keys(servers),
   48 ▎   ▎   })
   49 ▎   ▎
   50 ▎   ▎   for server, config in pairs(servers) do
   51 ▎   ▎   ▎   require("lspconfig")[server].setup(
   52 ▎   ▎   ▎   ▎   vim.tbl_deep_extend("keep",
   53 ▎   ▎   ▎   ▎   ▎   {
   54 ▎   ▎   ▎   ▎   ▎   ▎   on_attach = on_attach,
    6 ▎   ▎   ▎   ▎   ▎   },
    5 ▎   ▎   ▎   ▎   ▎   config
    4 ▎   ▎   ▎   ▎   )
    3 ▎   ▎   ▎   )
    2 ▎   ▎   end
    1 ▎   end
  62  }

引用:

目前 lsp 基本的框架就安装完了。

--------------------------------------------------------------------------------------------

有一个重要的报错:

问题: 我下载 lsp 只能在  /.config  目录下,才能使用,别的目录都不能使用。

--------------------------------------------------------------------------------------------------------------------------

一个疑问: 在 视频中, 他在启动 pyright 的时候 ,启用了一个 python 的虚拟环境,python -m venv .env

不知道,这个创建虚拟环境的作用是什么, 是不是与编译器有关呢。

也许,我设置编译器的 原因,也就是这个 编译环境。

-----------------------------------------------------------------------------------------------------------------------------

安装neodev.nvim , 这个插件是用来识别 neovim 的内置api 的, 比如这样会报错。

安装:

配置;

引用:

注意要放在 lsp 之前。

结果:

-------------------------------------------------------------------------------------------------------------------------------

关于如何生成 compile_command.json.

我是这个做的。

便会在 makefile 的目录下产生这个文件。

但是 我在使用 bear 编译 imx6ul 的源码的时候遇到一个这个错误:

ERROR: ld.so: object '/usr/${LIB}/bear/libear.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
scripts/kconfig/conf  --silentoldconfig Kconfig
ERROR: ld.so: object '/usr/${LIB}/bear/libear.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
make[1]: “include/generated/mach-types.h”已是最新。
  CHK     include/generated/bounds.h
  CHK     include/generated/asm-offsets.h
  CALL    scripts/checksyscalls.sh
ERROR: ld.so: object '/usr/${LIB}/bear/libear.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
ERROR: ld.so: object '/usr/${LIB}/bear/libear.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
  CHK     include/generated/compile.h
  GZIP    kernel/config_data.gz
  CHK     kernel/config_data.h
  Kernel: arch/arm/boot/Image is ready
ERROR: ld.so: object '/usr/${LIB}/bear/libear.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
ERROR: ld.so: object '/usr/${LIB}/bear/libear.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
ERROR: ld.so: object '/usr/${LIB}/bear/libear.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
ERROR: ld.so: object '/usr/${LIB}/bear/libear.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
  Kernel: arch/arm/boot/zImage is ready

网上的资料:

估计是这个原因:

下载32位 bear 的网址:

Debian -- Package Download Selection -- bear_2.3.13-1_all.deb

如果直接 dpkg -i xxxx.deb 的话,会有报错:

首先删除之前的安装:

然后在 手动安装测试一下:

手动安装也是报错的,所以 , 如果要使用的话,还得去编译源码,所以直接使用 别的  编辑器得了。

就使用 source insight 得了。

最终的解决:

上面使用source insight 只是权宜之计。

我下来编译了一下 bear ,据说是32 ,与64 位的关系。但是移植没有编译出来。

有可能是我 操作的不对。 我是按照官网操作的,但是依然是不可以。

GitHub - rizsotto/Bear: Bear is a tool that generates a compilation database for clang tooling.

后来在网上找到这个。

他使用的是一个脚本, gen_compile_commands.py

所以我试一下这个。

我首先在 Ubuntu虚拟机上进行测试。

我首先是安装了 clang-12, clangd-12compile_commands.json

apt install  clang-12, clangd-12

但是没什么用, 我使用的 gen_compile_commands.py 这个文件是内置的。

然后 编译一遍 内核源码之后

生成了  compile_commands.json

并且可以使用 nvim 的跳转功能了。

所以可以在阿里云的 debain11 上进行测试了。

首先我是安装编译器,解压 imx6ul 的内核源码。

编译过程出现报错。但是不影响,估计是内核编译环境搭建的问题。

我主要也不是编译内核,而是 测试 nvim 的代码跳转。

我发现, debain11 没有默认带  gen_compile_commands.py ,并且安装了 clang , clangd 也没有。

那么我直接拷贝 Ubuntu的  gen_compile_commands.py  到debian 上。

然后 生成。

发现是 可以给 nvim 使用的。

目前问题先这样解决。

注意: 我发现一个使用 gen_comxxx 的问题:

就是不能使用相对路径,具体原因不清楚。

举例:

我这么生成是不行的。

必须要这么生成

将 gen_compile_commands.py 拷贝到当前的目录下

-----------------------------------------------------------------------------------------------------------------------------

目前 clangd 的 终于是可以了。

我的关键的配置。

经过我的测试, 是必须加在  clangd 的table里面,而不能是这样的。

也不能在工程目录下 写一个 .vim.lua 文件。来设置 clangd 具体原因还不清楚。

目前还有一些问题:

但是基本可以使用了。

可以使用 vim.lsp 的函数。

我发现 当一个函数有报错的时候,是不能够使用,lsp 的跳转的。

同时,telescope 也是可以使用的。,用于代码检测。

---------------------------------------------------------------------------------------------------------------------------------

在使用 clangd 的时候如何向回跳转呢?

--------------------------------------------------------------------------------------------------------------------

关于 nvim 的内置的命令

-----------------------------------------------------------------------------------------------------------------

我的一个疑问:

在clangd 中有一个 这样的报错。

但是我通过 , telescope 是可以搜索到这个函数的实现的。

难道是因为头文件的原因吗? 不是很理解。

-----------------------------------------------------------------------------------------------------------------------------

开始美化, 安装lualine .

安装:

配置:

引用:

结果:

问题: 有乱码,并且 我没有定制

这里的主要的问题是 没有安装字体,应该是。

------------------------------------------------------------------------------------------------------------------------------

关于nerd font 字体的安装

首先是查看系统上的字体文件的命令。

fc-list

一般字体都安装在哪些目录呢:

debian 系统如何设置 字体呢?

debian 有一个配置文件。

如何设置临时字体呢:

但是setfont 对字体有要求。

----------------------------------------------------------------------------------------------------------------------------

出现一个新问题: 普通的shell 与tmux 中的shell 颜色不一致。

这个问题上面有解决方法。

--------------------------------------------------------------------------------------------------------------------------------

关于nvim 的快速跳转, flash.nvim 的安装

安装:

配置:我选择的是 直接在keympa 里面进行配置。

   13 keymap.set('n', 's', '<cmd>lua require("flash").jump()<CR>', { desc = 'Flash' })
~                             ┃   12 keymap.set('x', 's', '<cmd>lua require("flash").jump()<CR>', { desc = 'Flash' })
~                             ┃   11 keymap.set('o', 's', '<cmd>lua require("flash").jump()<CR>', { desc = 'Flash' })
~                             ┃   10 keymap.set('n', 'S', '<cmd>lua require("flash").treesitter()<CR>', { desc = 'Flash Treesitter' })
~                             ┃    9 keymap.set('x', 'S', '<cmd>lua require("flash").treesitter()<CR>', { desc = 'Flash Treesitter' })
~                             ┃    8 keymap.set('o', 'S', '<cmd>lua require("flash").treesitter()<CR>', { desc = 'Flash Treesitter' })
~                             ┃    7 keymap.set('o', 'r', '<cmd>lua require("flash").remote()<CR>', { desc = 'Remote Flash' })
~                             ┃    6 keymap.set('o', 'R', '<cmd>lua require("flash").treesitter_search()<CR>', { desc = 'Treesitter Search' })
~                             ┃    5 keymap.set('x', 'R', '<cmd>lua require("flash").treesitter_search()<CR>', { desc = 'Treesitter Search' })
~                             ┃    4 ▎

引用:

所以也就没有什么引用了。

我的疑问: 

1 就是我在 按 s 进行跳转的时候会比较慢。

---------------------------------------------------------------------------------------------------------------------

在nvim 中如何进行 全词的匹配

:\<int\>   这样是可以进行全此配置的, 搜索的单词 就是 int  不包括 interrupt

-------------------------------------------------------------------------------------------------------------------------------

接下来是关于自动补全的安装

nvim-cmp 这个插件是骨架。

安装:

配置:

这是基本的配置,其余的我都删了,慢慢的完善


   28 return {
   27 ▎
   26 ▎   -- 一个函数
   25 ▎   config = function()
   24 ▎   ▎   local status, _ = pcall(require, "lualine")
   23 ▎   ▎   if not status then
   22 ▎   ▎   ▎   return
   21 ▎   ▎   end
   20 ▎   ▎
   19 ▎   ▎   -- 这是环境变量
   18 ▎   ▎
   17 ▎   ▎
   16 ▎   ▎
   15 ▎   ▎   --对插件的配置
   14 ▎   ▎
   13 ▎   ▎   local cmp = require'cmp'
   12 ▎   ▎
   11 ▎   ▎   cmp.setup({
   10 ▎   ▎   ▎   mapping = {
    9 ▎   ▎   ▎   ▎   ['<C-b>'] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }),
    8 ▎   ▎   ▎   ▎   ['<C-f>'] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c' }),
    7 ▎   ▎   ▎   ▎   ['<C-Space>'] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }),
    6 ▎   ▎   ▎   ▎   ['<C-y>'] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `<C-y>` mapping.
    5 ▎   ▎   ▎   ▎   ['<C-e>'] = cmp.mapping({
    4 ▎   ▎   ▎   ▎   ▎   i = cmp.mapping.abort(),
    3 ▎   ▎   ▎   ▎   ▎   c = cmp.mapping.close(),
    2 ▎   ▎   ▎   ▎   }),
    1 ▎   ▎   ▎   ▎   ['<CR>'] = cmp.mapping.confirm({ select = true }),
  30  ▎   ▎   ▎   },
    1 ▎   ▎   })
    2 ▎   ▎
    3 ▎   ▎
    4 ▎   ▎
    5 ▎   ▎
    6 ▎   ▎
    7 ▎   ▎
    8 ▎   ▎   -- 这是之前的
    9 ▎   ▎
   10 ▎   end,
   11 ▎
   12 }
   13

引用:

接下来是关于 路径补全的 插件。

cmp-path.

安装;

配置:

   42
   41 return {
   40 ▎
   39 ▎   -- 一个函数
   38 ▎   config = function()
   37 ▎   ▎   local status, _ = pcall(require, "lualine")
   36 ▎   ▎   if not status then
   35 ▎   ▎   ▎   return
   34 ▎   ▎   end
   33 ▎   ▎
   32 ▎   ▎   -- 这是环境变量
   31 ▎   ▎
   30 ▎   ▎
   29 ▎   ▎
   28 ▎   ▎   --对插件的配置
   27 ▎   ▎
   26 ▎   ▎   local cmp = require'cmp'
   25 ▎   ▎
   24 ▎   ▎   cmp.setup({
   23 ▎   ▎   ▎   mapping = {
   22 ▎   ▎   ▎   ▎   ['<C-b>'] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }),
   21 ▎   ▎   ▎   ▎   ['<C-f>'] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c' }),
   20 --                ['<C-Space>'] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }),
   19 ▎   ▎           ['<C-y>'] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `<C-y>` mapping.
   18 ▎   ▎           ['<C-e>'] = cmp.mapping({
   17 ▎   ▎           ▎   i = cmp.mapping.abort(),
   16 ▎   ▎           ▎   c = cmp.mapping.close(),
   15 ▎   ▎           }),
   14 ▎   ▎           ['<CR>'] = cmp.mapping.confirm({ select = true }),
   13 ▎   ▎       },
   12 ▎   ▎       sources = cmp.config.sources({
   11 ▎   ▎       ▎    { name = 'path' }, -- For snippy users.
   10 ▎   ▎       }, {
    9 ▎   ▎      --         { name = 'buffer' },
    8 ▎   ▎      ▎    })
    7 ▎   ▎
    6 ▎   ▎
    5 ▎   ▎
    4 ▎   ▎   })
    3 ▎   ▎
    2 ▎   ▎
    1 ▎   ▎
  43  ▎   ▎   -- 这是之前的
    1 ▎   ▎
    2 ▎   end,
    3 ▎
    4 }
    5

引用:

也就不用引用了。

结果:

当输入 /  的时候就会自动的提示。但是快捷键 还没有设置 tab 健。

--------------------------------------------------------------------------------------------------------------------------------

接下来是 对 各个语言的补全。

首先安装的是 cmp-nvim-lsp , 这其实一个 语言的源。

安装:

配置:

就是添加源, 并且设置 capacity .

引用:

不用引用。

之前一直 无法使用 nvim-lsp 的功能,主要是我在配置的时候,输入错误。

-------------------------------------------------------------------------------------------------------------------------------

关于 snip 的补全, 逻辑是 snip 引擎+ snip源

关于snip 引擎的安装。  L3MON4D3/LuaSnip

安装snip的源。         rafamadriz/friendly-snippets    

还需要一个插件 cmp_luasnip 将 friendly-snippets  转换成 cmp的 snip 源  

saadparwaiz1/cmp_luasnip

安装:

将这三个一起安装。

配置:

引用:

是不需要再引用的。

测试:

可以看到已经出现了 snip 。

接下来还要去改一下 ,snip 的mapping .

直接抄 nvim-cmp 的官网的wiki

测试一下;

-----------------------------------------------------------------------------------------------------------------------------

关于 buffer 的补全。

安装:

配置:

引用:

不用引用。

测试:

=---------------------------------------------------------------------------------------------------------------------------

对于 command line 的安装。

hrsh7th/cmp-cmdline

配置:

引用:

是不用引用的。

测试:

这里出现了报错。

目前我使用 up主的配置依然是这样的。

目前解决不了。

---------------------------------------------------------------------------------------------------------------------------------

到这里做一下,对于 安装 nvim 插件的总结了。

1 在packer 中进行安装

2 在配置文件里对 插件进行配置。

3 设置 init.lua 文件。

然后是安装目录树。

目录树的测试

添加文件+目录 ,都是 a 命令, 目录只需要在 后面加上 / 就可以了。

复制文件  c

剪切文件 x

粘贴文件  p

重命名文件  r

展开文件 是 tab

选中文件是   回车。

然后是安装telescope

直接安装

然后是 更改配置文件:

最后是 包含配置文件

断点

书签

搜索文件

搜索文件可以使用  命令  :Telescope find file

这里有一个疑问:

我自己的测试是, 如果我 按 esc 键 ,就进入了 telescope 的 normal 模式,这时 使用 j k  就可以移动了。

但是可以在 配置文件里  做改动。

这样就可以直接在 搜索时 , 使用插入模式 , 进行 在结果的 UI 里,进行移动了。

但是这里的移动只能是 一行一行的移动,而不能是 半页半页的移动。

设置 启动 telescope 搜索功能的快捷键

leader 健 是 neo vim 的 按键 ,不是 telescope 的。

当然也可以 使用命令的方式 启动 telescope

搜索文件:

首先  进入nvim , 然后 按住 主键+ ff , 便可进入 搜索文件模式。

在 telescope 里,再 按住 C+J/k , 便可以 在插入模式下, 上下浏览文件。

按回车,可以直接进入文件。

回退 是什么按键呢?

好像是无法回退, 想要关闭的话,大不了再从新打开一次。

这是当前的窗口与 要打开的文件的 窗口之间的排列方式。

如何制定某个文件夹的搜索/排除某个文件夹的搜索呢?

如何使用正则表达式进行搜索。

如何打书签 , 如何在文件内部,以及 在文档之间跳转

如何搜索文件内的符号,如何搜索项目内的符号,如何与 LSP 支持。

如何打开项目级别的目录。

搜索字符

搜索字符必须安装一下 ripgrep 命令。

apt install ripgrep

否则 无法使用 搜索字符的命令。

telescope 与LSP 做了兼容。

-------------------------------------------------------------------------------------------------------------------------------

nvim 中的固定的 语法。

init.lua : 入口

require: 导入模块

let g:foo = bar

set foo = bar

注意:let 与set 是 vim 的写法,不是 neovim

 关于 let 与 set  的区别总结。

网上的截图:

总结: set  是在设置nvim 的 默认值, 而 let 是在设置一个自己的变量。

vim.keymap.set 函数

这是一个 键盘映射的函数,这是nvim 的lua API 提供的函数

vim.keymap.set('n', '<F14>', '<Cmd>Lspsaga open_floaterm<CR>', opts)

网上的资料如下:

关于 在nivm 中 导入一个模块。

一种方式是 require()

第二种是   这种方式。

return require('packer').startup(function(use)

第三种是 这种。

local stautus_ok, packer = pcall(requrire, "packer")

本质是一眼的。

关于 vim.cmd 函数

也就是说, 这个lua api 是 在neovim 中 调用vim 的命令的函数。

然后是关于vim.api 的解释

我可以把它理解成,也是一个api

网上找到了一个讲的比较好的帖子:

首先是关于lua 的基本的语法

然后是关于 vim.o, vim.g

然后是键位的映射函数。

------------------------------------------------------------------------------------------------------------------------

这是一个 markdown 插件。

glow.nvim

首先是安装:

GitHub - ellisonleao/glow.nvim: A markdown preview directly in your neovim.

然后是配置。

  3 return {
    2
    1 -- 一个函数
  7   ▎ config = function()
    1 ▎ ▎ local status, _ = pcall(require, "glow")
    2 ▎ ▎ if not status then
    3 ▎ ▎ ▎ return
    4 ▎ ▎ end
    5
    6 -- 这是环境变量
    7
    8
    9
   10
   11
   12
   13 --对插件的配置
   14 ▎
   15 ▎   require("glow").setup({
   16 ▎   ▎style = "dark",
   17 ▎   ▎width = 120,
   18 ▎   })
   19
   20
   21 -- 这是之前的
   22 ▎
   23 ▎ end,
   24 ▎
   25 }
   26
   27
   28
~

然后是 init  中打开。

但是我在 阿里云服务器上测试没有报错,但是也没有代开 预览框, 不知道为什么、

我用虚拟机测试了一下,会报这个错误。

最终我的解决方式是这么改的。

将这个换成 绝对路径就行了。

但是这里有一个 需要注意的地方: 就是 再SSH 中式没法 使用  glow 的, 我不知道 别的 markdown 插件是不是也是这样。

--------------------------------------------------------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值