Lua-中-Nvim-API

A web blog

vim.validate

用于判断一个值和类型是否符合预期, 或者一个值在处理后是否符合预期:

若想要检验 “Hello World” 这个值是否为 “string” 则利用 vim.validate 为:

1
vim.validate{test={"Hello World", "string"}}

(键值随便取)

若不符合预期则会报错.

也可以同时检验多个值, 如:

1
vim.validata{bool_var={true, "boolean"}, table_var={{'test'}, "table"}}

另一种写法是 (arg_value, fn, msg), 利用 fn 来检验一个值是否符合预期:

1
vim.validate{arg1={3, function(a) return (a % 2) == 0 end, 'even number'}}

清空一个 buffer

1
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, {})

关闭一个 window

1
vim.api.nvim_win_close(winid, true)

第二个参数为是否强制关闭.

去除一个 keymap

1
vim.api.nvim_buf_del_keymap(buf, mode, keymapping)

清除 highlight

需要用到 vim.api.nvim_buf_clear_namespace(), 而不能用 vim.api.nvim_buf_add_highlight() 来覆盖一种颜色

注意 vim.api.nvim_buf_clear_namespace() 似乎至少会清除两行, 此时可以通过为另一行添加颜色来达到清除指定行颜色的效果.

判断一个 path 是否为目录

1
local isDir = vim.fn.isdirectory(path)

注意 isDir 这里是一个 number 而不是 bool 值.

获取光标所在行的行号

1
local lineNr = vim.api.win_get_cursor(0)[1]

获取光标所在行文本

1
local text = vim.api.nvim_get_current_line()

常用 API

  • vim.b, “b” 指 “buffer”, 包含访问当前缓冲区的属性和方法
  • vim.g, “g” 指 “global”, 用于访问和设置全局变量
  • vim.o, “o” 指 “options”, 用于访问和设置选项
  • vim.t, “t” 指 “tabpage”, 用于访问和操作标签页
  • vim.v, “v” 指 “vim”, 用于访问 vim 内部的函数和变量 (也不知道有哪些)
  • vim.w, “w” 指 “window”, 用于访问和操作窗口
  • vim.bo, “bo” 指 “buffer options”, 用于访问缓冲区内的选项
  • vim.fn, “fn” 指 “function”, 用于调用 vim 中的函数
  • vim.go, “go” 指 “global options”, 用于访问和设置全局选项
  • vim.wo, “wo” 指 “window options”, 用于访问和设置窗口的选项
  • vim.api, 访问 Neovim 提供的 API 方法
  • vim.env, 获取环境变量
  • vim.json, 用于处理 JSON 数据
  • vim.loop, 用于处理时间循环
  • vim.cmd(), 执行 vim 命令
  • vim.types, 包含 Neovim Lua API 中的数据类型

获取文件类型

1
local ft = vim.bo.filetype

调用外部脚本

vim.fn.system(), 其返回外部脚本的输出, 如:

1
local output = vim.fn.system("perl /home/jie/scripts/perl/hello.pl")

传递参数如:

1
local output = vim.fn.system("perl /home/jie/scripts/perl/hello.pl " .. "args")

vim.fn.expand 函数的使用

expand 函数的原型为:

1
expand({string} [, {nosuf} [, {list}]])

其接受一个字符串 (或列表) 为参数, 这个字符串不是具体的字符, 而是指示其功能, 让 expand 来获取文件路径、环境变量、当前文件名等信息.

如:

1
expand('<cword>')

的返回值是当前光标下的单词.

1
expand('%')

返回当前文件名.

设置键位映射

格式为:

1
vim.keymap.set(mode, from, to)

如:

1
vim.keymap.set("n", "<C-h>", ":split")

查看对象

三种方法:

  • vim.inspect:
1
:lua print(vim.inspect(package.loaded))
  • vim.print:
1
:lua vim.print(package.loaded)
  • =:
1
:lua =package.loaded

让内容在新的 buffer 中显示:

1.

1
:enew|put=execute('lua =package.loaded')
  1. 1
    2
    3
    :redir @a
    :lua =package.loaded
    :redir END

vim.loop

其包含了 neovim 中的事件循环 (event-loop).

事件循环

通过循环不断地监听事件,并根据事件的类型和优先级执行相应的回调函数或任务

vim.notify

用于显示一个通知, 都输出在 :messages 中:

  • vim.notify, 可多次调用
  • vim.notify_once, 多次调用也只运行一次

plenary.nvim

其提供了一些有用的 Lua 模块:

  • plenary.async
  • plenary.async_lib
  • plenary.job
  • plenary.path
  • plenary.scandir
  • plenary.context_manager
  • plenary.test_harness
  • plenary.filetype
  • plenary.strings

Neovim UI APIs

a web blog

1
:h lua-ui

创建 autocmd

1
2
3
4
5
6
7
8
9
10
vim.api.nvim_create_autocmd("BufWritePre", {
pattern = "*",
callback = function()
if format_on_save_filetypes[vim.bo.filetype] then
local lineno = vim.api.nvim_win_get_cursor(0)
vim.lsp.buf.format({ async = false })
vim.api.nvim_win_set_cursor(0, lineno)
end
end,
})

运行 vimscript

1
vim.cmd ""

获取/设置寄存器中的值

1
2
3
local value = vim.fn.getreg("v")
print(vim.fn.getreg("v"))
vim.fn.setreg("v", "haha")

Lua-中-Nvim-API
http://example.com/2023/09/08/Lua-中-Nvim-API/
作者
Jie
发布于
2023年9月8日
许可协议