4

我在 C 代码中的标记列表:


|| 最小长度
|| 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 的变化导致另一组的变化?

4

1 回答 1

3

我强烈怀疑你能做到这一点。taglist 插件使用 ctags 来收集代码中的符号并在横向拆分中显示它们。横向拆分包含只读信息(如果您尝试在该窗口上工作,vim 会告诉您该缓冲区的可修改已关闭)。

您想要实现的目标意味着对您正在修改的源代码进行相当复杂的解析。即使是像自动重命名这样的简单任务(假设您修改了 taglist 缓冲区中的函数名称条目并且源中的所有实例都已更新)需要非常复杂的解析,这超出了 ctags 功能或 taglist 本身。删除并保持与双射关系同步的所有内容更加复杂。假设您有一个 printf 行,您在其中使用了要删除的宏。那条线应该怎么办?如果整行消失,或者只是宏(在这种情况下,该行可能在语法上不正确。

taglist 是一个很好的浏览代码的插件,但它不适合自动重构(这是你想要实现的)。

编辑:至于计算复杂度,最坏的情况是你必须在每次击键时检查整个文档,寻找可以集成的新标签,所以从这个意义上说,你可以说它是 O(n)在每次击键时。这当然是矫枉过正,也是最糟糕的实现方法。我不知道 vim 中语法高亮的计算复杂性(这对于提取标签也很有用,通过适当的标记化),但我估计它非常低,并且解析的数据量非常有限(你不太可能有大型构造来解析以提取令牌并理解其上下文)。无论如何,这不是 taglist 的工作方式。Taglist 在每次 vim 调用时运行 ctags,它不会在您键入时实时解析文档。然而,这是由 Eclipse 完成的,例如 XCode 和 KDevelop,它们也提供了自动或半自动重构的工具,并且最终可以将 vim 集成为编辑器。如果您需要这些功能,那么您肯定使用了错误的工具。

于 2009-07-23T17:58:14.190 回答