diff options
author | Thomas Vigouroux <tomvig38@gmail.com> | 2020-08-11 23:21:15 +0200 |
---|---|---|
committer | Thomas Vigouroux <tomvig38@gmail.com> | 2020-08-13 20:30:15 +0200 |
commit | 9564803d1ad2c618176a917f974fb47ce1c598a9 (patch) | |
tree | 2f7aad273e949dea6653de29f144ce65a1486b08 /runtime/lua/vim/treesitter/query.lua | |
parent | d7b12e58dfc7303dbc06381a9bedd5c3539d5413 (diff) | |
download | rneovim-9564803d1ad2c618176a917f974fb47ce1c598a9.tar.gz rneovim-9564803d1ad2c618176a917f974fb47ce1c598a9.tar.bz2 rneovim-9564803d1ad2c618176a917f974fb47ce1c598a9.zip |
treesitter: add predicate negation
Diffstat (limited to 'runtime/lua/vim/treesitter/query.lua')
-rw-r--r-- | runtime/lua/vim/treesitter/query.lua | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/runtime/lua/vim/treesitter/query.lua b/runtime/lua/vim/treesitter/query.lua index b43c28b0ab..0665a837e9 100644 --- a/runtime/lua/vim/treesitter/query.lua +++ b/runtime/lua/vim/treesitter/query.lua @@ -59,6 +59,7 @@ local predicate_handlers = { return true end, + ["match?"] = function(match, _, bufnr, predicate) local node = match[predicate[2]] local regex = predicate[3] @@ -71,7 +72,6 @@ local predicate_handlers = { end, ["vim-match?"] = (function() - local magic_prefixes = {['\\v']=true, ['\\m']=true, ['\\M']=true, ['\\V']=true} local function check_magic(str) if string.len(str) < 2 or magic_prefixes[string.sub(str,1,2)] then @@ -121,7 +121,7 @@ local predicate_handlers = { -- signature will be (match, pattern, bufnr, predicate) function M.add_predicate(name, handler) if predicate_handlers[name] then - a.nvim_err_writeln("It is recomended to not overwrite predicates.") + a.nvim_err_writeln(string.format("Overriding %s", name)) end predicate_handlers[name] = handler @@ -137,7 +137,14 @@ function Query:match_preds(match, pattern, bufnr) -- continue on the other case. This way unknown predicates will not be considered, -- which allows some testing and easier user extensibility (#12173). -- Also, tree-sitter strips the leading # from predicates for us. - if predicate_handlers[pred[1]] and + if string.sub(pred[1], 1, 4) == "not-" then + local pred_name = string.sub(pred[1], 5) + if predicate_handlers[pred_name] and + predicate_handlers[pred_name](match, pattern, bufnr, pred) then + return false + end + + elseif predicate_handlers[pred[1]] and not predicate_handlers[pred[1]](match, pattern, bufnr, pred) then return false end |