Vimscrip 和 Lua 的大坑.
Lua
- 除了
false
和nil
, 其它值都为真. - 字典定义语法是
{键 = 值}
, 如果 键 为字符串, 不需要加引号,如果为别的类型,必须加上方括号. - 引用字典的键的时候,可作为变量名的字符串可以直接使用
.
, 否则要使用[]
. - 记得给非全局变量加
local
for
没有专门的迭代语法. 要用for
迭代必须用pairs
(返回字典键值对) 和iparis
(返回列表的索引值对) 函数处理要迭代的对象.- 注意字典依靠对象 ID 区分不同的键而值相同的数字和字符串都拥有唯一 ID. 但是字典本身就不一样了...... 不要用字典本身作键.
require
会在package.path
搜索指定的报名.package.path
是一个用分号分隔不同路径的字符串. 路径名末尾要加上?.lua
, 不然你就得在每次require
的时候加上.lua
.- 元表的语法只能用坨来形容.
- Neovim 某些命令接受 range 参数, 为一个二元组指示命令作用的行数范围.
- Neovim 某些命令接受 count 参数, 为一个整形指定命令的执行次数.
- Neovim 的
!
命令接受任意数量的参数 - Neovim 的按下特定键的 API
为
nvim_input
和nvim_feeedkeys
. 可以配合nvim_replace_termcodes
来输入特殊按键. - 在 Neovim
里创建命令可以使用
vim.api.nvim_create_user_command
. 如果执行命令到时候调用一个函数。函数要记得接受一个opt
参数, 里面的arg
属性才是调用命令时传入的参数. 不幸的是这个参数就是一个字符串,如果函数要处理多个参数必须手动分割. - 在 Neovim
里创建按键映射可以使用
vim.keymap.set
. 如果把按键映射到回调函数, 可以让接受一个opt
参数来解析一些关于按键映射的上下文元数据. 这个函数也可以返回一个字符串代表要按下的键,就像:其中,vim.keymap.set('n', '<CR>', function()
if vim.o.buftype == 'quickfix'
then
return "<CR>"
else
return ":nohlsearch<CR>"
end
end, {expr = true, replace_keycodes = true})expr
意思是接收回调函数的返回值作为按键序列,replace_keycodes
的意思是把解析按键序列中特殊的按键表示法 (<C-M>
,<TAb>
) 这一类.- 注意如果设置了
expr
和replace_keycodes
, 则无法在映射函数中创建新的窗口.
- 注意如果设置了
- Neovim 中发现插入模式中
<C-r>=函数()<CR>
这一类的按键映射都可以改写为一个回调函数返回 函数 的调用结果. - Neovim 中如果要在选项中以字符串形式引用 Lua 函数,
那个函数必须是全局的,且引用的时候要加上
v:lua.
的前缀. - vim 的行是 1 - 索引的。但语言服务器协议中的行是 0 - 索引的。
一些重要的 API
vim.fn.函数名
: 调用 Neovim 的内置函数 函数名.vim.keymap.操作
: 对按键映射进行 操作.
nvim_oxi
- 库入口函数(即使用属性宏
#[nvim_oxi::module]
标记的函数)的名字必须与 Lua 调用时引用的库名相同。 - 返回给 Lua 的元组只能被可变参数完整捕获。
nvim_oxi::Object::from
返回值类型都是统一的nvim_oxi::Object
。但是nvim_oxi::Function::from
返回值类型是不同的nvim_oxi::Function
。
Vimscript
不能跟语法词例的命令有一个共性,
就是它们最后接受的参数是某个模式下的操作或者一个表达式.
这样的命令有可以通过 help :comment
查到.
使用 <cmd><cr>
来包裹按键映射中的
vimscript 命令。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment
GitalkValine