Lua

  • 除了 falsenil, 其它值都为真.
  • 字典定义语法是 {键 = 值}, 如果 为字符串, 不需要加引号,如果为别的类型,必须加上方括号.
  • 引用字典的键的时候,可作为变量名的字符串可以直接使用., 否则要使用 [].
  • 记得给非全局变量加 local
  • for 没有专门的迭代语法. 要用 for 迭代必须用 pairs(返回字典键值对) 和 iparis(返回列表的索引值对) 函数处理要迭代的对象.
  • 注意字典依靠对象 ID 区分不同的键而值相同的数字和字符串都拥有唯一 ID. 但是字典本身就不一样了...... 不要用字典本身作键.
  • require 会在 package.path 搜索指定的报名. package.path 是一个用分号分隔不同路径的字符串. 路径名末尾要加上 ?.lua, 不然你就得在每次 require 的时候加上.lua.
  • 元表的语法只能用坨来形容.
  • Neovim 某些命令接受 range 参数, 为一个二元组指示命令作用的行数范围.
  • Neovim 某些命令接受 count 参数, 为一个整形指定命令的执行次数.
  • Neovim! 命令接受任意数量的参数
  • Neovim 的按下特定键的 APInvim_inputnvim_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>) 这一类.
    • 注意如果设置了 exprreplace_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 命令。