我正在使用vim 7.x
我正在使用备用文件。
我有* .hpp< - >的映射*的.cpp
假设我在
class Foo {
void some_me#mber_func(); // # = my cursor
}
在Foo.hpp中
有没有办法告诉vim执行以下操作:
基本上,我可以将所有这些编写在一起,除了“找到我所在的封闭类的名称(特别是如果类是嵌套的)。
我知道ctags。我知道cscope。我选择不使用它们 - 我更喜欢解决方案,我知道它们在哪里断裂。
答案 0 :(得分:4)
粗略地做起来相对容易,很难做得很好。 C和C ++是相当复杂的语言,可以可靠地解析。冒被贬低的风险,我个人建议解析由ctags生成的标签文件,但如果你真的想在Vim中做,那么“粗略”方法有一些选项
做出一些假设。你做出的假设取决于你想要的复杂程度。在最简单的层面:假设你在一个类定义中并且没有其他附近的括号。假设您的编码风格,假定类定义的左括号与“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脚本会变得非常复杂。
另一个冒着downvote的风险,你可以使用python编写的各种C解析器之一,并使用vim-python接口使其像vim脚本一样运行。说实话,如果你想这样做,我会坚持使用ctags / cscope。
使用rainbow.vim。这会根据缩进的深度进行突出显示,因此您可以稍微聪明一点并回顾(使用search('{', 'bW')
或类似)来打开大括号,然后查询这些大括号的语法高亮(使用synIDattr(synID(line("."), col("."),1), "name")
)和如果它是hlLevel0
,你知道它是顶级支撑。然后,您可以按照项目1搜索课程并进行解析。
我希望以上所有内容都能让您有所思考......