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