refactor!: update to Neovim 0.7 APIs

* set highlight groups via nvim_set_hl
* define autocommands via nvim_create_autocmd
* port plugin/nvim-treesitter.vim to Lua
* port healthcheck to Lua
This commit is contained in:
Christian Clason 2022-04-16 17:49:17 +02:00 committed by Christian Clason
parent bc25a6a5c4
commit 07eb437bb1
8 changed files with 168 additions and 148 deletions

View file

@ -1,3 +0,0 @@
function! health#nvim_treesitter#check()
lua require 'nvim-treesitter.health'.check()
endfunction

View file

@ -100,8 +100,13 @@ local function enable_mod_conf_autocmd(mod)
return
end
local cmd = string.format("lua require'nvim-treesitter.configs'.reattach_module('%s')", mod)
api.nvim_command(string.format("autocmd NvimTreesitter FileType * %s", cmd))
api.nvim_create_autocmd("FileType", {
group = "NvimTreesitter",
callback = function()
require("nvim-treesitter.configs").reattach_module(mod)
end,
desc = "Reattach module",
})
config_mod.loaded = true
end
@ -150,7 +155,7 @@ local function disable_mod_conf_autocmd(mod)
end
-- TODO(kyazdani): detach the correct autocmd... doesn't work when using %s, cmd.
-- This will remove all autocomands!
api.nvim_command "autocmd! NvimTreesitter FileType *"
api.nvim_clear_autocmds { event = "FileType", group = "NvimTreesitter" }
config_mod.loaded = false
end

View file

@ -7,29 +7,26 @@ local shell = require "nvim-treesitter.shell_command_selectors"
local install = require "nvim-treesitter.install"
local utils = require "nvim-treesitter.utils"
local health_start = vim.fn["health#report_start"]
local health_ok = vim.fn["health#report_ok"]
local health_error = vim.fn["health#report_error"]
local health_warn = vim.fn["health#report_warn"]
local health = require "health"
local M = {}
local NVIM_TREESITTER_MINIMUM_ABI = 13
local function install_health()
health_start "Installation"
health.report_start "Installation"
if fn.has "nvim-0.7" == 0 then
health_error "Nvim-treesitter requires Neovim 0.7.0+"
health.report_error "Nvim-treesitter requires Neovim 0.7.0+"
end
if fn.executable "tree-sitter" == 0 then
health_warn(
health.report_warn(
"`tree-sitter` executable not found (parser generator, only needed for :TSInstallFromGrammar,"
.. " not required for :TSInstall)"
)
else
health_ok(
health.report_ok(
"`tree-sitter` found "
.. (utils.ts_cli_version() or "(unknown version)")
.. " (parser generator, only needed for :TSInstallFromGrammar)"
@ -37,7 +34,7 @@ local function install_health()
end
if fn.executable "node" == 0 then
health_warn(
health.report_warn(
"`node` executable not found (only needed for :TSInstallFromGrammar," .. " not required for :TSInstall)"
)
else
@ -45,21 +42,21 @@ local function install_health()
local result = handle:read "*a"
handle:close()
local version = vim.split(result, "\n")[1]
health_ok("`node` found " .. version .. " (only needed for :TSInstallFromGrammar)")
health.report_ok("`node` found " .. version .. " (only needed for :TSInstallFromGrammar)")
end
if fn.executable "git" == 0 then
health_error("`git` executable not found.", {
health.report_error("`git` executable not found.", {
"Install it with your package manager.",
"Check that your `$PATH` is set correctly.",
})
else
health_ok "`git` executable found."
health.report_ok "`git` executable found."
end
local cc = shell.select_executable(install.compilers)
if not cc then
health_error("`cc` executable not found.", {
health.report_error("`cc` executable not found.", {
"Check that any of "
.. vim.inspect(install.compilers)
.. " is in your $PATH"
@ -67,7 +64,7 @@ local function install_health()
})
else
local version = vim.fn.systemlist(cc .. (cc == "cl" and "" or " --version"))[1]
health_ok(
health.report_ok(
"`"
.. cc
.. "` executable found. Selected from "
@ -77,7 +74,7 @@ local function install_health()
end
if vim.treesitter.language_version then
if vim.treesitter.language_version >= NVIM_TREESITTER_MINIMUM_ABI then
health_ok(
health.report_ok(
"Neovim was compiled with tree-sitter runtime ABI version "
.. vim.treesitter.language_version
.. " (required >="
@ -85,7 +82,7 @@ local function install_health()
.. "). Parsers must be compatible with runtime ABI."
)
else
health_error(
health.report_error(
"Neovim was compiled with tree-sitter runtime ABI version "
.. vim.treesitter.language_version
.. ".\n"
@ -141,9 +138,9 @@ function M.check()
x) errors found in the query, try to run :TSUpdate {lang}]]
table.insert(parser_installation, legend)
-- Finally call the report function
health_start(table.concat(parser_installation, "\n"))
health.report_start(table.concat(parser_installation, "\n"))
if #error_collection > 0 then
health_start "The following errors have been detected:"
health.report_start "The following errors have been detected:"
for _, p in ipairs(error_collection) do
local lang, type, err = unpack(p)
local lines = {}
@ -164,7 +161,7 @@ function M.check()
end
end
end
health_error(table.concat(lines, "\n"))
health.report_error(table.concat(lines, "\n"))
end
end
end

View file

@ -195,7 +195,10 @@ local indent_funcs = {}
function M.attach(bufnr)
indent_funcs[bufnr] = vim.bo.indentexpr
vim.bo.indentexpr = "nvim_treesitter#indent()"
vim.api.nvim_command("au Filetype " .. vim.bo.filetype .. " setlocal indentexpr=nvim_treesitter#indent()")
vim.api.nvim_create_autocmd("Filetype", {
pattern = vim.bo.filetype,
command = "setlocal indentexpr=nvim_treesitter#indent()",
})
end
function M.detach(bufnr)

View file

@ -115,21 +115,24 @@ local function print_info_modules(parserlist, module)
api.nvim_buf_set_option(curbuf, "modified", false)
api.nvim_buf_set_option(curbuf, "buftype", "nofile")
api.nvim_exec(
[[
syntax match TSModuleInfoGood //
syntax match TSModuleInfoBad //
syntax match TSModuleInfoHeader /^>>.*$/ contains=TSModuleInfoNamespace
syntax match TSModuleInfoNamespace /^>> \w*/ contained
syntax match TSModuleInfoParser /^[^> ]*\ze /
highlight default TSModuleInfoGood guifg=LightGreen gui=bold
highlight default TSModuleInfoBad guifg=Crimson
highlight default link TSModuleInfoHeader Type
highlight default link TSModuleInfoNamespace Statement
highlight default link TSModuleInfoParser Identifier
]],
false
)
vim.cmd [[
syntax match TSModuleInfoGood //
syntax match TSModuleInfoBad //
syntax match TSModuleInfoHeader /^>>.*$/ contains=TSModuleInfoNamespace
syntax match TSModuleInfoNamespace /^>> \w*/ contained
syntax match TSModuleInfoParser /^[^> ]*\ze /
]]
local highlights = {
TSModuleInfoGood = { fg = "LightGreen", bold = true, default = true },
TSModuleInfoBad = { fg = "Crimson", default = true },
TSModuleInfoHeader = { link = "Type", default = true },
TSModuleInfoNamespace = { link = "Statement", default = true },
TSModuleInfoParser = { link = "Identifier", default = true },
}
for k, v in pairs(highlights) do
api.nvim_set_hl(0, k, v)
end
end
local function module_info(module)

121
plugin/nvim-treesitter.lua Normal file
View file

@ -0,0 +1,121 @@
-- Last Change: 2022 Apr 16
if vim.g.loaded_nvim_treesitter then
return
end
vim.g.loaded_nvim_treesitter = true
-- setup modules
require("nvim-treesitter").setup()
local api = vim.api
-- define autocommands
local augroup = api.nvim_create_augroup("NvimTreesitter", {})
api.nvim_create_autocmd("Filetype", {
pattern = "query",
group = augroup,
callback = function()
api.nvim_clear_autocmds {
group = augroup,
event = "BufWritePost",
}
api.nvim_create_autocmd("BufWritePost", {
group = augroup,
buffer = 0,
callback = function(opts)
require("nvim-treesitter.query").invalidate_query_file(opts.file)
end,
desc = "Invalidate query file",
})
end,
desc = "Reload query",
})
-- define highlights
local highlights = {
TSNone = { default = true },
TSPunctDelimiter = { link = "Delimiter", default = true },
TSPunctBracket = { link = "Delimiter", default = true },
TSPunctSpecial = { link = "Delimiter", default = true },
TSConstant = { link = "Constant", default = true },
TSConstBuiltin = { link = "Special", default = true },
TSConstMacro = { link = "Define", default = true },
TSString = { link = "String", default = true },
TSStringRegex = { link = "String", default = true },
TSStringEscape = { link = "SpecialChar", default = true },
TSStringSpecial = { link = "SpecialChar", default = true },
TSCharacter = { link = "Character", default = true },
TSCharacterSpecial = { link = "SpecialChar", default = true },
TSNumber = { link = "Number", default = true },
TSBoolean = { link = "Boolean", default = true },
TSFloat = { link = "Float", default = true },
TSFunction = { link = "Function", default = true },
TSFuncBuiltin = { link = "Special", default = true },
TSFuncMacro = { link = "Macro", default = true },
TSParameter = { link = "Identifier", default = true },
TSParameterReference = { link = "TSParameter", default = true },
TSMethod = { link = "Function", default = true },
TSField = { link = "Identifier", default = true },
TSProperty = { link = "Identifier", default = true },
TSConstructor = { link = "Special", default = true },
TSAnnotation = { link = "PreProc", default = true },
TSAttribute = { link = "PreProc", default = true },
TSNamespace = { link = "Include", default = true },
TSSymbol = { link = "Identifier", default = true },
TSConditional = { link = "Conditional", default = true },
TSRepeat = { link = "Repeat", default = true },
TSLabel = { link = "Label", default = true },
TSOperator = { link = "Operator", default = true },
TSKeyword = { link = "Keyword", default = true },
TSKeywordFunction = { link = "Keyword", default = true },
TSKeywordOperator = { link = "TSOperator", default = true },
TSKeywordReturn = { link = "TSKeyword", default = true },
TSException = { link = "Exception", default = true },
TSDebug = { link = "Debug", default = true },
TSDefine = { link = "Define", default = true },
TSPreProc = { link = "PreProc", default = true },
TSStorageClass = { link = "StorageClass", default = true },
TSTodo = { link = "Todo", default = true },
TSType = { link = "Type", default = true },
TSTypeBuiltin = { link = "Type", default = true },
TSTypeQualifier = { link = "Type", default = true },
TSTypeDefinition = { link = "Typedef", default = true },
TSInclude = { link = "Include", default = true },
TSVariableBuiltin = { link = "Special", default = true },
TSText = { link = "TSNone", default = true },
TSStrong = { bold = true, default = true },
TSEmphasis = { italic = true, default = true },
TSUnderline = { underline = true },
TSStrike = { strikethrough = true },
TSMath = { link = "Special", default = true },
TSTextReference = { link = "Constant", default = true },
TSEnvironment = { link = "Macro", default = true },
TSEnvironmentName = { link = "Type", default = true },
TSTitle = { link = "Title", default = true },
TSLiteral = { link = "String", default = true },
TSURI = { link = "Underlined", default = true },
TSComment = { link = "Comment", default = true },
TSNote = { link = "SpecialComment", default = true },
TSWarning = { link = "Todo", default = true },
TSDanger = { link = "WarningMsg", default = true },
TSTag = { link = "Label", default = true },
TSTagDelimiter = { link = "Delimiter", default = true },
TSTagAttribute = { link = "TSProperty", default = true },
}
for k, v in pairs(highlights) do
api.nvim_set_hl(0, k, v)
end

View file

@ -1,106 +0,0 @@
" Last Change: 2020 Aug 13
if exists('g:loaded_nvim_treesitter')
finish
endif
augroup NvimTreesitter
" on every query file write we want to set an autocommand that will reload the cache
autocmd FileType query
\ autocmd! NvimTreesitter BufWritePost <buffer> call v:lua.require('nvim-treesitter.query').invalidate_query_file(expand('%:p'))
augroup END
let g:loaded_nvim_treesitter = 1
lua require'nvim-treesitter'.setup()
function s:has_attr(attr, mode)
let norm_color = synIDattr(hlID('Normal'), a:attr, a:mode)
return strlen(norm_color) > 0
endfunction
" if the ctermfg or guifg is not known by nvim then using the
" fg or foreground highlighting value will cause an E419 error
" so we check to see if either highlight has been set if not default to NONE
let cterm_normal = s:has_attr('fg', 'cterm') ? 'fg' : 'NONE'
let gui_normal = s:has_attr('fg', 'gui') ? 'foreground' : 'NONE'
execute 'highlight default TSNone term=NONE cterm=NONE gui=NONE guifg='.gui_normal.' ctermfg='.cterm_normal
highlight default link TSPunctDelimiter Delimiter
highlight default link TSPunctBracket Delimiter
highlight default link TSPunctSpecial Delimiter
highlight default link TSConstant Constant
highlight default link TSConstBuiltin Special
highlight default link TSConstMacro Define
highlight default link TSString String
highlight default link TSStringRegex String
highlight default link TSStringEscape SpecialChar
highlight default link TSStringSpecial SpecialChar
highlight default link TSCharacter Character
highlight default link TSCharacterSpecial SpecialChar
highlight default link TSNumber Number
highlight default link TSBoolean Boolean
highlight default link TSFloat Float
highlight default link TSFunction Function
highlight default link TSFuncBuiltin Special
highlight default link TSFuncMacro Macro
highlight default link TSParameter Identifier
highlight default link TSParameterReference TSParameter
highlight default link TSMethod Function
highlight default link TSField Identifier
highlight default link TSProperty Identifier
highlight default link TSConstructor Special
highlight default link TSAnnotation PreProc
highlight default link TSAttribute PreProc
highlight default link TSNamespace Include
highlight default link TSSymbol Identifier
highlight default link TSConditional Conditional
highlight default link TSRepeat Repeat
highlight default link TSLabel Label
highlight default link TSOperator Operator
highlight default link TSKeyword Keyword
highlight default link TSKeywordFunction Keyword
highlight default link TSKeywordOperator TSOperator
highlight default link TSKeywordReturn TSKeyword
highlight default link TSException Exception
highlight default link TSDebug Debug
highlight default link TSDefine Define
highlight default link TSPreProc PreProc
highlight default link TSStorageClass StorageClass
highlight default link TSTodo Todo
highlight default link TSType Type
highlight default link TSTypeBuiltin Type
highlight default link TSTypeQualifier Type
highlight default link TSTypeDefinition Typedef
highlight default link TSInclude Include
highlight default link TSVariableBuiltin Special
highlight default link TSText TSNone
highlight default TSStrong term=bold cterm=bold gui=bold
highlight default TSEmphasis term=italic cterm=italic gui=italic
highlight default TSUnderline term=underline cterm=underline gui=underline
highlight default TSStrike term=strikethrough cterm=strikethrough gui=strikethrough
highlight default link TSMath Special
highlight default link TSTextReference Constant
highlight default link TSEnvironment Macro
highlight default link TSEnvironmentName Type
highlight default link TSTitle Title
highlight default link TSLiteral String
highlight default link TSURI Underlined
highlight default link TSComment Comment
highlight default link TSNote SpecialComment
highlight default link TSWarning Todo
highlight default link TSDanger WarningMsg
highlight default link TSTag Label
highlight default link TSTagDelimiter Delimiter
highlight default link TSTagAttribute TSProperty

View file

@ -1,6 +1,6 @@
vim.cmd [[set runtimepath+=.]]
vim.cmd [[runtime! plugin/plenary.vim]]
vim.cmd [[runtime! plugin/nvim-treesitter.vim]]
vim.cmd [[runtime! plugin/nvim-treesitter.lua]]
vim.cmd [[au BufRead,BufNewFile *.conf set filetype=hocon]]
vim.cmd [[au BufRead,BufNewFile *.gleam set filetype=gleam]]