丰富的线上&线下活动,深入探索云世界
做任务,得社区积分和周边
最真实的开发者用云体验
让每位学生受益于普惠算力
让创作激发创新
资深技术专家手把手带教
遇见技术追梦人
技术交流,直击现场
海量开发者使用工具、手册,免费下载
极速、全面、稳定、安全的开源镜像
开发手册、白皮书、案例集等实战精华
为开发者定制的Chrome浏览器插件
环境:Ubuntu20.04
宿主机:windows(windowsterminal)WSL2
NVIM:v0.10.0-dev
配置Neovim需要保证流畅的github环境(以便于快速拉取插件),可以使用代理或是配置GithubSSHkey
本篇博客是学习掘金小册的学习笔记,有兴趣的朋友可以直接点击下文链接了解详情
├──LICENSE├──README.md├──init.lua└──lua├──autocmds.lua├──basic.lua├──colorscheme.lua├──keybindings.lua├──lsp│├──cmp.lua│├──config││├──bash.lua││├──emmet.lua││├──html.lua││├──json.lua││├──lua.lua││├──markdown.lua││├──pyright.lua││├──rust.lua││└──ts.lua│├──formatter.lua│├──null-ls.lua│├──setup.lua│└──ui.lua├──plugin-config│├──bufferline.lua│├──comment.lua│├──dashboard.lua│├──gitsigns.lua│├──indent-blankline.lua│├──lualine.lua│├──nvim-autopairs.lua│├──nvim-tree.lua│├──nvim-treesitter.lua│├──project.lua│├──surround.lua│├──telescope.lua│├──toggleterm.lua│├──vimspector.lua│└──which-key.lua├──plugins.lua└──utils├──fix-yank.lua├──global.lua└──im-select.lua首先init.lua是整个配置的入口文件,负责引用所有其他的模块,基本上想要打开或关闭某个插件只要在这里修改一行代码即可。
是对Neovim内置LSP功能的配置,包括常见编程语言与语法提示等。
下载字体文件FiraCodeNerdFont-Regular.ttf下载之后双击ttf文件点击安装即可添加到系统字体文件中
配置步骤:
最后点击保存
旧版本卸载:sudoapt-getremoveneovim
sudoapt-getinstallsoftware-properties-commonsudoadd-apt-repositoryppa:neovim-ppa/unstablesudoapt-getupdatesudoapt-getinstallneovim执行nvim--version,确保版本必须为0.7及以上。
执行nvim~/.bashrc
aliasvim='nvim'aliasvi='nvim'aliasv='nvim'执行source~/.bashrc重新加载配置文件
~/.config/nvim/init.lua写入如下内容:
--基础设置require('basic')require函数在Lua中用于加载一个模块,而这些模块通常位于runtimepath中的lua/目录下,也就是我们的~/.config/nvim/lua/目录。
所以上边的代码,就是加载~/.config/nvim/lua/basic.lua文件(注意:require里没有.lua扩展名)。当然也可以创建~/.config/nvim/lua/basic/目录,在目录下边创建init.lua文件也是可以成功加载的。
创建基础配置文件~/.config/nvim/lua/basic.lua,并添加如下内容:
创建lua/keybindings.lua
安装步骤(请参照官网步骤):
安装成功后添加配置文件lua/plugins.lua,添加如下内容
localpacker=require("packer")packer.startup(function(use)--Packer可以管理自己本身use'wbthomason/packer.nvim'--你的插件列表...end)init.lua中添加如下内容
--Packer插件管理require("plugins")配置生效后,Neovim会增加以下命令。
通过上边的说明,我们观察到:PackerSync命令包含了:PackerUpdate和:PackerCompile,而:PackerUpdate又包含了:PackerClean和:PackerInstall流程。
所以通常情况下,无论安装还是更新插件,我只需要下边这一条命令就够::PackerSync
每次修改完lua/plugins.lua这个文件后,保存退出,重新打开并调用:PackerSync就可以了
lua/plugins.lua文件,在最后添加
--每次保存plugins.lua自动安装插件pcall(vim.cmd,[[augrouppacker_user_configautocmd!autocmdBufWritePostplugins.luasource
init.lua中添加如下内容:
--主题设置(新增)require("colorscheme")lua/colorscheme.lua添加
localcolorscheme="tokyonight"localstatus_ok,_=pcall(vim.cmd,"colorscheme"..colorscheme)ifnotstatus_okthenvim.notify("colorscheme"..colorscheme.."没有找到!")returnend安装第三方主题lua/plugins.lua文件
packer.startup({function(use)--Packer可以升级自己use("wbthomason/packer.nvim")---------------------colorschemes----------------------tokyonightuse("folke/tokyonight.nvim")---------------------------------------------------------略...}):w保存p退出
lua/plugins.lua添加插件配置后,修改lua/colorscheme.lua内colorscheme变量为相应的主题即可
lua/plugins.lua中添加
packer.startup({function(use)--Packer可以升级自己use("wbthomason/packer.nvim")--------------------------plugins---------------------------------------------nvim-tree(新增)use({"kyazdani42/nvim-tree.lua",requires="kyazdani42/nvim-web-devicons"})...略配置nvim-treelua/plugin-config/nvim-tree.lua
nvim-tree初始化支持很多参数,如果想知道还有哪些其他的参数,可以运行:hnvim-tree.setup调出帮助文档查看。
lua/keybindings.lua添加
--插件快捷键localpluginKeys={}--nvim-tree--alt+m键打开关闭treemap("n","
表明view.mappingsandremove_keymaps已经启用需要移除
解决方案:
注释掉view.mappings
执行:NvimTreeGenerateOnAttach,复制nvim-tree-on-attach.lua中的内容粘贴到nvim-tree.lua中(需要添加在setup之前)
添加
require("nvim-tree").setup({...on_attach=on_attach,})问题解决~
lua/plugins.lua
packer.startup({function(use)--Packer可以升级自己use("wbthomason/packer.nvim")--------------------------plugins---------------------------------------------nvim-treeuse({"kyazdani42/nvim-tree.lua",requires="kyazdani42/nvim-web-devicons"})--bufferline(新增)use({"akinsho/bufferline.nvim",requires={"kyazdani42/nvim-web-devicons","moll/vim-bbye"}})...略:w保存,自动安装,安装完整按q退出
出现GnuTLSrecverror(-110)问题
新建lua/plugin-config/bufferline.lua文件并添加内容
--bufferline--左右Tab切换map("n","
require("plugin-config.bufferline")底部信息栏lua/plugins.lua
--lualine(新增)use({"nvim-lualine/lualine.nvim",requires={"kyazdani42/nvim-web-devicons"}})use("arkav/lualine-lsp-progress")新建lua/plugin-config/lualine.lua
--telescope(新增)use{'nvim-telescope/telescope.nvim',requires={"nvim-lua/plenary.nvim"}}:checkhealthtelescope检查依赖情况,这里通常会提示ripgrep不存在,因为telescope依赖以下两个项目。
#20.04安装repgrepsudoaptinstallripgrep#18.04安装repgrepsudoadd-apt-repositoryppa:x4121/ripgrepsudoapt-getupdatesudoaptinstallripgrep#安装fdnpminstall-gfd-find配置node环境node配置源,需要哪个版本可以将16替换为相应版本
sudoapt-getupdate-ysudoaptinstall-ynodejs如果不想要自己配置指定版本源的情况下,可以直接执行
gitclonenvm仓库时遇到如下错误
GnuTLSrecverror(-110):TheTLSconnection。。。
我是因为Ipv6的问题,可以gitclone-4指定使用Ipv4连接
但是执行ap-getupdate遇到问题:
这是因为之前我执行过sudoadd-apt-repositoryppa:x4121/ripgrep所以可以直接手动删除
解决方案(自动移除再更新):
sudoapt-add-repository-rppa:x4121/ripgrep#指的是先移除armagetronad-dev这个ppa包,再添加这个ppa包sudoaptupdate-q手动删除
cd/etc/apt/sources.list.drmx4121-ubuntu-ripgrep-focal.list#.save文件是备份,不需要管后面我在使用更新插件包时爆出:Couldnotresolvehostgithub.com
解决1(失败):
我直接ping了下网络,发现不只是github连不上,而是整个WSL网络都不能使用,在宿主机中我查看WSL网络配置,发现未修复之前两个红框中的ip地址是没有的
直接在宿主机上使用管理员权限执行netshwinsockreset重启网络即可(注意:不需要重启)
下面解决方案没有试过,仅作为备用方案
解决3:
#重启WSL指令$wsl--shutdown#之后就重新启动进入即可$wsl自定义启动页与项目列表当我们在命令行中输入nvim不带任何路径并敲击回车的时候,就会打开这个界面,通常我们会在这个界面中配置最常用功能,比如打开最近编辑过的文件,快速打开项目文件夹,快速修改快捷键等。
同样plugins.lua中添加:
--dashboard-nvim(新增)use("glepnir/dashboard-nvim")创建lua/plugin-config/dashboard.lua,并添加:
添加插件
--projectuse("ahmedkhalf/project.nvim")确保lua/plugin-config/nvim-tree.lua文件中有如下代码:
nvim_tree.setup({---上略--projectplugin需要这样设置update_cwd=true,update_focused_file={enable=true,update_cwd=true,},--下略}创建lua/plugin-config/project.lua
localstatus,project=pcall(require,"project_nvim")ifnotstatusthenvim.notify("没有找到project_nvim")returnend--nvim-tree支持vim.g.nvim_tree_respect_buf_cwd=1project.setup({detection_methods={"pattern"},patterns={".git","_darcs",".hg",".bzr",".svn","Makefile","package.json",".sln"},})localstatus,telescope=pcall(require,"telescope")ifnotstatusthenvim.notify("没有找到telescope")returnendpcall(telescope.load_extension,"projects")init.lua
require("plugin-config.dashboard")require("plugin-config.project")手动编辑project_history列表执行:luaprint(require("project_nvim.utils.path").historyfile)
我得到了~/.local/share/nvim/project_nvim/project_history这个文件,直接编辑即可
/root/.config/nvim以后的话可以方便编写nvim项目配置:)
--treesitter(新增)use({"nvim-treesitter/nvim-treesitter",run=":TSUpdate"})手动安装Languageparser运行:TSInstallInfo命令查看languageparsers列表与安装状态
安装::TSInstalljavascript
卸载::TSUninstalljavascript
安装后会在packer中生成相应语言的so文件
lua/plugin-config/nvim-treesitter.lua
localstatus,treesitter=pcall(require,"nvim-treesitter.configs")ifnotstatusthenvim.notify("没有找到nvim-treesitter")returnendtreesitter.setup({--安装languageparser--:TSInstallInfo命令查看支持的语言ensure_installed={"json","html","css","vim","lua","javascript","typescript","tsx"},--启用代码高亮模块highlight={enable=true,additional_vim_regex_highlighting=false,},})init.lua
require("plugin-config.nvim-treesitter")稍微说下里面nvim-treesitter中的配置
当你的光标在一个语法结点上时,可以设置一个增加键和一个减少键,敲击这两个,在表现上为不断外扩和收缩选中代码。
增加和减少结点的快捷键设置成了回车和退格。通过不断的按Enter选择区域会从里层不断外扩,Backspace则相反不断内收。
--启用增量选择模块incremental_selection={enable=true,keymaps={init_selection="
--启用代码缩进模块(=)indent={enable=true,},代码折叠快捷键中设置了zc组合键来折叠{}中的内容,还使用zo组合键来打开对应的折叠。
如果出现问题先执行TSUpdate看是否可以解决,无法解决查看官方issues或wiki
目的:实现类似IDE的智能提示、语法检查和解析、悬停文档等交互体验
定义:LSP(LanguageServerProtocol)语言服务协议,该协议定义了在编辑器或IDE与语言服务器之间使用的协议,该语言服务器提供了例如自动补全,转到定义,查找所有引用等的功能;语言服务器索引格式的目标是支持在开发工具中进行丰富的代码导航或者一个无需本地源码副本的WebUI。
执行:hlsp查看quickstart,里面的步骤如下
配置插件:
---------------------LSP--------------------use("williamboman/nvim-lsp-installer")--Lspconfiguse({"neovim/nvim-lspconfig"})安装LSPServer运行:LspInstallInfo,点击i即可安装相应的Server,进入之后安装Luaserver
从最上面的介绍得知作者未来会用mason.nvim取代nvim-lsp-installer,mason.nvim项目支持更多的server安装,不仅仅是LSPServer还支持DAPservers、linters、formatters等等超过150个包,100+种编程语言,并且升级也是非常简单的
但是安装失败,直接重新安装即可成功
但是有时遇到couldnotfindexecutable"unzip"inpath问题,可以使用如下命令
sudoapt-getinstallzipunzip但是安装成功之后发现问题,我从issues中了解到是因为luaserver的仓库地址发生变化
鉴于nvim-lsp-installer出现的各种问题,现在使用mason.nvim代替nvim-lsp-installer
步骤:
执行:Mason即可打开,操作基本和上面的一样,只不过多了1,2,3,4,5是上边TAB快捷键,按2即可切换到LSP
创建lua/lsp/setup.lua
--内置LSP(新增)require("lsp.setup")这里记录下:使用:verbosemap可以查看所有生效的快捷键
像hrsh7th/cmp-nvim-lsp就是Neovim内置LSP提供的补全内容,hrsh7th/cmp-buffer补全当前buffer的内容,hrsh7th/cmp-cmdline是命令行的补全,hrsh7th/cmp-path则是用来补全路径,如果配置了这个,当输入一个路径的时候会补全路径
创建lua/lsp/cmp.lua
localcmp=require("cmp")cmp.setup({--指定snippet引擎snippet={expand=function(args)--For`vsnip`users.vim.fn["vsnip#anonymous"](args.body)--For`luasnip`users.--require('luasnip').lsp_expand(args.body)--For`ultisnips`users.--vim.fn["UltiSnips#Anon"](args.body)--For`snippy`users.--require'snippy'.expand_snippet(args.body)end,},--补全源sources=cmp.config.sources({{name="nvim_lsp"},--Forvsnipusers.{name="vsnip"},--Forluasnipusers.--{name='luasnip'},--Forultisnipsusers.--{name='ultisnips'},----Forsnippyusers.--{name='snippy'},},{{name="buffer"},{name="path"}}),--快捷键设置mapping=require("keybindings").cmp(cmp),})--/查找模式使用buffer源cmp.setup.cmdline("/",{mapping=cmp.mapping.preset.cmdline(),sources={{name="buffer"},},})--:命令行模式中使用path和cmdline源.cmp.setup.cmdline(":",{mapping=cmp.mapping.preset.cmdline(),sources=cmp.config.sources({{name="path"},},{{name="cmdline"},}),})lua/keybindings.lua添加
--nvim-cmp自动补全pluginKeys.cmp=function(cmp)return{--出现补全["
require("lsp.cmp")--(新增)LSP功能增强UI插件,同时lspage还可以自定义快捷键,对于我自己而言我认为有些地方文字更加直观,如果有些朋友需要美化可自行查找
当一行代码很长的时候,右侧的提示文字就会显示不全
之前配置过gp快捷键使用弹窗显示错误,可以有效解决
use("tami5/lspsaga.nvim")创建lua/lsp/ui.lua
locallspsaga=require'lspsaga'lspsaga.setup{--defaults...debug=false,use_saga_diagnostic_sign=true,--diagnosticsignerror_sign="",warn_sign="",hint_sign="",infor_sign="",diagnostic_header_icon="",--codeactiontitleiconcode_action_icon="",code_action_prompt={enable=true,sign=true,sign_priority=40,virtual_text=true,},finder_definition_icon="",finder_reference_icon="",max_preview_lines=10,finder_action_keys={--open="o",open="
require("lsp.ui")代码格式化之前lua/keybindings.lua定义过格式化快捷键
mapbuf("n","
格式化方案有如下两种:
这里只讲解第二种
require("lsp.null-ls")安装之后可以运行:LspInfo查看绑定的LanguageServer
然后我们可以看到有两个LSP了,null-ls作为通用LSP,可以在任何filetypes中运行。
然后执行:NullLsInfo查看源的激活情况
之后的话即可使用:luavim.lsp.buf.format()命令或是直接使用快捷键
但是我们会发现包如下错误,这是因为相应语言应该配置相应的CodeFormatter,显示报错就是缺少Lua语言的StyLua,其它语言可以自行配置相应的Formatter
下面展示如何配置stylua
因为我是使用WSL,因此直接执行如下命令即可
执行rustc--version看是否成功,失败则看是否添加~/.cargo/bin路径到环境变量中
执行
cargoinstallstylua输出stylua-V看是否成功
格式化之后里面的空格就都变成了"^I",原本应该是“·”的
直接将basic.lua文件中设置vim.o.listchars="space:·,tab:··"或是设置vim.o.list=false
执行:TSInstallcssscssjsonhtmlvuejavascripttypescript
执行:TSInstallInfo查看安装情况
lua/lsp/setup.lua
mason_config.setup({ensure_installed={"lua_ls","html","cssls"}})...localservers={lua_ls=require("lsp.config.lua"),--新增html=require("lsp.config.html"),cssls=require("lsp.config.css")}创建lsp/common-config.lua
localM={}M.keyAttach=function(bufnr)localfunctionbuf_set_keymap(mode,lhs,rhs)vim.keymap.set(mode,lhs,rhs,{noremap=true,silent=true,buffer=bufnr})end--绑定快捷键require("keybindings").mapLSP(buf_set_keymap)end--禁用格式化功能,交给专门插件插件处理M.disableFormat=function(client)ifvim.fn.has("nvim-0.8")==1thenclient.server_capabilities.documentFormattingProvider=falseclient.server_capabilities.documentRangeFormattingProvider=falseelseclient.resolved_capabilities.document_formatting=falseclient.resolved_capabilities.document_range_formatting=falseendend--M.capabilities=require("cmp_nvim_lsp").update_capabilities(vim.lsp.protocol.make_client_capabilities())M.capabilities=require("cmp_nvim_lsp").default_capabilities()M.flags={debounce_text_changes=150,}returnM创建lsp/config/html.lua
localcommon=require("lsp.common-config")localopts={capabilities=common.capabilities,flags=common.flags,on_attach=function(client,bufnr)--禁用本身语言格式化common.disableFormat(client)common.keyAttach(bufnr)end,}return{on_setup=function(server)server.setup(opts)end,}创建lsp/config/css.lua
localcommon=require("lsp.common-config")localopts={capabilities=common.capabilities,flags=common.flags,on_attach=function(client,bufnr)common.disableFormat(client)common.keyAttach(bufnr)end,settings={css={validate=true,--tailwindcsslint={unknownAtRules="ignore",},},less={validate=true,lint={unknownAtRules="ignore",},},scss={validate=true,lint={unknownAtRules="ignore",},},},}return{on_setup=function(server)server.setup(opts)end,}上面不禁用的话也是可以的,只不过会和默认的null-ls中的prettier格式化冲突,每次格式化都需要选择
注意html、css文件均是需要项目根目录有package.json文件和prettier依赖
#创建package.json并安装prettier依赖,顺便把eslint也配置上npminit-y&&npmi-DprettiereslintEmmetLSP配置使用emmet可是使用简单的语法可以快速打出HTML结构标签
创建lua/lsp/config/emmet.lua
localopts={filetypes={"html","typescriptreact","javascriptreact","css","sass","scss","less"},}return{on_setup=function(server)server.setup(opts)end,}lua/lsp/setup.lua修改
mason_config.setup({ensure_installed={"lua_ls","html","cssls","emmet_ls"}})...localservers={lua_ls=require("lsp.config.lua"),html=require("lsp.config.html"),cssls=require("lsp.config.css"),--新增emmet_ls=require("lsp.config.emmet")}配置jsonlsJSONSchemaStore插件,即JSON增强包
plugins.lua添加插件
--JSON增强use("b0o/schemastore.nvim")新建lua/lsp/config/json.lua
mason_config.setup({ensure_installed={"lua_ls","html","cssls","emmet_ls","jsonls"}})localservers={lua_ls=require("lsp.config.lua"),html=require("lsp.config.html"),cssls=require("lsp.config.css"),emmet_ls=require("lsp.config.emmet"),--新增jsonls=require("lsp.config.json")}配置tssserver添加TS增强包插件
use({"jose-elias-alvarez/nvim-lsp-ts-utils",requires="nvim-lua/plenary.nvim"})创建lsp/config/ts.lua
--typescript快捷键pluginKeys.mapTsLSP=function(mapbuf)mapbuf("n","gs",":TSLspOrganize
lsp/null-ls.lua修改为
使用
前文已安装rust环境,此处不赘述
plugin-config/nvim-treesitter.lua中的ensure_installed中添加"rust"
或是执行:TSInstallrust
lsp/setup.lua
mason_config.setup({ensure_installed={"lua_ls","html","cssls","emmet_ls","jsonls","rust_analyzer"}})...localservers={--新增rust_analyzer=require("lsp.config.rust"),}lsp/config/rust.lua
--Rust增强use("simrat39/rust-tools.nvim")代码格式化安装相应Formtter
rustupcomponentaddrustfmtnull-ls.lua
source中添加
--rustfmtformatting.rustfmt,filetypes中添加"rust"
熟悉上面的流程,这个就简单讲了
setup.lua
servers添加“c”和“cpp”
安装格式化插件:apt-getinstall-yclang-format
plugin-config/nvim-treesitter.lua
ensure_installed添加“cpp”"c"null-ls.lua
formatting.prettier.with({filetypes={"c","cpp"}}),--clang-formatformatting.clang_format,lsp/config/clangd.lua
添加插件:
use'CRAG666/code_runner.nvim'配置插件plugin-config/code-runner.lua
引入插件
use("windwp/nvim-autopairs")创建lua/plugin-config/nvim-autopairs.lua
use("numToStr/Comment.nvim")创建lua/plugin-config/comment.lua
--代码注释插件--see./lua/plugin-config/comment.luapluginKeys.comment={--Normal模式快捷键toggler={line="gcc",--行注释block="gbc",--块注释},--Visual模式opleader={line="gc",bock="gb",},}init.lua中引入
require("plugin-config.comment")Surround配置引入插件
--surrounduse("ur4ltz/surround.nvim")lua/plugin-config/surround.lua
localstatus,surround=pcall(require,"surround")ifnotstatusthenvim.notify("没有找到surround")returnendsurround.setup({mappings_style="surround",})init.lua
surround官方快捷键如下
NormalMode-SandwichModeProvideskeymappingtoaddsurroundingcharacters.(visuallyselectthenpresss
我在推送仓库时频繁遇到GnuTLSrecverror(-110)
#!/bin/bashset-esudoapt-getinstallbuild-essentialfakerootdpkg-dev-ysudoapt-getbuild-depgit-ysudoapt-getinstalllibcurl4-openssl-dev-ycd~mkdirsource-gitcdsource-git/apt-getsourcegitcdgit-2.*.*/sed-i--'s/libcurl4-gnutls-dev/libcurl4-openssl-dev/'./debian/controlsed-i--'/TEST\s*=\s*test/d'./debian/rulesdpkg-buildpackage-rfakeroot-b-uc-ussudodpkg-i../git_*ubuntu*.deb直接运行这个脚本即可
之后推送遇到remote:SupportforpasswordauthenticationwasremovedonAugust13,2021问题,虽然我不太清楚我配了SSHkey,为什么还是走的密码验证,但是我还是按照他的提示来做获取token,直接github首页中Setting->Developersettings->Personalaccesstokens生成token
使用:hclipboard查看复制粘贴命令
文档推荐使用setclipboard=unnamedplus,或是执行setclipboard^=unnamed,unnamedplus就可以连通vim剪切板和系统剪切板,但是这个命令只是暂时性的,只能当前页面生效,为了永久生效,可以在basic.lua中添加
--复制粘贴联通系统粘贴板vim.o.clipboard="unnamedplus"全选复制文件:%y或是ggyG
只是删除而不将删除的部分复制到剪切板中"_dd(本质上是将剪切的内容放到_寄存器中,以便于和+寄存器区分)
对我自己而言,配置的这些功能虽然少,但是暂时够用,如果追求更多的功能,可以直接用小册作者的仓库,或是其他优秀仓库
其实我觉得其实作为个人使用来说,没有特殊需求的情况下不是很推荐自己配置,只需要看懂本篇博客,然后可以做到更改别人写好的配置即可