C 代码中的我的标签列表:
标签列表元素(域):
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 中的变化导致另一个集合的变化?
最佳答案
我强烈怀疑你能做到这一点。 taglist 插件使用 ctags 来收集代码中的符号,并在横向拆分中显示它们。横向拆分包含只读信息(如果您尝试在该窗口上工作,vim 会告诉您该缓冲区的可修改关闭)。
您想要实现的目标意味着对您正在修改的源代码进行相当复杂的解析。即使像自动重命名这样的简单任务(假设您修改 taglist 缓冲区中的函数名称条目并且源中的所有实例都已更新)也需要非常复杂的解析,这超出了 ctags 功能或 taglist 本身。使用双射关系删除和保持所有内容同步甚至更加复杂。假设您有一个 printf 行,您在其中使用要删除的宏。那条线应该怎么办?如果整行消失,或者只是宏消失(在这种情况下,该行可能在语法上不正确。
taglist 是一个很好的浏览代码的插件,但它不适合自动重构(这是你想要实现的)。
编辑:至于计算复杂度,好吧,最坏的情况是您必须在每次击键时搜索整个文档,寻找可以集成的新标签,因此从这个意义上说,您可以说它是 O(n)在每次击键时。这当然是矫枉过正,也是最糟糕的实现方法。我不知道 vim 中语法高亮的计算复杂性,(这对于提取标签也很有用,通过适当的标记化),但我估计它非常低,并且解析的数据量非常有限(你不太可能有大型构造来解析以提取 token 并了解其上下文)。无论如何,这不是 taglist 的工作方式。 Taglist 在每次 vim 调用时运行 ctags,它不会在您键入时实时解析文档。然而,这是由 Eclipse、XCode 和 KDevelop 完成的,例如,它们也提供用于自动或半自动重构的工具,并最终可以将 vim 集成为一个编辑器。如果您需要这些功能,那么您肯定使用了错误的工具。
关于math - VIM:VIM Taglist 元素和代码片段之间的双射?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/735043/