我使用 nvim 和
nvim-treesitter
,我想对 elixir 文件中的 SQL 字符串应用语法高亮。但只有当相应的 SQL 函数被导入时,因为我不想匹配任何名为 execute
的 'ol 函数。例如
defmodule Hello do
use Ecto.Migration
def up do
print "hello"
execute """
alter table foo
add constraint foo_pos check (foo > 0),
add constraint bar_neg check (bar < 0)
"""
end
end
在这里,查询:
(call
target: (identifier) @fn-name (#eq? @fn-name "execute")
(arguments
(string
(quoted_content) @str)))
匹配字符串的正确部分,并且不会触发
print
例如
但这也匹配:
defmodule Bar do
def execute(str) do
# This is my own function named execute
end
def do_bar do
execute "not a SQL string"
end
end
我想写这样的东西:
(call
target: (identifier) @defmodule-fn (#eq? @defmodule-fn "defmodule")
(do_block
(call
target: (identifier) @use-fn (#eq? @use-fn "use")
(arguments
(alias) @alias (#eq? @alias "Ecto.Migration")))
(call
target: (identifier) @fn-name (#eq? @fn-name "execute")
(arguments
(string
(quoted_content) @str)))))
所以它只会开始匹配
execute
函数,只有当use Ecto.Migration
出现在模块中时。
该代码同时匹配,
use Ecto.Migration
作为@use-fn
和execute
参数作为@str
。不是我想要的。
对于这个模式匹配问题,我期待某种“和”逻辑运算符
附言另外,如果只有当我在相应的项目目录中启动 nvim 时才能添加注入,知道那会很棒。我可以使用本地
.nvimrc.lua
文件在项目启动时运行代码