2 个版本
0.0.2 | 2023 年 6 月 24 日 |
---|---|
0.0.1 | 2023 年 6 月 20 日 |
在 文本编辑器 中排名 #269
用于 luau-ast-rs
715KB
29K SLoC
tree-sitter-luau
tree-sitter 的 Luau 语法
在 helix 编辑器 中部署
- 如果不存在,创建
languages.toml
文件(文档) - 在
languages.toml
中添加两个条目
[[language]]
name = "luau"
scope = "source.luau"
injection-regex = "^luau$"
file-types = ["luau", "server.lua", "client.lua"]
comment-token = "--"
indent = { tab-width = 2, unit = " "}
# language-server = { command = "luau-lsp", args = ["lsp", "--definitions=<path-to-robloxTypes.d.lua>"] }
roots = [ "aftman.toml", "default.project.json", "wally.toml" ]
[[grammar]]
name = "luau"
source = { git = "https://github.com/polychromatist/tree-sitter-luau" }
- 运行
.\scripts\clone_helix_queries.ps1
(或手动从.\helix-queries\
克隆到<helix-config>\runtime\queries\luau
) - 运行
hx --grammar fetch
&&hx --grammar build
关于 Neovim 的情况说明
nvim-treesitter 包含了一个 Luau 解析器,如果直接覆盖可能会引起冲突。请参见相关问题。因此,脚本 scripts/clone_queries.ps1
现在是错误的,已被移除。截至 2023 年 5 月 13 日,nvim-treesitter 包含的解析器还算不错,但并非完全正确。这不是我的解析器。以下是我用来覆盖它的方法。
在 neovim 中部署,v2
- 需要有 C/C++ 编译器和 Node.js
- 安装 nvim-treesitter,并确保其配置正确
- 将此仓库克隆或下载到某处
- 在 init.lua 文件(或等效文件)中使用以下代码片段注册解析器
local parser_config = require "nvim-treesitter.parsers".get_parser_configs()
local myhome = os.getenv "USERPROFILE" or os.getenv "HOME" -- user profile path, if needed
local mypath = "CHANGE_THIS"
-- Example: -- local mypath = myhome .. "/techstuff/hunter2/cloned_repos"
parser_config.luau = { install_info = { url = mypath .. "/tree-sitter-luau", files = {"src/parser.c", "src/scanner.c"}, -- generate_requires_npm = false, -- requires_generate_from_grammar = false }, }
- 在 Neovim 配置目录中执行 Ex 命令
:TSInstall luau
- 例如,在 Neovim 配置目录(例如:%LOCALAPPDATA%\nvim)
- 添加一个名为 `ftdetect\luau.vim` 的文件,内容如下
au BufRead,BufNewFile *.luau set filetype=luau
- 通过在 nvim init.lua 文件中添加第二个代码段来覆盖查询
-- set queries for luau. parser_config segment should be above do for i, v in pairs{"highlights", "indents", "folds", "injections", "locals"} do local fd = io.open(mypath .. "/tree-sitter-luau/nvim-queries/" .. v .. ".scm") local txt = fd:read"*a" fd:close() vim.treesitter.query.set("luau", v, txt) end end
部署 luau-lsp 以提供高质量的代码检查
- 下载或编译 luau-lsp:https://github.com/JohnnyMorganz/luau-lsp/releases
- 确保项目根目录中有一个 `aftman.toml`、`wally.toml` 或 `default.project.json` 文件
- 修改此 lsp 配置模板并将其放入 init.lua 文件
local MY_LUAU_LSP_PATH = "C:\\bin\\luau-lsp.exe" local MY_DIAGNOSTIC_KEY = "" -- ctrl N local MY_LOOKUP_KEY = "K" -- shift K
-- LSP Diagnostics Options Setup local sign = function(opts) vim.fn.sign_define(opts.name, { texthl = opts.name, text = opts.text, numhl = '' }) end
sign({name = 'DiagnosticSignError', text = ''}) sign({name = 'DiagnosticSignWarn', text = ''}) sign({name = 'DiagnosticSignHint', text = ''}) sign({name = 'DiagnosticSignInfo', text = ''})
vim.diagnostic.config({ virtual_text = false, signs = true, update_in_insert = true, underline = true, severity_sort = false, float = { border = 'rounded', source = 'always', header = '', prefix = '', }, })
-- overwrite keymap on LSP enabled buffers vim.api.nvim_create_autocmd('LspAttach', { callback = function(args) vim.keymap.set('n', MY_LOOKUP_KEY, vim.lsp.buf.hover, { buffer = args.buf }) vim.keymap.set('n', MY_DIAGNOSTIC_KEY, function() vim.diagnostic.open_float(nil, { focusable = false }) end, {buffer = true}) end })
-- autocmd-event LSP Server Start Callback function _G.start_luau_lsp() vim.lsp.start({ name = 'nvim-luau-lsp', cmd = {MY_LUAU_LSP_PATH, 'lsp'}, root_dir = vim.fs.dirname(vim.fs.find({'aftman.toml', 'wally.toml', 'default.project.json'}, { upward = true })[1]) }) end
-- enable signcolumn and register autocmd-event vim.cmd([[ set signcolumn=yes au BufRead,BufNewFile *.luau lua _G.start_luau_lsp() ]])
依赖项
~2.8–4MB
~72K SLoC