C代码中的我的Taglist:
宏
( MIN_LEN )
( MAX_ITERATIONS )
\x{e76f}\x{e76f}
X.细胞
( source_cell )
X-变量
len_given
Taglist元素(域):
A = {MIN_LEN, MAX_ITERATIONS, cell, source_cell, len_given}代码段(共域):
B = {"code_MIN_LEN", "code_MAX_ITERATIONS", ..., "code_len_given"}目标:在集合A和B之间有双射。
示例:我希望通过移除A或B中的元素从A和B中移除A中的任何元素,如MIN_LEN。
问题:是否有一种方法可以保证A和B之间的双射,从而使A或B中的变化导致另一组的变化?
发布于 2009-07-23 17:58:14
我强烈怀疑你能做到这一点。taglist插件使用ctag来收集代码中的符号,并以横向分割方式显示它们。横向拆分包含只读信息(如果您试图使用该窗口,vim告诉您,可修改的缓冲区为off )。
您想要实现的内容将意味着对您正在修改的源代码进行相当复杂的解析。即使是像自动重命名这样的简单任务(假设您修改了taglist缓冲区中的一个函数名条目,并且您的源代码中的所有实例都被更新了),也需要非常复杂的解析,这超出了ctag特性或taglist本身。删除和保持与双射关系同步的一切甚至更复杂。假设您有一个printf行,其中使用要删除的宏。那条线该怎么办?如果整行消失,或者仅仅是宏(在这种情况下,这行可能在语法上是不正确的)。
taglist是一个很好的插件,可以浏览你的代码,但是它不适合自动重构(这就是你想要实现的)。
编辑:至于计算的复杂性,嗯,最坏的情况是,你必须在每次击键时搜索整个文档,寻找新出现的可以集成的标签,所以在这个意义上,你可以在每次击键时说它是O(n)。这当然是过火的,也是实现它的最糟糕的方法。我不知道vim中语法突出显示的计算复杂性(这对于通过适当的标记化提取标记也很有用),但我估计它非常低,并且解析的数据量非常有限(您不太可能有大型的构造来解析令牌并理解其上下文)。无论如何,这不是taglist的工作方式。Taglist在每次vim调用时运行ctag,它不会在您键入时实时解析文档。但是,这是由Eclipse、XCode和KDevelop完成的,它们还提供了自动或半自动重构的工具,并最终可以将vim集成为编辑器。如果您需要这些功能,那么您肯定使用了错误的工具。
https://stackoverflow.com/questions/735043
复制相似问题