使用 Lua 编写 Neovim,插件你会了吗?

开发 前端
很多时候我们的插件是需要和用户进行交互的,也就是用户输入一些命令之后,我们要能够响应用户的输入,然后来调整我们插件的输出。

在 vim 中 viml 是第一公民,很多插件都是使用 viml 进行开发的,而在 neovim 中,lua 成为了主要的脚本语言,几乎现在 95%以上的 neovim 都是采用 lua 进行开发的。

插件目录结构

开发一款插件,我们首先要明确插件的目录结构,虽然这个结构不是必须固定的,但是遵守一定的规则可以让我们的插件变得更容易被修改,更容易进行扩展。

插件目录一般为一个 plugin 文件夹放入我们的主文件,lua 文件夹放入代码库。

浮动窗口

在 neovim 中,增加了浮动窗口的功能,这样我们显示一些信息非常的方便,我们可以使用 neovim 提供的关于浮动窗口的 api 进行插件的编写。

编写插件的时候,我们一般都会首先定义一些变量,这样方便我们后续的使用。定义好变量之后,我们接下来会根据需求定义我们的函数,一般情况下都是一个功能定义一个函数,每个函数完成一个指定的功能。

图片

此外,需要注意的一点就是,一般插件都是会有一些默认配置的,我们可以定义一些配置默认值,这样用户可以在零配置的情况下就使用我们的插件。

简单的代码如下:

local api = vim.apilocal buf, win
local function open_window() buf = api.nvim_create_buf(false, true) -- create new emtpy buffer
api.nvim_buf_set_option(buf, 'bufhidden', 'wipe')
-- get dimensions local width = api.nvim_get_option("columns") local height = api.nvim_get_option("lines")
-- calculate our floating window size local win_height = math.ceil(height * 0.8 - 4) local win_width = math.ceil(width * 0.8)
-- and its starting position local row = math.ceil((height - win_height) / 2 - 1) local col = math.ceil((width - win_width) / 2)
-- set some options local opts = { style = "minimal", relative = "editor", width = win_width, height = win_height, row = row, col = col }
-- and finally create it with buffer attached win = api.nvim_open_win(buf, true, opts)end

视图更新

几乎所有的插件最后都要更新渲染视图,我们可以根据指定的内容进行视图的更新,一般都是根据执行的一些命令结果来更新视图,在 neovim 中,可以通过vim.fn.systemlist函数获取命令执行结果,然后通过函数api.nvim_buf_set_lines将结果渲染到视图上。


local function update_view()
-- we will use vim systemlist function which run shell
-- command and return result as list
local result = vim.fn.systemlist('git diff-tree --no-commit-id --name-only -r HEAD')

-- with small indentation results will look better
for k,v in pairs(result) do
result[k] = ' '..result[k]
end

api.nvim_buf_set_lines(buf, 0, -1, false, result)
end

插件交互

很多时候我们的插件是需要和用户进行交互的,也就是用户输入一些命令之后,我们要能够响应用户的输入,然后来调整我们插件的输出。

图片

在 neovim 中,我们可以通过api.nvim_buf_set_keymap来进行输入按键的功能绑定。

函数导出

最后,我们可以将我们的插件中的函数进行导出,也就是让它们可以被执行。最后再在主函数中调用它们即可,这样我们的插件就编写完成了。

local function my_plugin()
position = 0 -- if you want to preserve last displayed state just omit this line
open_window()
set_mappings()
update_view(0)
api.nvim_win_set_cursor(win, {4, 0}) -- set cursor on first list entry
end

return {
my_plugin = my_plugin,
update_view = update_view,
open_file = open_file,
move_cursor = move_cursor,
close_window = close_window
}
责任编辑:武晓燕 来源: 程序那些事儿
相关推荐

2023-05-04 08:01:35

umi 插件开发插件

2023-06-26 00:01:11

2024-07-17 09:23:58

Vite插件机制

2024-02-02 11:03:11

React数据Ref

2023-10-30 07:05:31

2023-12-27 07:31:45

json产品场景

2022-11-08 08:45:30

Prettier代码格式化工具

2011-08-23 18:04:40

LuaWiresharkDissector

2024-05-22 08:03:15

2024-08-19 10:24:14

2022-03-11 14:59:21

JavaScript数组字符串

2023-06-15 08:00:23

2022-10-30 10:31:42

i2ccpuftrace

2022-11-21 16:57:20

2024-05-10 08:00:48

K8soperatorGitHub

2022-04-01 08:23:17

InputstreString字符串

2024-01-19 08:25:38

死锁Java通信

2024-02-04 00:00:00

Effect数据组件

2023-07-26 13:11:21

ChatGPT平台工具

2023-01-10 08:43:15

定义DDD架构
点赞
收藏

51CTO技术栈公众号