aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/treesitter/query.lua
diff options
context:
space:
mode:
authorThomas Vigouroux <tomvig38@gmail.com>2020-08-11 23:21:15 +0200
committerThomas Vigouroux <tomvig38@gmail.com>2020-08-13 20:30:15 +0200
commit9564803d1ad2c618176a917f974fb47ce1c598a9 (patch)
tree2f7aad273e949dea6653de29f144ce65a1486b08 /runtime/lua/vim/treesitter/query.lua
parentd7b12e58dfc7303dbc06381a9bedd5c3539d5413 (diff)
downloadrneovim-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.lua13
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