使用Neovim作为JavaIDE
我第一次学习Vim是在大学,从那时起,它一直是我软件工程职业生涯的主要伙伴。使用Vim使用Python和Go程序感觉很自然,而且我总是感觉很有效率。然而,Java始终是一个难以驯服的野兽。每当有机会使用Java时,我都会不可避免地尝试Vim一段时间,但会回过头来使用IntelliJ和IdeaVim插件,以利用功能齐全的IDE提供的丰富语言功能。
不幸的是,IntelliJ有它自己的问题。在随机的,有时是不合时宜的时候,它会停止运行,直到重建所有缓存,重新加载项目,并完成半天或更长时间的故障排除以使IDE正常工作。直到几个月前,看到了Vim、Neovim和语言服务器协议规范和实现的进步,我想也许是时候重新审视一下使用Neovim作为JavaIDE了。
是否可以?是的。我会推荐它吗?或许。我疯了吗?大概。
我们开始吧。概览
将Neovim从一个简单的文本编辑器推向一个全功能的IDE需要一些部件,所以最好花一分钟时间先了解所有涉及的部件以及它们如何相互交互,然后再深入了解一些神秘的配置选项。
我从IDE中寻找的功能是代码导航(转到定义、查找参考、转到实现)、代码完成、签名提示、重构和调试。语言服务器协议的现代实现涵盖了大多数这些情况,而一个更新的配套项目调试适配器协议处理调试。
语言服务器、调试器和调试适配器一起与您的代码交互,如下图所示。
基于Vim的IDE的组件
这个图的好处是它不是特定于Java的。一旦您了解了如何让一种语言工作,您就可以对任何实现语言服务器协议和调试适配器协议的语言重复这个过程。对于Java,我们使用EclipseJDTLS作为语言服务器实现,使用vscodejavadebug作为调试适配器(利用javadebug)。开始
Neovim将Lua5。1脚本引擎和LuaJIT编译器嵌入到编辑器中。这意味着随时可以使用功能齐全且高性能的语言。它还显著减少了对替代语言支持的需求。我想简化Neovim的足迹,所以我做的第一件事就是禁用对我不使用的语言提供程序的支持。禁用语言提供程序支持(仅限lua和vimscript插件)vim。g。loadedperlprovider0vim。g。loadedrubyprovider0vim。g。loadednodeprovider0vim。g。loadedpythonprovider0vim。g。loadedpython3provider0
这一变化的实际效果意味着我选择的所有插件都是原生的vimscript和Lua。到目前为止,我还没有发现这种变化的局限,但时间会证明一切。将Lua集成到Neovim中导致可供选择的插件在质量和数量上都出现爆炸式增长。
有许多替代的Neovim插件,它们的工作方式略有不同,您可能更喜欢我的设置。AwesomeNeovim项目收集了许多最好和最成熟的插件。
最后,我选择使用neovim内置的LSP客户端,这减少了所需的依赖项数量。如果您优先考虑易用性而不是简单性,您可能更喜欢coc。nvim。插件管理器
将Neovim变成功能齐全的IDE需要使用插件对其进行扩展。我选择packer。nvim作为我的纯Lua插件管理器。要开始,您需要将packer克隆到您的包路径,这是您的Neovim安装找到包的目录。完成此步骤后,packer。nvim将自行管理,从此时起您无需担心packpath。macOS上的默认配置是这样的:gitclonedepth1https:github。comwbthomasonpacker。nvim。localsharenvimsitepackpackerstartpacker。nvim
然后你可以在Lua中编写你的插件规范。例如,使用有效的插件规范编辑文件。confignvimluaplugins。lua,然后在init。lua文件中使用require(plugins)加载该规范。
例如,这是我的plugins。lua文件的内容:returnrequire(packer)。startup(function(use)Packer能自行管理usewbthomasonpacker。nvimusemfusseneggernvimdapusemfusseneggernvimjdtlsusenvimluaplenary。nvimend)
Packer非常复杂,允许您指定依赖项和设置插件作为插件规范的一部分,但我发现单独设置更复杂的插件并让packer简单地处理安装更简单。像往常一样,使用您自己的判断并根据需要调整。
一旦你有一个有效的packer配置,在。confignviminit。lua你可以使用require(plugins)导入规范。从那里执行:PackerInstall命令来安装您在规范中列出的任何插件。
如果您正在通过本指南将Noevim设置为JavaIDE,最简单的方法是一次添加一个插件,了解如何配置它、如何使用它以及它提供的功能,然后添加更多插件。通过这种方式,您可以更好地了解您对Neovim环境所做的更改,而不会不知所措。语言服务eclipse。jdt。ls
NeovimIDE体验的核心是由语言服务器协议提供的。要启用对语言的类似IDE的支持,需要运行语言服务器。对于Java,事实上的标准是eclipse。jdt。lsEclipseJDT语言服务器。
您可以在macOS上使用Homebrew安装它,确保记下安装位置(特别是版本号):brewinstalljdtls。。。Pouringjdtls1。18。0。all。bottle。tar。gzopthomebrewCellarjdtls1。18。0:99files,42。8MB
在我的机器上,安装位置是opthomebrewCellarjdtls1。18。0,稍后我们将需要它来设置LSP客户端。语言服务客户端Neovim和nvimjdtls
Neovim开箱即用地支持语言服务器协议(LSP),充当LSP服务器的客户端,并包含一个名为vim。lsp的Lua框架,用于构建增强的LSP工具。开始使用内置客户端的一般建议是使用nvimlspconfig,它为许多不同的语言提供默认配置。
某些语言具有支持更丰富的LSP功能的插件。Java就是其中之一。nvimjdtls为内置的LSP客户端提供扩展,例如组织导入、提取变量和代码生成。nvimlspconfig和nvimjdtls都使用Neovim内置的客户端,主要区别在于nvimjdtls添加了一些额外的处理程序和功能,并简化了配置。使用nvimjdtls的优点之一是,一旦启动并运行,您可以使用您可能已经用于其他语言的相同Neovim键绑定和客户端功能,而无需学习特定于插件的交互方式。
下图来自nvimjdtls文档,显示了它与nvimlspconfig的不同之处。两者都使用Neovim内置的Lua绑定,但设置和配置略有不同。nvimjdtlsnvimlspconfigstartorattachnvimlsp。jdtls。setupsetupjavafiletypehookvim。lsp
配置nvimjdtls可能会令人生畏。以下示例配置被注释以显示我如何在我的开发机器上设置nvimjdtls。大多数选项直接来自EclipseJDTLS文档并且特定于jdtls。localhomeos。getenv(HOME)localjdtlsrequire(jdtls)表示Java项目根目录的文件类型。eclipse将使用它来确定什么构成工作区localrootmarkers{gradlew,mvnw,。git}localrootdirrequire(jdtls。setup)。findroot(rootmarkers)eclipse。jdt。ls将项目特定数据存储在一个文件夹中。如果您正在处理多个不同的项目,每个项目都必须使用专用的数据目录。此变量用于配置eclipse,以使用使用rootmarker找到的当前项目的目录名称作为项目特定数据的文件夹。localworkspacefolderhome。。。localshareeclipse。。vim。fn。fnamemodify(rootdir,:p:h:t)用于创建键盘映射的辅助函数functionnnoremap(rhs,lhs,bufopts,desc)bufopts。descdescvim。keymap。set(n,rhs,lhs,bufopts)endonattach函数用于在语言服务器附加到当前缓冲区后设置键映射localonattachfunction(client,bufnr)RegularNeovimLSPclientkeymappingslocalbufopts{noremaptrue,silenttrue,bufferbufnr}nnoremap(gD,vim。lsp。buf。declaration,bufopts,Gotodeclaration)nnoremap(gd,vim。lsp。buf。definition,bufopts,Gotodefinition)nnoremap(gi,vim。lsp。buf。implementation,bufopts,Gotoimplementation)nnoremap(K,vim。lsp。buf。hover,bufopts,Hovertext)nnoremap(Ck,vim。lsp。buf。signaturehelp,bufopts,Showsignature)nnoremap(spacewa,vim。lsp。buf。addworkspacefolder,bufopts,Addworkspacefolder)nnoremap(spacewr,vim。lsp。buf。removeworkspacefolder,bufopts,Removeworkspacefolder)nnoremap(spacewl,function()print(vim。inspect(vim。lsp。buf。listworkspacefolders()))end,bufopts,Listworkspacefolders)nnoremap(spaceD,vim。lsp。buf。typedefinition,bufopts,Gototypedefinition)nnoremap(spacern,vim。lsp。buf。rename,bufopts,Rename)nnoremap(spaceca,vim。lsp。buf。codeaction,bufopts,Codeactions)vim。keymap。set(v,spaceca,ESCCMDluavim。lsp。buf。rangecodeaction()CR,{noremaptrue,silenttrue,bufferbufnr,descCodeactions})nnoremap(spacef,function()vim。lsp。buf。format{asynctrue}end,bufopts,Formatfile)jdtls提供的Java扩展nnoremap(Co,jdtls。organizeimports,bufopts,Organizeimports)nnoremap(spaceev,jdtls。extractvariable,bufopts,Extractvariable)nnoremap(spaceec,jdtls。extractconstant,bufopts,Extractconstant)vim。keymap。set(v,spaceem,〔〔ESCCMDluarequire(jdtls)。extractmethod(true)CR〕〕,{noremaptrue,silenttrue,bufferbufnr,descExtractmethod})endlocalconfig{flags{debouncetextchanges80,},onattachonattach,Wepassouronattachkeybindingstotheconfigurationmaprootdirrootdir,Settherootdirectorytoourfoundrootmarker这里可以配置eclipse。jdt。ls具体设置这些由eclipse。jdt。ls项目定义,并在启动时传递给eclipse。settings{java{format{settings{使用GoogleJava样式指南进行格式化要使用,请确保从https:github。comgooglestyleguideblobghpageseclipsejavagooglestyle。xml下载文件并将其放在。localshareeclipse目录url。localshareeclipseeclipsejavagooglestyle。xml,profileGoogleStyle,},},signatureHelp{enabledtrue},contentProvider{preferredfernflower},使用fernflower反编译库代码Specifyanycompletionoptionscompletion{favoriteStaticMembers{org。hamcrest。MatcherAssert。assertThat,org。hamcrest。Matchers。,org。hamcrest。CoreMatchers。,org。junit。jupiter。api。Assertions。,java。util。Objects。requireNonNull,java。util。Objects。requireNonNullElse,org。mockito。Mockito。},filteredTypes{com。sun。,io。micrometer。shaded。,java。awt。,jdk。,sun。,},},指定用于组织导入选项sources{organizeImports{starThreshold9999;staticStarThreshold9999;},},代码生成应该如何操作codeGeneration{toString{template{object。className}{{member。name()}{member。value},{otherMembers}}},hashCodeEquals{useJava7Objectstrue,},useBlockstrue,},如果您在具有不同Java版本的项目中进行开发,则需要告诉eclipse。jdt。ls使用您的Java版本的JDK的位置name不是任意的,必须与上面链接中的enumExecutionEnvironment中的元素之一匹配configuration{runtimes{{nameJavaSE17,pathhome。。。asdfinstallsjavacorretto17。0。4。9。1,},{nameJavaSE11,pathhome。。。asdfinstallsjavacorretto11。0。16。9。1,},{nameJavaSE1。8,pathhome。。。asdfinstallsjavacorretto8。352。08。1},}}}},cmd是启动语言服务器的命令。放在这里的就是传递给命令行执行jdtls的东西。注意eclipse。jdt。ls必须用17以上的Java版本启动cmd{home。。。asdfinstallsjavacorretto17。0。4。9。1binjava,Declipse。applicationorg。eclipse。jdt。ls。core。id1,Dosgi。bundles。defaultStartLevel4,Declipse。productorg。eclipse。jdt。ls。core。product,Dlog。protocoltrue,Dlog。levelALL,Xmx4g,addmodulesALLSYSTEM,addopens,java。basejava。utilALLUNNAMED,addopens,java。basejava。langALLUNNAMED,如果您使用lombok,请下载lombokjar并将其放在。localshareeclipse中javaagent:。。home。。。localshareeclipselombok。jar,jar文件位于安装jdtls的位置。这将需要更新到您安装jdtls的位置jar,vim。fn。glob(opthomebrewCellarjdtls1。18。0libexecpluginsorg。eclipse。equinox。launcher。jar),jdtls的配置也放在安装jdtls的地方。这将需要根据您的环境进行更新configuration,opthomebrewCellarjdtls1。18。0libexecconfigmac,使用上面定义的workspacefolder来存储这个项目的数据data,workspacefolder,},}最后,启动jdtls。这将使用我们指定的配置运行语言服务器,设置键映射,并将LSP客户端附加到当前缓冲区jdtls。startorattach(config)
要使用此配置启动jdtls,请将上面的文件放在文件夹。configvimftpluginjava。lua中。每当将Java类型的文件加载到当前缓冲区中时,Neovim将自动执行此代码。(ftplugin是文件类型插件的简写)。
虽然配置看起来很多,但可以分解成几个部分。首先,我们为LSP客户端创建所需的键映射。然后我们指定要传递给eclipse。jdt。ls的选项,最后,我们设置用于启动eclipse。jdt。ls的命令。一旦我们获得该配置,我们将其作为参数传递给jdtls。startorattach,它将启动语言服务器或附加到现有的运行实例(如果服务器已经启动)。
假设您能够启动并运行jdtls,以下截屏视频显示了如何使用jdtls提取方法。可用的代码操作是使用telescope。nvim呈现的。
调试nvimdap
调试适配器协议(DAP)是语言服务器协议的配套项目。调试适配器协议(DAP)背后的想法是抽象出开发工具的调试支持如何与调试器或运行时通信。因为许多语言已经存在调试器,所以DAP与适配器一起工作以将现有调试器或运行时与调试适配器协议相匹配,而不是假设需要编写新的调试器来匹配协议。
nvimdap是一个DAP客户端实现。与调试适配器一起工作,nvimdap可以启动应用程序进行调试、附加到正在运行的应用程序、设置断点、逐步执行代码以及检查应用程序的状态。
nvimdap需要一个调试适配器作为nvimdap(客户端)和特定语言调试器之间的促进者。下图来自nvimdap文档,显示了这些部分如何交互。DAPClientDebugAdapterDebuggerDebugee(nvimdap)(perlanguage)(perlanguage)(yourapp)ImplementationspecificcommunicationDebugadapteranddebuggercouldbethesameprocessCommunicationviatheDebugAdapterProtocol
与LSP协议一样,DAP协议需要我们安装额外的组件。不幸的是,也许由于DAP协议相对不成熟,该过程比LSP服务器涉及更多。
Java调试服务器是Github上可用的调试适配器协议的实现。该实现基于Java调试接口(JDI)。它作为插件与EclipseJDT语言服务器一起工作,通过将调试服务器包装在与jdtls一起工作的Eclipse插件中来提供调试功能。要将javadebug注册为Eclipse插件,我们需要将jar文件的位置作为初始化选项传递给Eclipse。这需要首先编译插件,然后配置Eclipse以使用插件。
编译插件是通过Maven完成的:克隆javadebug导航到克隆的存储库(cdjavadebug)运行。mvnw全新安装
完成后,您可以将jar文件的位置作为Eclipse的配置选项传递。您的jdtls配置需要扩展如下:localbundles{vim。fn。glob(pathtojavadebugcom。microsoft。java。debug。plugintargetcom。microsoft。java。debug。plugin。jar),}localconfig{。。。onattachonattach,initoptions{bundlesbundles},。。。}
然后,您需要通知nvimjdtls调试适配器可供使用。在你的onattach函数中,添加require(jdtls)。setupdap()让它注册一个java适配器。config〔onattach〕function(client,bufnr)使用hotcodereplaceauto调试适配器将尝试立即应用您在调试会话期间所做的代码更改。如果不需要,请删除该选项。require(jdtls)。setupdap({hotcodereplaceauto})end
nvimdap支持用于在VisualStudioCode中配置调试适配器的launch。json文件格式的子集。要加载launch。json文件,请使用dap。ext。vscode模块中的loadlaunchjs函数。以下代码将加载当前项目中可用的启动配置:require(dap。ext。vscode)。loadlaunchjs()
最后,您需要配置调试键映射。这些是我使用的,您可能需要编辑它们以满足您的需要。functionnnoremap(rhs,lhs,bufopts,desc)bufopts。descdescvim。keymap。set(n,rhs,lhs,bufopts)endnvimdapnnoremap(leaderbb,cmdluarequiredap。togglebreakpoint()cr,Setbreakpoint)nnoremap(leaderbc,cmdluarequiredap。setbreakpoint(vim。fn。input(Breakpointcondition:))cr,Setconditionalbreakpoint)nnoremap(leaderbl,cmdluarequiredap。setbreakpoint(nil,nil,vim。fn。input(Logpointmessage:))cr,Setlogpoint)nnoremap(leaderbr,cmdluarequiredap。clearbreakpoints()cr,Clearbreakpoints)nnoremap(leaderba,cmdTelescopedaplistbreakpointscr,Listbreakpoints)nnoremap(leaderdc,cmdluarequiredap。continue()cr,Continue)nnoremap(leaderdj,cmdluarequiredap。stepover()cr,Stepover)nnoremap(leaderdk,cmdluarequiredap。stepinto()cr,Stepinto)nnoremap(leaderdo,cmdluarequiredap。stepout()cr,Stepout)nnoremap(leaderdd,cmdluarequiredap。disconnect()cr,Disconnect)nnoremap(leaderdt,cmdluarequiredap。terminate()cr,Terminate)nnoremap(leaderdr,cmdluarequiredap。repl。toggle()cr,OpenREPL)nnoremap(leaderdl,cmdluarequiredap。runlast()cr,Runlast)nnoremap(leaderdi,function()requiredap。ui。widgets。hover()end,Variables)nnoremap(leaderd?,function()localwidgetsrequiredap。ui。widgets;widgets。centeredfloat(widgets。scopes)end,Scopes)nnoremap(leaderdf,cmdTelescopedapframescr,Listframes)nnoremap(leaderdh,cmdTelescopedapcommandscr,Listcommands)
遗憾的是,javadebug项目不支持调试测试,我们需要为此设置另一个插件。值得庆幸的是,它遵循类似的过程。为了能够调试测试,有必要使用我们用于javadebug的相同过程从vscodejavatest安装包:
首先从项目构建jar文件。克隆存储库导航到文件夹(cdvscodejavatest)运行npm安装运行npmrunbuildplugin
然后,扩展nvimjdtls配置中的包以包含来自vscodejavatest的包:这个bundle定义和上一节(javadebug安装)一样localbundles{vim。fn。glob(pathtojavadebugcom。microsoft。java。debug。plugintargetcom。microsoft。java。debug。plugin。jar,1),};Thisisthenewpartvim。listextend(bundles,vim。split(vim。fn。glob(pathtovscodejavatestserver。jar,1),))localconfig{。。。onattachonattach,initoptions{bundlesbundles},。。。}
这公开了我使用以下键映射配置的nvimjdtls可用的两个新功能。nnoremap(leadervc,jdtls。testclass,bufopts,Testclass(DAP))nnoremap(leadervm,jdtls。testnearestmethod,bufopts,Testmethod(DAP))
以下截屏视频显示了使用nvimdap运行和调试测试。命中断点后,我打开范围视图以检查当前堆栈帧的状态。
代码补全nvimcmp
创建全功能IDE体验所需的下一个功能是代码完成。为此,我求助于Neovim的通用补全插件nvimcmp。nvimcmp作为一个核心插件使用补全源进行扩展。源可以是代码片段、LSP符号或来自当前缓冲区的单词。
要开始使用nvimcmp,首先安装nvimcmp插件以及您需要的任何补全源。在这里,我安装了nvimcmp以及我使用的lsp和代码片段源。returnrequire(packer)。startup(function(use)。。。usehrsh7thnvimcmpusehrsh7thcmpnvimlspusehrsh7thcmpvsnipusehrsh7thvimvsnip。。。end)
语言服务器根据客户端的能力提供不同的完成结果。nvimcmp比Neovim默认的omnifunc支持更多类型的完成候选,因此我们必须通告发送到服务器的可用功能,以便它可以在完成请求期间提供这些候选。这些功能是通过辅助函数require(cmpnvimlsp)。defaultcapabilities提供的,可以将其添加到我们的jdtls配置中。nvimcmp支持额外的LSP功能,因此我们需要将其通告给LSP服务器。localcapabilitiesvim。lsp。protocol。makeclientcapabilities()capabilitiesrequire(cmpnvimlsp)。defaultcapabilities(capabilities)localconfig{。。。capabilitiescapabilities,onattachonattach,。。。}
然后,我们需要配置nvimcmp本身。以下代码片段命名了我们要使用的补全源、我们正在使用的代码片段插件,并配置了Tab键以循环显示补全选项和Enter键以选择补全。localcmprequire(cmp)cmp。setup{sources{{namenvimlsp},{namenvimlspsignaturehelp},{namevsnip},},snippet{expandfunction(args)vim。fn〔vsnipanonymous〕(args。body)因为我们使用的是vsnipcmp插件end,},mappingcmp。mapping。preset。insert({〔Cd〕cmp。mapping。scrolldocs(4),〔Cf〕cmp。mapping。scrolldocs(4),〔CSpace〕cmp。mapping。complete(),〔CR〕cmp。mapping。confirm{behaviorcmp。ConfirmBehavior。Replace,selecttrue,},〔Tab〕cmp。mapping(function(fallback)ifcmp。visible()thencmp。selectnextitem()elsefallback()endend,{i,s}),〔STab〕cmp。mapping(function(fallback)ifcmp。visible()thencmp。selectprevitem()elsefallback()endend,{i,s}),}),}
而且,如果您想在完成结果旁边显示符号,请安装onsailslspkind。nvim插件,并通过在我们的cmp配置中添加格式化块来配置它。locallspkindrequire(lspkind)cmp。setup{。。。formatting{formatlspkind。cmpformat({modesymboltext,maxwidth50,ellipsischar。。。,beforefunction(,vimitem)returnvimitemend})}。。。}
在下面的截屏视频中,我展示了nvimcmp如何显示LSP协议给出的可用补全集。每个完成类型旁边的图标来自lspkind。
查找telescopenvim
telescope。nvim是一个高度可扩展的列表模糊查找器。telescope提供用于从列表中过滤和选择项目的界面和功能。像nvimcmp一样,telescope可以通过添加telescope将显示和过滤的额外列表源来扩展。
我的望远镜配置使用fzf来提高性能,这需要使用以下配置安装telescopefzfnative:use{nvimtelescopetelescopefzfnative。nvim,runmake}
使用Java项目时,默认项目结构会导致目录名称过长。要截断目录名称并使用fzf提高性能,我使用以下配置:require(telescope)。setup({defaults{pathdisplay{shorten{len3,exclude{1,1}},truncatetrue},dynamicpreviewtitletrue,},extensions{fzf{fuzzytrue,falsewillonlydoexactmatchingoverridegenericsortertrue,overridethegenericsorteroverridefilesortertrue,overridethefilesortercasemodesmartcase,orignorecaseorrespectcasethedefaultcasemodeissmartcase}}})require(telescope)。loadextension(fzf)
我大量使用了telescope,并使用一组以f为前缀的键映射来查找。telescopennoremap(leaderff,cmdTelescopefindfilescr,Findfile)nnoremap(leaderfg,cmdTelescopelivegrepcr,Grep)nnoremap(leaderfb,cmdTelescopebufferscr,Findbuffer)nnoremap(leaderfm,cmdTelescopemarkscr,Findmark)nnoremap(leaderfr,cmdTelescopelspreferencescr,Findreferences(LSP))nnoremap(leaderfs,cmdTelescopelspdocumentsymbolscr,Findsymbols(LSP))nnoremap(leaderfc,cmdTelescopelspincomingcallscr,Findincomingcalls(LSP))nnoremap(leaderfo,cmdTelescopelspoutgoingcallscr,Findoutgoingcalls(LSP))nnoremap(leaderfi,cmdTelescopelspimplementationscr,Findimplementations(LSP))nnoremap(leaderfx,cmdTelescopediagnosticsbufnr0cr,Finderrors(LSP))
在此截屏视频中,我展示了如何将telescope用作文件浏览器来快速查找和打开文件。
文件结构symbolsoutline
我利用我们的文件结构的另一个IDE功能。此功能提供当前文件中符号的分层树状视图以及它们之间的关系。为此,我求助于一个相对简单的插件,称为symbolsoutline。默认选项适用于我的用例,有一个小的补充:当我做出选择时自动关闭大纲。我使用以下配置来自动关闭大纲:require(symbolsoutline)。setup{autoclosetrue,}
以下键映射还可以使用CTRLSHIFT右箭头和CTRLSHIFT左箭头轻松调整轮廓大小。窗口管理nnoremap(CSRight,cmd:verticalresize1cr,Minimizewindow)nnoremap(CSLeft,cmd:verticalresize1cr,Maximizewindow)
在这个截屏视频中,我打开一个文件,然后使用大纲插件浏览顶级符号,然后选择一个跳转到。
文件浏览nvimtree
nvimtree插件是一个用Lua编写的文件浏览器。安装后,我使用以下键映射打开和关闭文件浏览器:nvimtreennoremap(leadernn,cmdNvimTreeTogglecr,Openfilebrowser)nnoremap(leadernf,cmdNvimTreeFindFilecr,Findinfilebrowser)
我还禁用了netrw,因为我不使用它,它可能与nvimtree冲突。我还将文件浏览器窗口配置为在我进行选择时自动关闭,并自动将其调整为正确的宽度。require(nvimtree)。setup({disablenetrwtrue,view{adaptivesizetrue,float{enabletrue,},},actions{openfile{quitonopentrue,}}})
下面的截屏视频显示了nvimtree被用作文件浏览器。
状态栏lualine
lualine是一个用Lua编写的状态行插件。statusline插件显示有关当前文件的有用信息,例如文件类型、git分支和编码。我对lualine所做的唯一更改是将主题设置为与我的终端颜色主题相匹配:require(lualine)。setup{options{themeonedark},}最终结果
语言服务器协议为开发全功能IDE提供了极好的支柱。在Neovim中添加LSP客户端,以及有助于用户界面的插件,完成了我的目标。在花了一些时间进行我在这篇文章中描述的配置和设置之后,我已经能够将Neovim变成我用作日常工作环境的JavaIDE。