【问题标题】:ctags and R regexctags 和 R 正则表达式
【发布时间】:2015-08-25 14:21:58
【问题描述】:

我正在尝试将 ctags 与 R 一起使用。使用 this 我添加的答案

--langdef=R
--langmap=r:.R.r
--regex-R=/^[ \t]*"?([.A-Za-z][.A-Za-z0-9_]*)"?[ \t]*<-[ \t]function/\1/f,Functions/
--regex-R=/^"?([.A-Za-z][.A-Za-z0-9_]*)"?[ \t]*<-[ \t][^f][^u][^n][^c][^t][^i][^o][^n]/\1/g,GlobalVars/ 
--regex-R=/[ \t]"?([.A-Za-z][.A-Za-z0-9_]*)"?[ \t]*<-[ \t][^f][^u][^n][^c][^t][^i][^o][^n]/\1/v,FunctionVariables

到我的.ctags 文件。但是,当尝试使用以下 R 文件生成标签时

x <- 1
foo <- function () {
    y <- 2
    return(y)
}

仅识别函数foo。我还想为变量生成标签(即上面的代码中的xy)。我应该更改 ctags 文件中的正则表达式吗?提前致谢。

【问题讨论】:

  • 您是否安装了插件并修改了您的 .vimrc?
  • @rawr 我在 Vim 上使用 this 标签栏设置。

标签: regex r ctags


【解决方案1】:

这些模式似乎不正确,因为变量只有在分配了一个与“函数”长度相同但不共享任何字符的值时才会被识别。例如:

x <- aaaaaaaa

以下 ctags 配置应该可以正常工作:

--langdef=R
--langmap=R:.R.r
--regex-R=/^[ \t]*"?([.A-Za-z][.A-Za-z0-9_]*)"?[ \t]*<-[ \t]function[ \t]*\(/\1/f,Functions/
--regex-R=/^"?([.A-Za-z][.A-Za-z0-9_]*)"?[ \t]*<-[ \t][^\(]+$/\1/g,GlobalVars/
--regex-R=/[ \t]"?([.A-Za-z][.A-Za-z0-9_]*)"?[ \t]*<-[ \t][^\(]+$/\1/v,FunctionVariables/

这里的想法是函数必须后跟括号,而变量声明则不需要。鉴于正则表达式解析器的限制,此括号必须与关键字“function”出现在同一行中才能使此配置生效。

更新:R 支持将包含在Universal Ctags 中,因此请尝试报告错误和缺失的功能。

【讨论】:

    【解决方案2】:

    原始正则表达式的问题在于它不捕获小于 8 个字符的变量声明/赋值(因为正则表达式需要 8 个字符,这些字符不是按特定顺序的 f-u-n-c-t-i-o-n)。

    Vitor 更新的正则表达式的问题在于,它没有捕获包含括号的变量声明/赋值,这种情况在 R 中很常见。

    还有一个被遗忘的问题是,它们都没有捕获带有

    当我检查Universal Ctags repo 时,虽然计划支持 pcre 正则表达式,正如Issue 519 中提出的那样,并且配置文件中存在注释掉的 pcre 标志,但尚不支持 pcre 类型的正/负不幸的是,ctags 中的lookahead 或lookbehind 表达式。当这种支持开始时,事情会变得容易得多。

    我的解决方案首先考虑到“

    • 不是 f-u-n-c-t-i-o-n 的 8 个字符的序列,后跟任何字符或无字符 (.*)
    • 或最多包含 7 个任意字符的序列 (.{1,7})

    我提出的正则表达式模式是这样的:

    --langdef=R
    --langmap=R:.R.r
    --regex-R=/^[ \t]*"?([.A-Za-z][.A-Za-z0-9_]*)"?[ \t]*<-[ \t]function[ \t]*\(/\1/f,Functions/
    --regex-R=/^"?([.A-Za-z][.A-Za-z0-9_]*)"?[ \t]*<{1,2}-[ \t]([^f][^u][^n][^c][^t][^i][^o][^n].*|.{1,7}$)/\1/g,GlobalVars/ 
    --regex-R=/[ \t]"?([.A-Za-z][.A-Za-z0-9_]*)"?[ \t]*<{1,2}-[ \t]([^f][^u][^n][^c][^t][^i][^o][^n].*|.{1,7}$)/\1/v,FunctionVariables/
    

    我的测试表明,它捕获的对象比以前的要多。

    编辑: 即使这些也没有捕获声明为函数参数的变量。由于 ctags 正则表达式进行非贪婪搜索并且非捕获组不起作用,因此结果仍然有限。但我们至少可以捕获函数的第一个参数,并将它们定义为一个附加类型,即 Arguments:

    --regex-R=/.+function[ ]*\([ \t]*(,*([^,= \(\)]+)[,= ]*)/\2/a,Arguments/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 2022-06-16
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      相关资源
      最近更新 更多