在vim中,viml是第一公民,很多插件都是使用viml开发的,而在neovim中,lua已经成为主要的脚本语言,几乎95%以上的neovim都是使用lua开发的。插件目录结构开发一个插件,首先要明确插件的目录结构。虽然这个结构不一定是固定的,但是遵循一定的规则可以让我们的插件更容易被修改和扩展。插件目录一般是一个plugin文件夹放到我们的主文件里,一个lua文件夹放到代码库里。悬浮窗在neovim中,增加了悬浮窗的功能,这样我们可以很方便的展示一些信息,我们可以使用neovim提供的悬浮窗的api来写插件。在写插件的时候,我们通常会先定义一些变量,方便我们后续的使用。定义好变量之后,我们就可以根据需求来定义我们的函数了。一般来说,一个函数定义一个函数,每个函数完成一个指定的功能。另外需要注意一点,一般插件都会有一些默认的配置。我们可以定义一些配置默认值,这样用户不需要任何配置就可以使用我们的插件。简单的代码如下:localapi=vim.apilocalbuf,winlocalfunctionopen_window()buf=api.nvim_create_buf(false,true)--createnewemtpybufferapi.nvim_buf_set_option(buf,'bufhidden','wipe')--获取尺寸localwidth=api.nvim_get_option("columns")localheight=api.nvim_get_option("lines")--计算我们的浮动窗口大小localwin_height=math.ceil(height*0.8-4)localwin_width=math.ceil(width*0.8)--及其起始位置localrow=math.ceil((height-win_height)/2-1)localcol=math.ceil((width-win_width)/2)--设置一些选项localopts={style="minimal",relative="editor",width=win_width,height=win_height,row=row,col=col}--finallycreateitwithbufferattachedwin=api.nvim_open_win(buf,true,opts)endviewupdate几乎所有的插件都会在最后更新渲染视图。我们可以根据指定的内容更新视图。通常,视图会根据某些命令的执行结果进行更新。在neovim中,可以通过vim.fn.systemlist函数获取命令执行结果,然后通过函数api.nvim_buf_set_lines将结果渲染到视图。localfunctionupdate_view()--我们将使用运行shell--命令的vimsystemlist函数并将结果作为列表返回localresult=vim.fn.systemlist('gitdiff-tree--no-commit-id--name-only-rHEAD')--缩进小的结果对于k,v成对看起来更好(result)doresult[k]=''..result[k]endapi.nvim_buf_set_lines(buf,0,-1,false,result)endplugininteraction很多时候我们的插件需要和用户进行交互,也就是用户输入一些命令后,我们需要能够响应用户的输入,然后调整我们插件的输出。在neovim中,我们可以使用api.nvim_buf_set_keymap来绑定输入键的功能。函数导出最后,我们可以导出我们插件中的函数,也就是让它们可执行。最后只要在main函数中调用它们,这样我们的插件就写好了。localfunctionmy_plugin()position=0--如果你想保留最后显示的状态,只需省略这一行open_window()set_mappings()update_view(0)api.nvim_win_set_cursor(win,{4,0})--首先设置光标listentryendreturn{my_plugin=my_plugin,update_view=update_view,open_file=open_file,move_cursor=move_cursor,close_window=close_window}
