Vim,C ++,查找成员函数

时间:2010-03-10 18:46:08

标签: c++ vim

我正在使用vim 7.x

我正在使用备用文件。

我有* .hpp< - >的映射*的.cpp

假设我在

class Foo {

  void some_me#mber_func(); // # = my cursor

}

在Foo.hpp中

有没有办法告诉vim执行以下操作:

  1. 在#下抓住单词(easy,expand(“”)
  2. 查看我所在的课程(“Foo”)< - 我不知道该怎么做
  3. 追加“1& 2(简单:使用“。”) - > “富:: some_member_func” 4:切换文件(简单,:A)
  4. a / on 4
  5. 基本上,我可以将所有这些编写在一起,除了“找到我所在的封闭类的名称(特别是如果类是嵌套的)。

    我知道ctags。我知道cscope。我选择不使用它们 - 我更喜欢解决方案,我知道它们在哪里断裂。

1 个答案:

答案 0 :(得分:4)

粗略地做起来相对容易,很难做得很好。 C和C ++是相当复杂的语言,可以可靠地解析。冒被贬低的风险,我个人建议解析由ctags生成的标签文件,如果你真的想在Vim中做,那么“粗略”方法有一些选项

  1. 做出一些假设。你做出的假设取决于你想要的复杂程度。在最简单的层面:假设你在一个类定义中并且没有其他附近的括号。假设您的编码风格,假定类定义的左括号与“class”在同一行。

    let classlineRE = '^class\s\+\(\k\+\)\s\+{.*'
    let match = search(classlineRE, 'bnW')
    if match != 0
        let classline = getline(match)
        let classname = substitute(classline, classlineRE, '\1', '')
        " Now do something with classname
    endif
    

    假设模型显然可以根据您的需要进行扩展/推广。您可以只搜索大括号,然后搜索类并获取其间的内容(将单独行上的大括号处理为“class”)。您可以过滤掉评论。如果你想变得非常聪明,你可以开始查看你所处的支撑级别,并确保它是顶级的(转到文件的开头,每次看到'{'并减去一个时加1)每当你看到'}'等等。你的vim脚本会变得非常复杂。

  2. 另一个冒着downvote的风险,你可以使用python编写的各种C解析器之一,并使用vim-python接口使其像vim脚本一样运行。说实话,如果你想这样做,我会坚持使用ctags / cscope。

  3. 使用rainbow.vim。这会根据缩进的深度进行突出显示,因此您可以稍微聪明一点并回顾(使用search('{', 'bW')或类似)来打开大括号,然后查询这些大括号的语法高亮(使用synIDattr(synID(line("."), col("."),1), "name"))和如果它是hlLevel0,你知道它是顶级支撑。然后,您可以按照项目1搜索课程并进行解析。

  4. 我希望以上所有内容都能让您有所思考......